diff --git a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java index 995017446c..31d3760c90 100644 --- a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java +++ b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ElevationInfo.java @@ -27,6 +27,21 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Scanner; +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/07/2013   DR15495    zwang       Load elevation info for SSSS radars                                 
+ * 
+ * 
+ * + * @author dfriedman + * @version 1.0 + */ public class ElevationInfo { // TODO: check all handling of -1/null vcp @@ -90,6 +105,15 @@ public class ElevationInfo { fs.close(); } + // Load SSSS radar elevation lists + s = ElevationInfo.class.getResourceAsStream("ssssElevationLists.txt"); + fs = new Scanner(s); + try { + Loader.loadSsssElevationInfo(fs, staticInfo); + } finally { + fs.close(); + } + s = ElevationInfo.class.getResourceAsStream("tdwrElevations.txt"); fs = new Scanner(s); try { diff --git a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/Loader.java b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/Loader.java index ab3952e2a4..f8cd82aae3 100644 --- a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/Loader.java +++ b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/Loader.java @@ -39,6 +39,21 @@ import com.raytheon.rcm.products.ElevationInfo.VCPInfo; import com.raytheon.rcm.products.RadarProduct.Format; import com.raytheon.rcm.products.RadarProduct.Param; +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/07/2013   DR15495    zwang       Load elevation info for SSSS radars                                 
+ * 
+ * 
+ * + * @author dfriedman + * @version 1.0 + */ public class Loader { static List loadRadarInfoData(Scanner fs) { @@ -216,6 +231,43 @@ public class Loader { } } + public static void loadSsssElevationInfo(Scanner fs, + HashMap staticInfo) { + Pattern p = Pattern.compile("^k*VCP(\\d+)$"); + while (fs.hasNext()) { + String line = fs.nextLine(); + Scanner ls = new Scanner(line); + if (skipComments(ls)) + continue; + try { + String radarID = ls.next(); + String id = ls.next(); + int vcp = 0; + ls.next(); // Unused op mode + int nElevs = ls.nextInt(); + int[] elevs = new int[nElevs]; + for (int i = 0; i < elevs.length; ++i) + elevs[i] = (int) (ls.nextDouble() * 10.0); + + Matcher m = p.matcher(id); + if (m.matches()) + vcp = Integer.parseInt(m.group(1)); + else if (id.equals("OTR")) + vcp = ElevationInfo.OTR_OR_RMR_CODE; + else + /* RMR is the same as OTR. We do not care about the TDWR + * entries, we will use the radar-specific one. Actually, + * we shouldn't bother with VCP80 and VCP90 either (TODO: ?) + */ + continue; + Sel sel = new Sel(radarID, vcp); + staticInfo.put(sel, elevs); + } catch (NoSuchElementException e) { + // TODO: + } + } + } + public static void loadTdwrElevationInfo(Scanner fs, HashMap staticInfo) { ArrayList elevs = new ArrayList(25); diff --git a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/radarInfo.txt b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/radarInfo.txt index 103afdfe13..b2f5dcfb31 100644 --- a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/radarInfo.txt +++ b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/radarInfo.txt @@ -123,6 +123,7 @@ 136|256 | 0 | 4.0 | 0 | SO | SuperOb (SO) | SuperOb | | | | | | | | | |82 137| 16 | 9 | 1.0 | 230 | ULR | User Selectable Lyr Refl (ULR)| Radial | | | | | | | | | |88 139| 0 | 0 | 0.0 | 230 | MRU | Rapid Update Mesocyclone (MRU)| Graphic | y | | | | | | | | |91 +140| 0 | 0 | 0.0 | 230 | GFM | Gust Front MIGFA (GFM) | Generic | | | | | | | | | |28 141| 0 | 0 | 0.0 | 230 | MD | Mesocyclone (MD) | Graphic | | | | | | | | | |92 143| 0 | 0 | 0.0 | 230 | TRU | TVS Rapid Update (TRU) | Graphic | y | | | | | | | | |93 149| 0 | 0 | 0.0 | 230 | DMD | Digital Meso Detection (DMD) | Generic | y | | | | | | | | |94 diff --git a/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ssssElevationLists.txt b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ssssElevationLists.txt new file mode 100644 index 0000000000..2d959cc0c0 --- /dev/null +++ b/RadarServer/com.raytheon.rcm.lib/src/com/raytheon/rcm/products/ssssElevationLists.txt @@ -0,0 +1,28 @@ +#This file stores elevation lists for SSSS radars +#This file stores the elevation angle lists for the OTR, RPS and RMR. +# +#The format is, +#radarID, List-Name type number-of-values value1 value2... valueN +#radarID: klgx is the only radar for now +#List-Name: Name for a angle set. It can be OTR, RMR or VCPxx. +#type: Type of the list. for VCP is the storm or clear-air. For the OTR and +# RMR is none. +#number-of-values: How many angles is in this list. +#valuen: A elevation angle value. +# +#Keep one list one line! +# klgx +#For the OTR of WSR-88D +klgx OTR none 40 0.2 0.5 0.9 1.3 1.5 1.8 2.1 2.4 2.5 2.9 3.1 3.4 3.5 3.8 4.0 4.3 4.5 4.8 5.1 5.3 6.0 6.1 6.2 6.4 7.5 7.7 8.0 8.7 9.7 9.9 10.0 12.0 12.2 12.5 14.0 14.6 15.5 15.6 16.7 19.5 +#For RMR of WSR-88D +klgx RMR none 40 0.2 0.5 0.9 1.3 1.5 1.8 2.1 2.4 2.5 2.9 3.1 3.4 3.5 3.8 4.0 4.3 4.5 4.8 5.1 5.3 6.0 6.1 6.2 6.4 7.5 7.7 8.0 8.7 9.7 9.9 10.0 12.0 12.2 12.5 14.0 14.6 15.5 15.6 16.7 19.5 +#For RPS of WSR-88D +klgx VCP11 storm 15 0.2 0.5 1.5 2.4 3.4 4.3 5.3 6.2 7.5 8.7 10.0 12.0 14.0 16.7 19.5 +klgx VCP12 storm 15 0.2 0.5 0.9 1.3 1.8 2.4 3.1 4.0 5.1 6.4 8.0 10.0 12.5 15.6 19.5 +klgx VCP21 storm 10 0.2 0.5 1.5 2.4 3.4 4.3 6.0 9.9 14.6 19.5 +klgx VCP121 storm 10 0.2 0.5 1.5 2.4 3.4 4.3 6.0 9.9 14.6 19.5 +klgx VCP211 storm 15 0.2 0.5 1.5 2.4 3.4 4.3 5.3 6.2 7.5 8.7 10.0 12.0 14.0 16.7 19.5 +klgx VCP212 storm 15 0.2 0.5 0.9 1.3 1.8 2.4 3.1 4.0 5.1 6.4 8.0 10.0 12.5 15.6 19.5 +klgx VCP221 storm 10 0.2 0.5 1.5 2.4 3.4 4.3 6.0 9.9 14.6 19.5 +klgx VCP31 clear-air 6 0.2 0.5 1.5 2.5 3.5 4.5 +klgx VCP32 clear-air 6 0.2 0.5 1.5 2.5 3.5 4.5 diff --git a/cave/build/static/common/cave/etc/aviation/python/CCFPMonitor.py b/cave/build/static/common/cave/etc/aviation/python/CCFPMonitor.py index 7337190d73..dcdc42b0cb 100644 --- a/cave/build/static/common/cave/etc/aviation/python/CCFPMonitor.py +++ b/cave/build/static/common/cave/etc/aviation/python/CCFPMonitor.py @@ -59,7 +59,7 @@ # Relationship Type: In Response to # Status: TEST # Title: AvnFPS: tpo indicator not monitoring properly -# +# # import logging, time import Avn, AvnLib, Globals, MonitorP diff --git a/cave/build/static/common/cave/etc/colormaps/solar/Blue.cmap b/cave/build/static/common/cave/etc/colormaps/solar/Blue.cmap new file mode 100644 index 0000000000..031fd3c574 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/Blue.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/Gray.cmap b/cave/build/static/common/cave/etc/colormaps/solar/Gray.cmap new file mode 100644 index 0000000000..f8b759c86f --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/Gray.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/Green.cmap b/cave/build/static/common/cave/etc/colormaps/solar/Green.cmap new file mode 100644 index 0000000000..7bcdadcb95 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/Green.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/Orange.cmap b/cave/build/static/common/cave/etc/colormaps/solar/Orange.cmap new file mode 100644 index 0000000000..996a09e378 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/Orange.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_131.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_131.cmap new file mode 100644 index 0000000000..aa8f673b09 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_131.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1600.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1600.cmap new file mode 100644 index 0000000000..a9afc963d8 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1600.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1700.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1700.cmap new file mode 100644 index 0000000000..9beac7cc9e --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_1700.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_171.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_171.cmap new file mode 100644 index 0000000000..04e3285e8f --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_171.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_193.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_193.cmap new file mode 100644 index 0000000000..15b198380a --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_193.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_211.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_211.cmap new file mode 100644 index 0000000000..3ad4f95928 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_211.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_304.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_304.cmap new file mode 100644 index 0000000000..a082d39753 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_304.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_335.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_335.cmap new file mode 100644 index 0000000000..d7dcba2e3b --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_335.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_4500.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_4500.cmap new file mode 100644 index 0000000000..2b98bca045 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_4500.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_94.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_94.cmap new file mode 100644 index 0000000000..f51a815e60 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_AIA_94.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SDO_Thematic.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SDO_Thematic.cmap new file mode 100644 index 0000000000..eda4e65399 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SDO_Thematic.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_171.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_171.cmap new file mode 100644 index 0000000000..6545547496 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_171.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_195.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_195.cmap new file mode 100644 index 0000000000..75eef587f7 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_195.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_284.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_284.cmap new file mode 100644 index 0000000000..2645be0878 --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_284.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_304.cmap b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_304.cmap new file mode 100644 index 0000000000..8ab0dc8cbe --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/SOHO_EIT_304.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/colormaps/solar/Yellow.cmap b/cave/build/static/common/cave/etc/colormaps/solar/Yellow.cmap new file mode 100644 index 0000000000..c333a25cde --- /dev/null +++ b/cave/build/static/common/cave/etc/colormaps/solar/Yellow.cmap @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/build/static/common/cave/etc/gfe/userPython/procedures/TCMWindTool.py b/cave/build/static/common/cave/etc/gfe/userPython/procedures/TCMWindTool.py index 504da304cf..4672b7593c 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/procedures/TCMWindTool.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/procedures/TCMWindTool.py @@ -31,6 +31,11 @@ # Author: Tom LeFebvre # Contributor: Pablo Santos # ---------------------------------------------------------------------------- +# SOFTWARE HISTORY +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 3/6/2013 15658 ryu Merge in change from AWIPS I DR 21414, which fixed +# makeMaxWindGrid() for when center is outside domain. # The MenuItems list defines the GFE menu item(s) under which the # Procedure is to appear. @@ -1336,52 +1341,16 @@ class Procedure (SmartScript.SmartScript): startTime = interpFcstList[0]["validTime"] endTime = startTime + (123 * 3600) # 123 hours later - fcstIndex = 0 - while fcstIndex < len(interpFcstList)-1: - f1 = interpFcstList[fcstIndex] - f2 = interpFcstList[fcstIndex + 1] - - f1Time = interpFcstList[fcstIndex]['validTime'] - f2Time = interpFcstList[fcstIndex + 1]['validTime'] - - print "Interpolating from:", time.asctime(time.gmtime(f1Time)), \ - "to", time.asctime(time.gmtime(f2Time)) - - lat1, lon1 = f1['centerLocation'] - lat2, lon2 = f2['centerLocation'] - - x1, y1 = self.getGridCell(lat1, lon1) - x2, y2 = self.getGridCell(lat2, lon2) - - if x1 is None or y1 is None or x2 is None or y2 is None: - fcstIndex += 1 - continue - - dx = abs(x2 - x1) - dy = abs(y2 - y1) - - dmax = max(dx, dy) - - newInterval = float(interval) / dmax - - newFcstList = self.interpolateWindFcst(f1, f2, newInterval) - - print "Created", len(newFcstList), "new wind forecasts." - - for f in newFcstList: - mag, dir = self.makeRankine(f, latGrid, lonGrid, pieSlices, radiiFactor) - - maxWindGrid = where(greater(mag, maxWindGrid), mag, maxWindGrid) - - fcstIndex += 1 - - if f2["validTime"] >= endTime: - break start = AbsTime.AbsTime(startTime) end = AbsTime.AbsTime(endTime) timeRange = TimeRange.TimeRange(start, end) + # Used getGrids to calculate the maximum wind grid. + # + # Fetch the max of the wind grids just generated as this is very fast. + maxWindGrid, maxDirGrid = self.getGrids("Fcst", "Wind", "SFC", timeRange, mode="Max") + maxWindGrid = self.smoothGrid(maxWindGrid, 3) self.createGrid("Fcst", "TCMMaxWindComposite", "SCALAR", maxWindGrid, timeRange, @@ -1485,7 +1454,7 @@ class Procedure (SmartScript.SmartScript): # # Use this method to fetch a product from the text database if productID == "preTCM": - textProduct = self.getTextProductFromFile("/tmp/Irene.txt") + textProduct = self.getTextProductFromFile("/tmp/Isaac.txt") decoder = TCMDecoder() decoder.decodeTCMProduct(textProduct, self.dialogEyeDiameter) fcstList = decoder.getFcstList() @@ -1588,14 +1557,6 @@ class Procedure (SmartScript.SmartScript): # get the lat, lon grids latGrid, lonGrid = self.getLatLonGrids() - # interpolate through forecast period to very high resolution and make - # a composite maxWind grid from those wind grids - if maxwindswath is "Yes": - t1 = time.time() - self.makeMaxWindGrid(interpFcstList, interval, latGrid, lonGrid, pieSlices, - radiiFactor) - print time.time() - t1, "seconds to generate Max wind composite." - # make a grid for each interpolate forecast gridCount = 0 for f in interpFcstList: @@ -1621,6 +1582,14 @@ class Procedure (SmartScript.SmartScript): print "TCMWindTool:", productID, "- Generated",gridCount, \ "out of", len(interpFcstList), "grids", time.asctime(time.gmtime(timeRange.startTime().unixTime())) + # interpolate through forecast period to very high resolution and make + # a composite maxWind grid from those wind grids + if maxwindswath is "Yes": + t1 = time.time() + self.makeMaxWindGrid(interpFcstList, interval, latGrid, lonGrid, pieSlices, + radiiFactor) + print time.time() - t1, "seconds to generate Max wind composite." + if msg != "": self.statusBarMsg(msg, "S") diff --git a/cave/build/static/common/cave/etc/gfe/userPython/utilities/ProductParser.py b/cave/build/static/common/cave/etc/gfe/userPython/utilities/ProductParser.py index 0cea29c727..d15deaa24a 100644 --- a/cave/build/static/common/cave/etc/gfe/userPython/utilities/ProductParser.py +++ b/cave/build/static/common/cave/etc/gfe/userPython/utilities/ProductParser.py @@ -2,19 +2,19 @@ ## # This software was developed and / or modified by Raytheon Company, # pursuant to Contract DG133W-05-CQ-1067 with the US Government. -# +# # U.S. EXPORT CONTROLLED TECHNICAL DATA # This software product contains export-restricted data whose # export/transfer/disclosure is restricted by U.S. law. Dissemination # to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. -# +# # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 -# +# # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## @@ -119,7 +119,7 @@ nnn = r'(?:[A-Z]{2}[ZC])?\d{3}' purge = r'(?P\d{6})-' ugc = r'\n(?P' + r'[A-Z]{2}[Z|C](?:(?:\d{3})|(?:ALL))' + r'(?:[->]\n?' + nnn + \ r')*-\n?' + purge + el + r')' -cityh = r'-\n(?P(?:\s*\n)*(?:INCLUDING THE (?:CITIES|CITY) OF...)?)' +cityh = r'(?<=-\n(?!.*-\n))(?P(?:.*\n))' body = r'(?P(?:^.*\n)*?)' #body = r'.*' @@ -192,20 +192,20 @@ class ProductParser: #l = headline_re.finditer(str) l = single_head_re.finditer(str) for m in l: - if m is not None: + if m is not None: #print 'phl m = ', m newstart = start + m.start() m = headline_re.match(m.group(0)) if m is not None: hdlns.append(self.dumpMatch(m, newstart)) - + #print 'hdlns = ', hdlns rval['headInfo'] = hdlns def dumpMatch(self, m, offset=0, rval=None): if rval is None: rval = {} - + #print 'dumpmatch m = ', m.groupdict() for k in m.groupdict().keys(): if m.start(k) != -1 and m.start(k) != m.end(k): @@ -234,7 +234,7 @@ class ProductParser: segs = [] l = ugch_re.finditer(self._str) - + for m in l: if m is not None: m1 = cityh_re.search(self._str, m.end()) @@ -250,7 +250,7 @@ class ProductParser: else: continue m4 = head_re.search(self._str, m.end(), m3.end()) - + d = self.dumpMatch(m) d = self.dumpMatch(m2, rval=d) d = self.dumpMatch(m3, rval=d) @@ -266,7 +266,7 @@ class ProductParser: else: d['city'] = (self.tkc(m2.start()), self.tkc(m2.start())) - + if m4 is not None: #print 'm4 = ', m4.group() d = self.dumpMatch(m4, rval=d) @@ -284,7 +284,7 @@ class ProductParser: rval['frames'] = frames return rval - + def parseFromJava(self, text): self._str = text self._ci = None @@ -295,13 +295,13 @@ class ProductParser: lc.append(count) count += l self._totals = lc - + #print 'text START ----------------------' #print text #print 'text END ------------------------' - + result = self.parse() - + #print 'result = ', result - + return JUtil.pyDictToJavaMap(result) diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_al.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_al.attr index b42d0485f2..eabbcb81ec 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_al.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_al.attr @@ -17,7 +17,7 @@ FINT = .01;.1;.25;.5;.75;1;1.25;1.5;1.75;2;2.25;2.5;2.75;3;3.25;3.5;3.75;4 FLINE = 0;21-30;14-20;5 HILO = 31;0/x#2////y HLSYM = 1.5 -!CLRBAR= 1 +!CLRBAR = 1 WIND = 0 TITLE = 1/-1/~ 24-HR OBS PRECIP (RFC, 40km avg) !0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_spc_al.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_spc_al.attr index 0699452f56..b2a012d72d 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_spc_al.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/24-hr_obs_pcpn_spc_al.attr @@ -17,7 +17,7 @@ FINT = .01;.10;.25;.5;1;1.5;2;2.5;3;3.5;4;4.5;5;6;8;10.0 FLINE = 0;11;18;8;6;25;21;22;7;30;4;24;20;17;15;14;31 HILO = 0 HLSYM = 0 -!CLRBAR= 1//CL/0;.5/.75;.01 +!CLRBAR = 1//CL/0;.5/.75;.01 WIND = TITLE = 1/-1/COOPERATIVE RAINFALL REPORTS FOR 24 hrs ENDING 12 UTC: ~ COLORS = diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_h2o_transport_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_h2o_transport_nam.attr index 546475c7b9..e7ec607a54 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_h2o_transport_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_h2o_transport_nam.attr @@ -22,7 +22,7 @@ FINT = 6;12;18;24;30;36 FLINE = 0;23;22;21;14;15;2 HILO = 0 !5/H#;L#!0 HLSYM = 0 !1;1//22;22/2;2/hw!0 -!CLRBAR= 1/V/LL!0 +!CLRBAR = 1/V/LL!0 WIND = 16/0.9/2/211/0.5 TITLE = 1/-1/~ @ MOISTURE TRANSPORT, HGHT, BL THTAE!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_wind_pw_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_wind_pw_ncf_nam.attr index dd271a577d..70e6cee265 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_wind_pw_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/850mb_wind_pw_ncf_nam.attr @@ -18,7 +18,7 @@ FINT = FLINE = HILO = 0 HLSYM = 0 -!CLRBAR= 0 +!CLRBAR = 0 WIND = 9/0.9/2/112 TITLE = 1/-1/~ 850mb WIND (KTS) and PRECIP WATER COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA212-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA212-standard.xml new file mode 100644 index 0000000000..ac3448e7e4 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA212-standard.xml @@ -0,0 +1,6 @@ + + + ETA212 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA218-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA218-standard.xml new file mode 100644 index 0000000000..3033633970 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ETA218-standard.xml @@ -0,0 +1,6 @@ + + + ETA218 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/GFS212-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/GFS212-standard.xml new file mode 100644 index 0000000000..c65ca5b07f --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/GFS212-standard.xml @@ -0,0 +1,6 @@ + + + GFS212 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC130-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC130-standard.xml new file mode 100644 index 0000000000..73229772be --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC130-standard.xml @@ -0,0 +1,6 @@ + + + RUC130 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC236-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC236-standard.xml new file mode 100644 index 0000000000..59be806285 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/RUC236-standard.xml @@ -0,0 +1,6 @@ + + + RUC236 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/SREF212-standard.xml b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/SREF212-standard.xml new file mode 100644 index 0000000000..93edbc974d --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/SREF212-standard.xml @@ -0,0 +1,6 @@ + + + SREF212 + standard + 1000-500_thkn,1000-850_thkn,1000mb_hght_tmp_wind,200mb_div_isotachs,200mb_hght_wind,250mb_ageo_div_isotachs,250mb_hght_wind,250mb_wind_and_rel_vort,300mb_div_isotachs,500mb_hght_absv,500mb_hght_absv_adv,500mb_hght_absv_wind,500mb_hght_color,500mb_hght_geoabsv,500mb_hght_wind,500mb_hght_tmp_wind,700mb_hght_rh_omega,700mb_hght_tmp_wind,850-700_thkn,850mb_hght_tmp_wind,pmsl,pmsl_thkn,pmsl_and_bl_wind_global,300-200mb_pv,400-200mb_pv,400-250mb_pv_global,500-250mb_pv,500-300mb_pv + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_nam.attr index 300557f096..0648c61eb1 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_nam.attr @@ -19,7 +19,7 @@ FINT = 1000;2000;3000;4000;5000 FLINE = 0;23;30;15;2;5 HILO = 0!0 HLSYM = 1;1//22;22/2;2/hw -!CLRBAR= 1/V/LL!0 +!CLRBAR = 1/V/LL!0 WIND = 0 TITLE = 1/-1/~ 0-180 MB AGL BEST CAPE (jkg-1) & CIN (cyan)!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_ncf_nam.attr index 47be90b0d6..6127c7ab79 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bestcape_cin_ncf_nam.attr @@ -19,7 +19,7 @@ FINT = 0 FLINE = 0 HILO = 0!0 HLSYM = 0 -!CLRBAR= 0 +!CLRBAR = 0 WIND = 0 TITLE = 1/-1/~ BEST CAPE (0-180 MB AGL)(jkg-1) & CIN (cyan)!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_nam.attr index f32edecc58..a2ade5506d 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_nam.attr @@ -20,7 +20,7 @@ FINT = -9;-7;-5;-3;-1 FLINE = 2;15;21;22;23;0 HILO = !!!!6/H#;L#/1020-1070;900-1016 HLSYM = 1;1/2//4;1.5/0 -!CLRBAR= 1 +!CLRBAR = 1 WIND = 10/0.75/1.5/112 TITLE = 1/-1/~ BL (18MB AGL)MOISTURE CONVERGENCE, WIND (KTS) and THTAE!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_ncf_nam.attr index 10b4d59247..cc5c0ff048 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_h2o_conv_ncf_nam.attr @@ -19,7 +19,7 @@ FINT = 0 FLINE = 0 HILO = 0 HLSYM = 0 -!CLRBAR= 1 +!CLRBAR = 1 WIND = 10/0.75/1.5/112 TITLE = 1/-1/~ BL (18MB AGL) MOIST CONV, WIND (KTS) and THTAE!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_cmc.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_cmc.attr index 74ddcee305..9f19cc2152 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_cmc.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_cmc.attr @@ -17,7 +17,7 @@ FINT = FLINE = HILO = 0 HLSYM = 0 -!CLRBAR= 1/V/LL +!CLRBAR = 1/V/LL WIND = TITLE = 1/-1/~ BL THTE!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_nam.attr index 3bedab10c5..11ae503949 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/bl_thte_ncf_nam.attr @@ -17,7 +17,7 @@ FINT = 0 FLINE = 0 HILO = 0 HLSYM = 0 -!CLRBAR= 1 +!CLRBAR = 1 WIND = TITLE = 1/-1/~ BL (18MB AGL) THTAE!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/marine_fronts_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/marine_fronts_nam.attr index 19678e8f3a..056f3bc65a 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/marine_fronts_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/marine_fronts_nam.attr @@ -17,7 +17,7 @@ FINT = -9;-7;-5;-3;-1 ! FLINE = 2;15;21;22;23;0 ! HILO = HLSYM = -!CLRBAR= 1 +!CLRBAR = 1 WIND = 9/0.7/1.5/112 TITLE = 1/-1/~ 1000-850mb THK, BL MOISTURE CONVERGENCE & WIND = (KT)!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pcpn_potential_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pcpn_potential_ncf_nam.attr index a44fbbb2a1..941fbdc23d 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pcpn_potential_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pcpn_potential_ncf_nam.attr @@ -18,7 +18,7 @@ FINT = FLINE = HILO = 0 HLSYM = 0 -!CLRBAR= 1 +!CLRBAR = 1 WIND = TITLE = 1/-2/~ PCPN POTENTIAL (PW X (1000-470 MB RH)) INCHES OF PW!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850_thk_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850_thk_nam.attr index 5259aad4d3..c4ea3e4454 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850_thk_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850_thk_nam.attr @@ -19,7 +19,7 @@ FINT = FLINE = HILO = !26;2/H#;L#/1020-1070;900-1012/3/30;30/y HLSYM = 2;1.5//21//hw -!CLRBAR= 1 +!CLRBAR = 1 WIND = 9/0.7/2/112 TITLE = 1/-1/~ PMSL, 1000-850mb THKN & BL (0-30 MB AGL) WIND (KTS)!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850thk_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850thk_nam.attr index d439a29384..f106140b21 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850thk_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_1000-850thk_nam.attr @@ -17,7 +17,7 @@ FINT = FLINE = HILO = !26;2/H#;L#/1020-1070;900-1012/3/30;30/y HLSYM = 1;1//22;22/1.4;1.4/hw -!CLRBAR= 1 +!CLRBAR = 1 WIND = TITLE = 1/-1/~ PMSL, 1000-850mb THKN !0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_only_nogaps.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_only_nogaps.attr index 69c47ebd18..1c7f333bd4 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_only_nogaps.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_only_nogaps.attr @@ -11,7 +11,7 @@ FINT = FLINE = HILO = 26;2/H#;L#/1020-1070;900-1012 HLSYM = 1;1//22;22/1.4;1.4/hw -!CLRBAR= 0 +!CLRBAR = 0 WIND = TITLE = 1/-1/~ PMSL COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_thkn_wind_mono_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_thkn_wind_mono_nam.attr index 663470829c..e19c13c445 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_thkn_wind_mono_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/pmsl_thkn_wind_mono_nam.attr @@ -18,7 +18,7 @@ FINT = FLINE = HILO = !! 23;23/H#;L#/1018-1070;900-1012//30;30/y HLSYM = 2;1.5//21//hw -!CLRBAR= 1 +!CLRBAR = 1 WIND = 23/0.8/1/112 TITLE = 23/-1/~ PMSL, 1000-500 MB THICKNESS, BL WIND =!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/precip_type_vv_ncf_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/precip_type_vv_ncf_nam.attr index 9c6a51e1c5..06f45ee336 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/precip_type_vv_ncf_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/precip_type_vv_ncf_nam.attr @@ -18,7 +18,7 @@ FINT = 50;200!50;200!50;200!50;200 FLINE = 0;23;23!0;25;25!0;30;30!0;15;15 HILO = 0 HLSYM = 0 -!CLRBAR= 1/V/LL!0 +!CLRBAR = 1/V/LL!0 WIND = 9/0.7/2/112 TITLE = 1/-1/~ Precip Type, 1000-470 MB RH & 700-500 MB Vertical Velocity!0 COLORS = 2 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ransnocsi_500-850.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ransnocsi_500-850.attr index e1ffea18ca..8ab03d4191 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ransnocsi_500-850.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/ransnocsi_500-850.attr @@ -7,7 +7,7 @@ ! GLEVEL = 850:700!700!700!850!850!30:0!30:0!850:500 GVCORD = PRES!PRES!PRES!PRES!PRES!pdly!pdly!PRES -SKIP = +SKIP= FILTER=y SCALE = 0!0!0!0!0!0!0!6 GDPFUN = lav(relh)!tmpc!tmpc!tmpc!tmpc!tmpc!tmpc!sm9s(pvor(thte,wnd)) @@ -18,6 +18,6 @@ FINT = 70;80;90 FLINE = 0;24;23;22 HILO = HLSYM = -!CLRBAR = 1 +!CLRBAR= 1 WIND = TITLE = 1/-2/~ 850-700 RH,T(BL y,850 r,700 cyan),850-500 EPV|~ 850-700 RH, R/S T, EPV!0 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_feet.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_feet.attr index a496b4f80d..f23db375f7 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_feet.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_feet.attr @@ -6,7 +6,7 @@ ! T. Piper/GSC 5/99 Added -1 line position for TITLE = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! nww3 ! gfs +GDFILE = nww3 ! nww3 ! gfs GLEVEL = 0 GVCORD = none SKIP = 0 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_meters.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_meters.attr index 3b8e5bcd3d..efdb8ef792 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_meters.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_and_mslp_meters.attr @@ -6,7 +6,7 @@ ! T. Piper/GSC 5/99 Added -1 line position for TITLE = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! nww3 ! gfs +GDFILE = nww3 ! nww3 ! gfs GLEVEL = 0 GVCORD = none SKIP = 0 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet.attr index a0aac8f2d6..a7666239e6 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet.attr @@ -7,7 +7,7 @@ ! J.L.Partain/MPC 5/01 Set filter=n and added SKIP = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! gfs ! gfs +GDFILE = nww3 ! gfs ! gfs GLEVEL = 0 GVCORD = none SKIP = 0/-1;1 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet_nw.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet_nw.attr index 364039968d..db1198e689 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet_nw.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_feet_nw.attr @@ -7,7 +7,7 @@ ! J.L.Partain/MPC 5/01 Set filter=n and added SKIP = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! gfs +GDFILE = nww3 ! gfs GLEVEL = 0 GVCORD = none SKIP = 0/-1;1 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters.attr index 26279bb66f..2ea7733a54 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters.attr @@ -7,7 +7,7 @@ ! J.L.Partain/MPC 5/01 Set filter=n and added SKIP = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! gfs ! gfs +GDFILE = nww3 ! gfs ! gfs GLEVEL = 0 GVCORD = none SKIP = 0/-1;1 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters_nw.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters_nw.attr index c5f015481e..37a3cdf9a5 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters_nw.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/sig_wave_gridded_mslp_meters_nw.attr @@ -7,7 +7,7 @@ ! J.L.Partain/MPC 5/01 Set filter=n and added SKIP = ! T. Lee/SAIC 2/04 Changed AVN to GFS ! -GDFILE nww3 ! gfs +GDFILE = nww3 ! gfs GLEVEL = 0 GVCORD = none SKIP = 0/-1;1 diff --git a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/svrwx_nam.attr b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/svrwx_nam.attr index 3d9ae179cf..db076cd132 100644 --- a/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/svrwx_nam.attr +++ b/cave/build/static/common/cave/etc/ncep/AttributeSetGroups/ModelFcstGridContours/svrwx_nam.attr @@ -20,6 +20,6 @@ FINT = 0;50 !50;56;62;68;74 FLINE = 0;8;0 !0;23;22;30;14;2 HILO = 0!0!0!0!5/H#;L#/1080-2000;900-1012!0 HLSYM = !!!!!1.5;1.5//22/3/hw! -!CLRBAR= 0!1/V/LL!0 +!CLRBAR = 0!1/V/LL!0 WIND = !!!!!!9/0.8/2/112!6/.3/2/221/.4 TITLE = 1/-2/~ BL (0-30 MB AGL)DWPT & WIND =, 700mb TEMP, RH & WND, EMSL!0 diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImage.xml index d01d4d9462..5a6bc97d7a 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImage.xml @@ -1,10 +1,10 @@ - + - + @@ -16,12 +16,12 @@ - + - + - + @@ -36,7 +36,7 @@ - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImageMultipane.xml b/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImageMultipane.xml index 1d106b482f..7bc8c390f9 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImageMultipane.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/GoesSXIImageMultipane.xml @@ -1,5 +1,5 @@ - + @@ -17,12 +17,12 @@ - + - + - + @@ -56,12 +56,12 @@ - + - + - + @@ -95,12 +95,12 @@ - + - + - + @@ -134,12 +134,12 @@ - + - + - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/HalphaImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/HalphaImage.xml index d0ffa5b1b2..cbc22adaf2 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/HalphaImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/HalphaImage.xml @@ -1,11 +1,11 @@ - + - + @@ -17,21 +17,24 @@ - + - + - + + + + - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIAImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIAImage.xml index 5edd004cea..c2002f28f1 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIAImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIAImage.xml @@ -1,5 +1,5 @@ - + @@ -16,13 +16,13 @@ - + - + - - + + @@ -33,7 +33,7 @@ - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIA_MultiImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIA_MultiImage.xml index 049d69142c..2ab51dfb98 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIA_MultiImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_AIA_MultiImage.xml @@ -1,10 +1,10 @@ - + - + - + @@ -16,16 +16,16 @@ - + - + - - + + - + @@ -34,7 +34,7 @@ - + @@ -46,16 +46,16 @@ - + - + - - + + - + @@ -64,7 +64,7 @@ - + @@ -76,16 +76,16 @@ - + - + - - + + - + @@ -93,7 +93,7 @@ - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_HMIImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_HMIImage.xml index 809ea1e37d..85828a6b8c 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/SDO_HMIImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/SDO_HMIImage.xml @@ -1,11 +1,11 @@ - + - + @@ -17,13 +17,13 @@ - + - + - - + + @@ -31,7 +31,7 @@ - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/SOHOEitImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/SOHOEitImage.xml index 461eccbce3..740046bf1e 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/SOHOEitImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/SOHOEitImage.xml @@ -1,11 +1,11 @@ - + - + @@ -17,12 +17,12 @@ - + - + - + @@ -34,7 +34,7 @@ - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/SOHOLascoImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/SOHOLascoImage.xml index 71e31c389f..c94b1e05cf 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/SOHOLascoImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/SOHOLascoImage.xml @@ -1,11 +1,11 @@ - + - + @@ -17,24 +17,21 @@ - + - + - + - - - - + diff --git a/cave/build/static/common/cave/etc/ncep/Bundles/STEREOImage.xml b/cave/build/static/common/cave/etc/ncep/Bundles/STEREOImage.xml index 005cb2f958..206d1e04fa 100644 --- a/cave/build/static/common/cave/etc/ncep/Bundles/STEREOImage.xml +++ b/cave/build/static/common/cave/etc/ncep/Bundles/STEREOImage.xml @@ -1,10 +1,11 @@ - + - + + @@ -17,33 +18,31 @@ - + - + - - + + - - - - + - + + @@ -55,27 +54,26 @@ - + - + - - + + - - - - + + + diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosETA/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosETA/standard.xml index 5bdaa5f0b2..4a04c3ec0e 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosETA/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosETA/standard.xml @@ -1,31 +1,31 @@ - + LR - + UR - + TC - + LL diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/12hrpop.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/12hrpop.xml index ca0447d468..a3314e1771 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/12hrpop.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/12hrpop.xml @@ -1,7 +1,7 @@ - + UR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/6hrpop.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/6hrpop.xml index 3acbca874e..921189ab50 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/6hrpop.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/6hrpop.xml @@ -1,7 +1,7 @@ - + UR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/fosb.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/fosb.xml index ddf3ab8381..b57e59c65e 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/fosb.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/fosb.xml @@ -1,7 +1,7 @@ - + UL diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/misc.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/misc.xml index c22f0fc486..a2d2384b00 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/misc.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/misc.xml @@ -1,83 +1,83 @@ - + BC - + LL - + TC - + LR - + TC - + BC - + TC - + BC - + UR - + UR - + LR - + LL - + UL - + BC - + TC - + LR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/standard.xml index 7e1e149183..f4466e4f11 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosGFS/standard.xml @@ -1,52 +1,52 @@ - + UL - + UR - + TC - + LL - + LR - + BC - + UL - + UR - + TC - + LL - + LR - + UR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosLAMP/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosLAMP/standard.xml index ff96fa5276..416f55409b 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosLAMP/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosLAMP/standard.xml @@ -1,38 +1,38 @@ - + UL - + LL - + SC - + LR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosMRF/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosMRF/standard.xml index f7c3b9546d..d26d9416a3 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosMRF/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosMRF/standard.xml @@ -1,16 +1,16 @@ - + LR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosNGM/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosNGM/standard.xml index b5641eb14a..6f0cb0ab79 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosNGM/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrmosNGM/standard.xml @@ -1,14 +1,14 @@ - + UL - + LL - + LR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrua/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrua/standard.xml index 7f7db0bd60..129423f520 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/bufrua/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/bufrua/standard.xml @@ -5,23 +5,23 @@ plugin="bufrua" name="standard" svgTemplate="standardPlotModelTemplate.svg"> - + UL - + UR - + LL - + LR - + WD diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/modelsounding/basicNAM.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/modelsounding/basicNAM.xml index ecc003f6cb..c5f902b362 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/modelsounding/basicNAM.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/modelsounding/basicNAM.xml @@ -1,49 +1,49 @@ - + MC - + UL - + LL - + ML - + MR - + TR - + BR - + LC - + BC - + TC - - - + UL - + LL - - + MR - + LR - - - + UC - + UR - + MC - + LC - + UL - diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/ncpafm/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/ncpafm/standard.xml index 23cd2b455e..18cc22ee5d 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/ncpafm/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/ncpafm/standard.xml @@ -1,50 +1,50 @@ - + TC - + UL - + UC - + UR - + ML - + MR - + LL - + LC - + WD diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/ncpirep/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/ncpirep/standard.xml index db0b3c9f70..55214b2228 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/ncpirep/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/ncpirep/standard.xml @@ -9,21 +9,21 @@ params have been commented out since all the parameters have not been implemented yet for airep --> - - + UC - + MC - + LC - + UL - + UR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/ncscd/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/ncscd/standard.xml index 5df78b487b..77135efff6 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/ncscd/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/ncscd/standard.xml @@ -1,34 +1,34 @@ - + UL - + ML - + LL - + UR - + LR - + BC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/simple.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/simple.xml index dbd95ad9a8..54995b61a1 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/simple.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/simple.xml @@ -1,38 +1,38 @@ - + UL - + LL - + SC - + WD - - + LR - + TC - + UR - + LM diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/standard.xml index a1a967caad..ae6797c545 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/standard.xml @@ -1,14 +1,14 @@ - + SC - + ML - + LR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_flt_condition.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_flt_condition.xml index 0e6ff9cdfa..a2a51d9cb4 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_flt_condition.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_flt_condition.xml @@ -1,30 +1,30 @@ - + UL - + LL - + SC - + UR - + LR - + TC - + BC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_prob.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_prob.xml index 949ee03688..6a56946958 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_prob.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/nctaf/tempo_prob.xml @@ -1,30 +1,30 @@ - + UL - + LL - + SC - + UR - + LR - + TC - + BC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/ncuair/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/ncuair/standard.xml index 4d351e8460..31fac65b46 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/ncuair/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/ncuair/standard.xml @@ -5,23 +5,23 @@ plugin="ncuair" name="standard" svgTemplate="standardPlotModelTemplate.svg"> - + UL - + UR - + LL - + LR - + WD diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/simple.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/simple.xml index 6681d64d69..5d84f376fb 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/simple.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/simple.xml @@ -4,7 +4,7 @@ plugin="obs" svgTemplate="standardPlotModelTemplate.svg"> - + UL @@ -12,7 +12,7 @@ ML - + LL diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard.xml index 4678fb19fc..040e40e359 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard.xml @@ -1,40 +1,40 @@ - + UL - + LL - + BC - + LR - + UR - + SC - + WD - + ML - + MR diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard2.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard2.xml index 45944bc6d7..4ee3b750b5 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard2.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/obs/standard2.xml @@ -1,42 +1,42 @@ - + UL - + LL - + BC - + LR - + UR - + SC - + WD - + ML - + MR - + LC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/bouys.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/bouys.xml index 5cbd00d02d..a5a33c96a3 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/bouys.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/bouys.xml @@ -1,18 +1,18 @@ - + WD - + UL - + UR - + ML diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/ship_standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/ship_standard.xml index d6e3e566d6..4f6986941e 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/ship_standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/ship_standard.xml @@ -1,44 +1,44 @@ - + UL - + ML - + LL - + SC - + WD - + UR - + MR - + LR - + TC - + BC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/synop_standard.xml b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/synop_standard.xml index 8d1b41bbdf..e75555d3ec 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/synop_standard.xml +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/sfcobs/synop_standard.xml @@ -1,42 +1,42 @@ - + UL - + ML - + LL - + SC - + WD - + UR - + MR - + LR - + BC - + LC diff --git a/cave/build/static/common/cave/etc/ncep/PlotModels/standardPlotModelTemplate.svg b/cave/build/static/common/cave/etc/ncep/PlotModels/standardPlotModelTemplate.svg index 1fd72b0a35..2b6e038fc3 100644 --- a/cave/build/static/common/cave/etc/ncep/PlotModels/standardPlotModelTemplate.svg +++ b/cave/build/static/common/cave/etc/ncep/PlotModels/standardPlotModelTemplate.svg @@ -10,35 +10,6 @@ xmlns:xlink="http://www.w3.org/1999/xlink" style="stroke: rgb(255,255,255);"> @font-face { font-family: "WindSymbolFont"; src: url(../ncep/PlotModels/WindSymbols.svg#WindSymbols); } - @font-face { font-family: "StandardFont"; - src: url(../ncep/PlotModels/Standard.svg#Standard); } - - @font-face { font-family: "CourierNormalFont"; - src: url(../ncep/PlotModels/CourierNormal.svg#CourierNormal); } - @font-face { font-family: "CourierItalicFont"; - src: url(../ncep/PlotModels/CourierItalic.svg#CourierItalic); } - @font-face { font-family: "CourierBoldFont"; - src: url(../ncep/PlotModels/CourierBold.svg#CourierBold); } - @font-face { font-family: "CourierBold-ItalicFont"; - src: url(../ncep/PlotModels/CourierBoldItalic.svg#CourierBoldItalic); } - - @font-face { font-family: "TimesNormalFont"; - src: url(../ncep/PlotModels/TimesNormal.svg#TimesNormal); } - @font-face { font-family: "TimesItalicFont"; - src: url(../ncep/PlotModels/TimesItalic.svg#TimesItalic); } - @font-face { font-family: "TimesBoldFont"; - src: url(../ncep/PlotModels/TimesBold.svg#TimesBold); } - @font-face { font-family: "TimesBold-ItalicFont"; - src: url(../ncep/PlotModels/TimesBoldItalic.svg#TimesBoldItalic); } - - @font-face { font-family: "HelveticaNormalFont"; - src: url(../ncep/PlotModels/HelveticaNormal.svg#HelveticaNormal); } - @font-face { font-family: "HelveticaItalicFont"; - src: url(../ncep/PlotModels/HelveticaItalic.svg#HelveticaItalic); } - @font-face { font-family: "HelveticaBoldFont"; - src: url(../ncep/PlotModels/HelveticaBold.svg#HelveticaBold); } - @font-face { font-family: "HelveticaBold-ItalicFont"; - src: url(../ncep/PlotModels/HelveticaBoldItalic.svg#HelveticaBoldItalic); } @font-face { font-family: "WxSymbolFont"; src: url(../ncep/PlotModels/NcWxSymbols.svg#NcWxSymbols); } @@ -61,21 +32,21 @@ xmlns:xlink="http://www.w3.org/1999/xlink" style="stroke: rgb(255,255,255);"> --> - err - err - err + + + - err - err + + - err + - err - err + + - err - err - err + + + arrow @@ -85,5 +56,5 @@ xmlns:xlink="http://www.w3.org/1999/xlink" style="stroke: rgb(255,255,255);"> - + diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA212/ETA212.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA212/ETA212.xml new file mode 100644 index 0000000000..23f6279210 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA212/ETA212.xml @@ -0,0 +1,21 @@ + + + true + true + ETA212 + GRID + +GDFILE=ETA212 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA218/ETA218.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA218/ETA218.xml new file mode 100644 index 0000000000..b074bcd6a9 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/ETA218/ETA218.xml @@ -0,0 +1,21 @@ + + + true + true + ETA218 + GRID + +GDFILE=ETA218 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/GFS212/GFS212.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/GFS212/GFS212.xml new file mode 100644 index 0000000000..86e3ac6c57 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/GFS212/GFS212.xml @@ -0,0 +1,21 @@ + + + true + true + GFS212 + GRID + +GDFILE=GFS212 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC130/RUC130.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC130/RUC130.xml new file mode 100644 index 0000000000..a4fab7c883 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC130/RUC130.xml @@ -0,0 +1,21 @@ + + + true + true + RUC130 + GRID + +GDFILE=RUC130 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC236/RUC236.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC236/RUC236.xml new file mode 100644 index 0000000000..aeb6a04d60 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/RUC236/RUC236.xml @@ -0,0 +1,21 @@ + + + true + true + RUC236 + GRID + +GDFILE=RUC236 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/SREF212/SREF212.xml b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/SREF212/SREF212.xml new file mode 100644 index 0000000000..a63a74c709 --- /dev/null +++ b/cave/build/static/common/cave/etc/ncep/ResourceDefns/GRID/SREF212/SREF212.xml @@ -0,0 +1,21 @@ + + + true + true + SREF212 + GRID + +GDFILE=SREF212 +pluginName=grid + + Forecast,SBN + ModelFcstGridContours + + + CLOSEST_BEFORE_OR_AFTER + 60 + USE_DATA_TIMES + 10 + 384 + BasicWX_US + \ No newline at end of file diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java index 2f39fbe43a..ef99c516d4 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/dialogs/FfmpBasinTableDlg.java @@ -106,8 +106,8 @@ import com.raytheon.viz.ui.dialogs.ICloseCallback; * Changes for non-blocking AttributeThresholdDlg. * Changes for non-blocking LoadSaveConfigDlg. * Jan 23, 2013 14907 gzhang GUID not in Thresholds menu even ColorCell true + * Mar 01, 2013 13228 gzhang Adding field rowName for VGB in County * - * * @author lvenable * @version 1.0 */ @@ -235,7 +235,9 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements private FFMPTableDataLoader dataRetrieveThread = null; private boolean groupLabelFlag = true; - + + private String rowName="";// DR 13228 + public FfmpBasinTableDlg(Shell parent, FFMPTableData tData, FFMPResource resource) { super(parent, SWT.DIALOG_TRIM | SWT.RESIZE, CAVE.INDEPENDENT_SHELL @@ -1707,7 +1709,7 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements || allOnlySmallBasinsMI.getSelection()) { groupLbl.setText(name); } - + rowName=name;// DR 13228 shell.setCursor(getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); fireScreenRecenterEvent(pfaf, 1); } @@ -2171,4 +2173,9 @@ public class FfmpBasinTableDlg extends CaveSWTDialog implements groupLbl.setText(""); } } + + // DR 13228 + public String getRowName(){ + return this.rowName; + } } diff --git a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java index 3e9d644cff..d2c7d9ffba 100644 --- a/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java +++ b/cave/com.raytheon.uf.viz.monitor.ffmp/src/com/raytheon/uf/viz/monitor/ffmp/ui/rsc/FFMPDataGenerator.java @@ -64,8 +64,8 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FfmpTableConfigData; * ------------ ---------- ----------- -------------------------- * Jul 20, 2009 dhladky Initial creation * Jan 25, 2012 DR 13839 gzhang Use paintTime for QPF + * Mar 01, 2013 DR 13228 gzhang Get VGB county info for row name * - * * @author dhladky * @version 1.0 */ @@ -209,7 +209,7 @@ public class FFMPDataGenerator { for (Long id : ft .getVirtualGageBasinLookupIds( siteKey, - key)) { + key,huc,resource.basinTableDlg.getRowName()/* DR 13228 */)) { setFFMPRow( virtualBasin .get(id), @@ -281,7 +281,7 @@ public class FFMPDataGenerator { for (Long id : ft .getVirtualGageBasinLookupIds( siteKey, - key)) { + key,huc,resource.basinTableDlg.getRowName()/* DR 13228 */)) { setFFMPRow( virtualBasin .get(id), @@ -305,7 +305,7 @@ public class FFMPDataGenerator { return tData; } - private void setFFMPRow(FFMPBasin cBasin, FFMPTableData tData, + private void setFFMPRow(/*FFMPVirtualGageBasinMetaData md,*/FFMPBasin cBasin, FFMPTableData tData, boolean isVGB, String domain) { try { if (cBasin instanceof FFMPVirtualGageBasin) { diff --git a/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml b/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml index 6720e6148c..6b24a835ff 100644 --- a/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml +++ b/cave/com.raytheon.uf.viz.ncep.displays.feature/feature.xml @@ -358,4 +358,11 @@ version="0.0.0" fragment="true"/> + + diff --git a/cave/com.raytheon.uf.viz.npp.crimss/META-INF/MANIFEST.MF b/cave/com.raytheon.uf.viz.npp.crimss/META-INF/MANIFEST.MF index c0299fc9b0..5400bdff33 100644 --- a/cave/com.raytheon.uf.viz.npp.crimss/META-INF/MANIFEST.MF +++ b/cave/com.raytheon.uf.viz.npp.crimss/META-INF/MANIFEST.MF @@ -46,7 +46,6 @@ Import-Package: com.raytheon.uf.common.dataplugin, gov.noaa.nws.ncep.edex.common.sounding, gov.noaa.nws.ncep.ui.nsharp, gov.noaa.nws.ncep.ui.nsharp.natives, - gov.noaa.nws.ncep.ui.nsharp.skewt, javax.measure.converter, javax.measure.unit, org.eclipse.swt.graphics, diff --git a/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java b/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java index 59d1f33848..3613914da5 100644 --- a/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java +++ b/cave/com.raytheon.uf.viz.npp.crimss/src/com/raytheon/uf/viz/npp/crimss/CrimssDataDefinition.java @@ -19,7 +19,7 @@ **/ package com.raytheon.uf.viz.npp.crimss; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; +import gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor; import java.util.ArrayList; import java.util.Arrays; @@ -211,7 +211,7 @@ public class CrimssDataDefinition */ @Override protected IDisplayPaneContainer openNewEditor(String editorId) { - if (NsharpSkewTEditor.EDITOR_ID.equals(editorId)) { + if (NsharpEditor.EDITOR_ID.equals(editorId)) { return UiUtil.createEditor(editorId, new D2DNSharpDisplay()); } else { return super.openNewEditor(editorId); diff --git a/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/products/ui/ProductMenu.xml b/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/products/ui/ProductMenu.xml index fb6803d571..88b2f1b6e6 100644 --- a/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/products/ui/ProductMenu.xml +++ b/cave/com.raytheon.uf.viz.radarapps.core/src/com/raytheon/uf/viz/radarapps/products/ui/ProductMenu.xml @@ -60,6 +60,7 @@ + diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/common/stormtrack/StormTrackDisplay.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/common/stormtrack/StormTrackDisplay.java index 60bdb1afe9..01db4413b7 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/common/stormtrack/StormTrackDisplay.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/common/stormtrack/StormTrackDisplay.java @@ -58,6 +58,7 @@ import com.raytheon.viz.awipstools.common.StormTrackData; import com.raytheon.viz.awipstools.common.stormtrack.StormTrackState.DisplayType; import com.raytheon.viz.awipstools.common.stormtrack.StormTrackState.Mode; import com.raytheon.viz.awipstools.common.stormtrack.StormTrackState.StormCoord; +import com.raytheon.viz.awipstools.ui.layer.DistanceSpeedLayer; import com.raytheon.viz.core.rsc.jts.JTSCompiler; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; @@ -97,6 +98,8 @@ import com.vividsolutions.jts.geom.LineString; * when the track was created. * 10-27-2010 #6964 bkowal The LineStyle is now passed as a parameter to * the IGraphicsTarget drawWireframeShape method. + * 05Mar2013 15693 mgamazaychikov Made sure that magnification capability works + * for DispanceSpeedLayer * * * @@ -641,10 +644,17 @@ public class StormTrackDisplay implements IRenderable { Double magnification = 1.0; for (ResourcePair rp : descriptor.getResourceList()) { if (rp != null) { - magnification = rp.getResource() - .getCapability(MagnificationCapability.class) - .getMagnification(); - break; + /* + * 15693 - make sure magnification capability works for + * DistanceSpeedLayer + */ + if (rp.getResource() instanceof DistanceSpeedLayer) { + magnification = rp.getResource() + .getCapability(MagnificationCapability.class) + .getMagnification(); + break; + } + } } diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceBearingToolLayer.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceBearingToolLayer.java index 5eab4c9b62..e693cf3eda 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceBearingToolLayer.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceBearingToolLayer.java @@ -33,11 +33,14 @@ import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; +import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.drawables.IFont.Style; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; import com.raytheon.uf.viz.core.rsc.tools.AbstractMovableToolLayer; import com.raytheon.uf.viz.core.rsc.tools.AwipsToolsResourceData; @@ -73,6 +76,7 @@ import com.vividsolutions.jts.geom.LineSegment; * in the super class. * 06-09-10 #5620 bkowal The tool will load in an editable state by * default now. + * 05Mar2013 15693 mgamazaychikov Added magnification capability. * * * @@ -82,6 +86,8 @@ import com.vividsolutions.jts.geom.LineSegment; public class DistanceBearingToolLayer extends AbstractMovableToolLayer implements IContextMenuContributor { + + private IFont labelFont; public static final String DEFAULT_NAME = "Distance Bearing"; @@ -100,6 +106,10 @@ public class DistanceBearingToolLayer extends LoadProperties loadProperties) { super(resourceData, loadProperties, true); getCapabilities().addCapability(new OutlineCapability()); + /* + * 15693 - add magnification capability + */ + getCapabilities().addCapability(new MagnificationCapability()); deleteElementAction = new AbstractRightClickAction() { public void run() { deleteSelected(); @@ -126,6 +136,12 @@ public class DistanceBearingToolLayer extends super.initInternal(target); setObjects(ToolsDataManager.getInstance().getDistanceBearings()); gc = new GeodeticCalculator(descriptor.getCRS()); + /* + * 15693 - initialize font for magnification capability + */ + labelFont = target.initializeFont( + target.getDefaultFont().getFontName(), 12.0f, + new Style[] { Style.BOLD }); } protected void paint(IGraphicsTarget target, PaintProperties paintProps, @@ -157,14 +173,19 @@ public class DistanceBearingToolLayer extends } } String label = computeRangeAndAzimuth(line); + /* + * 15693 - set font for magnification capability + */ + labelFont.setMagnification(getCapability(MagnificationCapability.class) + .getMagnification().floatValue()); double[] center = descriptor.worldToPixel(new double[] { line.p0.x, line.p0.y }); double labelLoc[] = target.getPointOnCircle(center[0], center[1], 0.0, radius, 0); - target.drawString(null, label, labelLoc[0], labelLoc[1], 0.0, + target.drawString(labelFont, label, labelLoc[0], labelLoc[1], 0.0, TextStyle.NORMAL, color, HorizontalAlignment.LEFT, null); - target.drawWireframeShape(wireframeShape, color, lineWidth, lineStyle); + target.drawWireframeShape(wireframeShape, color, lineWidth, lineStyle, labelFont); wireframeShape.dispose(); } diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceSpeedLayer.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceSpeedLayer.java index ffa26b5a73..39e231c209 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceSpeedLayer.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/DistanceSpeedLayer.java @@ -28,6 +28,7 @@ import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.uf.viz.core.rsc.tools.AwipsToolsResourceData; import com.raytheon.viz.awipstools.common.stormtrack.AbstractStormTrackResource; import com.raytheon.viz.awipstools.common.stormtrack.StormTrackState; @@ -50,6 +51,7 @@ import com.raytheon.viz.ui.VizWorkbenchManager; * 02/15/2011 7975 bkowal The Distance Speed Tools will * operate independently of each other; * the dialogs will have unique titles. + * 05Mar2013 15693 mgamazaychikov Added magnification capability. * * * @@ -72,6 +74,10 @@ public class DistanceSpeedLayer extends AbstractStormTrackResource { AwipsToolsResourceData resourceData, LoadProperties loadProperties, MapDescriptor descriptor) { super(resourceData, loadProperties, descriptor); + /* + * 15693 - add magnification capability + */ + getCapabilities().addCapability(new MagnificationCapability()); this.determineDialogTitle(); reopenDialog(); } diff --git a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/HomeToolLayer.java b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/HomeToolLayer.java index 04d1a58ba0..1a13362883 100644 --- a/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/HomeToolLayer.java +++ b/cave/com.raytheon.viz.awipstools/src/com/raytheon/viz/awipstools/ui/layer/HomeToolLayer.java @@ -39,10 +39,13 @@ import com.raytheon.uf.viz.core.IDisplayPaneContainer; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; +import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.IFont.Style; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; import com.raytheon.uf.viz.core.rsc.tools.AbstractMovableToolLayer; import com.raytheon.uf.viz.core.rsc.tools.AwipsToolsResourceData; import com.raytheon.uf.viz.points.IPointChangedListener; @@ -66,6 +69,7 @@ import com.vividsolutions.jts.geom.Coordinate; * 20Dec2007 #645 ebabin Updated to fix sampling. * 15Jan2007 ebabin Update for lat/lon put home cursor bug. * 10-21-09 #1049 bsteffen Refactor to common MovableTool model + * 05Mar2013 15693 mgamazaychikov Added magnification capability. * * * @author ebabin @@ -75,6 +79,8 @@ import com.vividsolutions.jts.geom.Coordinate; public class HomeToolLayer extends AbstractMovableToolLayer implements IContextMenuContributor, IPointChangedListener { + + private IFont labelFont; public static final String DEFAULT_NAME = "Home Location"; @@ -89,6 +95,10 @@ public class HomeToolLayer extends AbstractMovableToolLayer public HomeToolLayer(AwipsToolsResourceData resourceData, LoadProperties loadProperties) { super(resourceData, loadProperties, false); + /* + * 15693 - add magnification capability + */ + getCapabilities().addCapability(new MagnificationCapability()); selectLocationAction = new AbstractRightClickAction() { @Override public void run() { @@ -115,6 +125,12 @@ public class HomeToolLayer extends AbstractMovableToolLayer @Override protected void initInternal(IGraphicsTarget target) throws VizException { + /* + * 15693 - initialize font for magnification capability + */ + labelFont = target.initializeFont( + target.getDefaultFont().getFontName(), 12.0f, + new Style[] { Style.BOLD }); super.initInternal(target); resetHome(); gc = new GeodeticCalculator(descriptor.getCRS()); @@ -132,6 +148,11 @@ public class HomeToolLayer extends AbstractMovableToolLayer protected void paint(IGraphicsTarget target, PaintProperties paintProps, Coordinate home, SelectionStatus status) throws VizException { RGB color = getCapability(ColorableCapability.class).getColor(); + /* + * 15693 - set font for magnification capability + */ + labelFont.setMagnification(getCapability(MagnificationCapability.class) + .getMagnification().floatValue()); if (status == SelectionStatus.SELECTED) { color = GRAY; } @@ -154,6 +175,7 @@ public class HomeToolLayer extends AbstractMovableToolLayer dString.basics.z = 0.0; dString.textStyle = TextStyle.NORMAL; dString.horizontalAlignment = HorizontalAlignment.LEFT; + dString.font = labelFont; target.drawStrings(dString); } diff --git a/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResource.java b/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResource.java index 54e4232210..9604088b04 100644 --- a/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResource.java +++ b/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResource.java @@ -91,7 +91,8 @@ import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability; * text will be updated when the user changes * the magnification level now. * Sep 4, 2012 15335 kshresth Will now display lightning/wind - * fields when magnification set to 0 + * fields when magnification set to 0 + * Feb 27, 2013 DCS 152 jgerth/elau Support for WWLLN and multiple sources * * * @@ -121,14 +122,17 @@ public class LightningResource extends private BinOffset offset; private DataTime frameTime; - + + private String lightSource; + private List newRecords = new ArrayList(); private List processed = new ArrayList(); - public LightningFrameMetadata(DataTime frameTime, BinOffset offset) { + public LightningFrameMetadata(DataTime frameTime, BinOffset offset, String ls) { this.frameTime = frameTime; this.offset = offset; + this.lightSource = ls; } @Override @@ -161,6 +165,11 @@ public class LightningResource extends return false; } else if (!offset.equals(other.offset)) return false; + if (lightSource == null) { + if (other.lightSource != null) + return false; + } else if (!lightSource.equals(other.lightSource)) + return false; return true; } @@ -223,6 +232,10 @@ public class LightningResource extends private boolean needsUpdate; private String resourceName; + + private String lightSource; + + private int posAdj; private IFont font; @@ -231,12 +244,14 @@ public class LightningResource extends private List currNegList = null; public LightningResource(LightningResourceData resourceData, - LoadProperties loadProperties) { + LoadProperties loadProperties, String ls, int pa) { super(resourceData, loadProperties); resourceData.addChangeListener(this); this.dataTimes = new ArrayList(); this.cacheObjectMap = new ConcurrentHashMap>(); + this.lightSource = ls; + this.posAdj = pa; } /* @@ -308,7 +323,11 @@ public class LightningResource extends this.resourceName = timeString; } - this.resourceName += " Lightning Plot "; + String lightType = " "; + if (!this.lightSource.isEmpty()) { + lightType += this.lightSource + " "; + } + this.resourceName += lightType + "Lightning Plot "; } private String convertTimeIntervalToString(int time) { @@ -427,7 +446,8 @@ public class LightningResource extends if (this.resourceData.isHandlingPositiveStrikes()) { DrawableString pos = new DrawableString(posCount + " + Strikes", color); - pos.setCoordinates(225, height * 2); + pos.setCoordinates(225, height * (2 + 2*this.posAdj)); + // jjg above pos.font = font; pos.verticallAlignment = VerticalAlignment.TOP; pos.horizontalAlignment = HorizontalAlignment.RIGHT; @@ -437,7 +457,8 @@ public class LightningResource extends if (this.resourceData.isHandlingNegativeStrikes()) { DrawableString neg = new DrawableString(negCount + " - Strikes", color); - neg.setCoordinates(225, height * 3); + neg.setCoordinates(225, height * (3 + 2*this.posAdj)); + // jjg above neg.font = font; neg.verticallAlignment = VerticalAlignment.TOP; neg.horizontalAlignment = HorizontalAlignment.RIGHT; @@ -466,28 +487,30 @@ public class LightningResource extends Map> recordMap = new HashMap>(); for (BinLightningRecord obj : objs) { - DataTime time = new DataTime(obj.getStartTime()); - DataTime end = new DataTime(obj.getStopTime()); - time = this.getResourceData().getBinOffset() - .getNormalizedTime(time); - end = this.getResourceData().getBinOffset().getNormalizedTime(end); + if (obj.getLightSource().equals(this.lightSource) || this.lightSource.isEmpty()) { + DataTime time = new DataTime(obj.getStartTime()); + DataTime end = new DataTime(obj.getStopTime()); + time = this.getResourceData().getBinOffset() + .getNormalizedTime(time); + end = this.getResourceData().getBinOffset().getNormalizedTime(end); - // check for frames in the middle - // get interval ( in seconds ) between frames - int interval = this.getResourceData().getBinOffset().getInterval(); - while (end.greaterThan(time) || end.equals(time)) { - List records = recordMap.get(time); - if (records == null) { - records = new ArrayList(); - recordMap.put(time, records); - } - records.add(obj); + // check for frames in the middle + // get interval ( in seconds ) between frames + int interval = this.getResourceData().getBinOffset().getInterval(); + while (end.greaterThan(time) || end.equals(time)) { + List records = recordMap.get(time); + if (records == null) { + records = new ArrayList(); + recordMap.put(time, records); + } + records.add(obj); - // increment to the next time - long newTime = time.getRefTime().getTime() + (interval * 1000); - TimeRange range = new TimeRange(newTime, newTime); - time = new DataTime(newTime, range); - } + // increment to the next time + long newTime = time.getRefTime().getTime() + (interval * 1000); + TimeRange range = new TimeRange(newTime, newTime); + time = new DataTime(newTime, range); + } + } } for (Map.Entry> entry : recordMap @@ -505,7 +528,7 @@ public class LightningResource extends if (co == null) { // New frame frame = new LightningFrameMetadata(dt, - resourceData.getBinOffset()); + resourceData.getBinOffset(), this.lightSource); co = CacheObject.newCacheObject(frame, resourceBuilder); cacheObjectMap.put(dt, co); dataTimes.add(dt); diff --git a/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResourceData.java b/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResourceData.java index 10340b221c..68a01c7ab7 100644 --- a/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResourceData.java +++ b/cave/com.raytheon.viz.lightning/src/com/raytheon/viz/lightning/LightningResourceData.java @@ -28,6 +28,8 @@ import javax.xml.bind.annotation.XmlAttribute; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.binlightning.BinLightningRecord; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -44,6 +46,7 @@ import com.raytheon.uf.viz.core.rsc.LoadProperties; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 18, 2009 chammack Initial creation + * Feb 27, 2013 DCS 152 jgerth Support for WWLLN and multiple sources * * * @@ -61,10 +64,29 @@ public class LightningResourceData extends AbstractRequestableResourceData { @XmlAttribute private boolean handlingNegativeStrikes = true; + @XmlAttribute + private String plotLightSource = ""; + + @XmlAttribute + private int countPosition = 0; + @Override protected AbstractVizResource constructResource( LoadProperties loadProperties, PluginDataObject[] objects) { - LightningResource rsc = new LightningResource(this, loadProperties); + // jjg add + String ls = ""; + if (this.metadataMap.containsKey("lightSource")) + ls = this.metadataMap.get("lightSource").getConstraintValue(); + else if (!plotLightSource.isEmpty()) { + ls = plotLightSource; + RequestConstraint lsrc = new RequestConstraint(ls, ConstraintType.EQUALS); + this.metadataMap.put("lightSource", lsrc); + } + int pa = 0; + if (countPosition != 0) + pa = countPosition; + // end + LightningResource rsc = new LightningResource(this, loadProperties, ls, pa); List records = new ArrayList( objects.length); for (PluginDataObject pdo : objects) { @@ -83,6 +105,8 @@ public class LightningResourceData extends AbstractRequestableResourceData { @Override public boolean isUpdatingOnMetadataOnly() { + if (this.isUpdatingOnMetadataOnly == false) + return false; return true; } @@ -121,6 +145,38 @@ public class LightningResourceData extends AbstractRequestableResourceData { this.handlingNegativeStrikes = handlingNegativeStrikes; } + /** + * @return plotLightSource + * the lightSource to get - JJG + */ + public String getPlotLightSource() { + return plotLightSource; + } + + /** + * @param plotLightSource + * the lightSource to set - JJG + */ + public void setPlotLightSource(String plotLightSource) { + this.plotLightSource = plotLightSource; + } + + /** + * @return countPosition + * the countPosition to get - JJG + */ + public int getCountPosition() { + return countPosition; + } + + /** + * @param countPosition + * the countPosition to set - JJG + */ + public void setCountPosition(int countPosition) { + this.countPosition = countPosition; + } + @Override public boolean equals(Object obj) { // TODO Auto-generated method stub @@ -133,7 +189,8 @@ public class LightningResourceData extends AbstractRequestableResourceData { } LightningResourceData other = (LightningResourceData) obj; - return (this.handlingNegativeStrikes == other.handlingNegativeStrikes && this.handlingPositiveStrikes == other.handlingPositiveStrikes); + return (this.handlingNegativeStrikes == other.handlingNegativeStrikes && this.handlingPositiveStrikes == other.handlingPositiveStrikes && + this.plotLightSource == other.plotLightSource && this.countPosition == other.countPosition); } } diff --git a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/dialogs/QcPrecipOptionsDialog.java b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/dialogs/QcPrecipOptionsDialog.java index 094b866943..396611c0a6 100644 --- a/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/dialogs/QcPrecipOptionsDialog.java +++ b/cave/com.raytheon.viz.mpe.ui/src/com/raytheon/viz/mpe/ui/dialogs/QcPrecipOptionsDialog.java @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.Date; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -63,6 +65,8 @@ import com.raytheon.viz.mpe.util.DailyQcUtils.Ts; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Nov 12, 2008 snaples Initial creation + * Mar 7, 2013 15657 lbousaidi fixed DQC slider and added listener to the Keys + * when pressed. * * * @@ -888,14 +892,15 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog { gd.horizontalSpan = 2; pntFilter = new Scale(pntControlComp, SWT.BORDER); pntFilter.setMinimum(0); - pntFilter.setMaximum(500); + pntFilter.setMaximum(5000); + pntFilter.setIncrement(10); pntFilter.setSelection(0); pntFilter.setLayoutData(gd); pntFilter.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int sel = pntFilter.getSelection(); - pfvalueLabel.setText(String.format("%4.2f", sel / 100.0f)); + pfvalueLabel.setText(String.format("%4.2f", sel / 1000.0f)); } }); pntFilter.addMouseListener(new org.eclipse.swt.events.MouseAdapter() { @@ -906,6 +911,25 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog { }); + /** + * Add a key listener for up and down arrows + * to move up and down through the filter + * scale + */ + + pntFilter.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.keyCode == SWT.ARROW_RIGHT) { + opo.refresh_exposure(); + } else if (e.keyCode == SWT.ARROW_LEFT) { + opo.refresh_exposure(); + } + + } + + }); + /** * Point reverse filter scale */ @@ -924,15 +948,15 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog { gd.horizontalSpan = 2; pntRevFilter = new Scale(pntControlComp, SWT.BORDER); pntRevFilter.setMinimum(0); - pntRevFilter.setMaximum(2000); + pntRevFilter.setMaximum(20000); pntRevFilter.setIncrement(10); pntRevFilter.setSelection(0); pntRevFilter.setLayoutData(gd); pntRevFilter.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - int sel = 2000 - pntRevFilter.getSelection(); - prvalueLabel.setText(String.format("%4.2f", sel / 100.0f)); + int sel = 20000 - pntRevFilter.getSelection(); + prvalueLabel.setText(String.format("%4.2f", sel / 1000.0f)); } }); pntRevFilter @@ -943,6 +967,23 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog { } }); + /** + * Add a key listener for up and down arrows + * to move up and down through the reverse filter + * scale + */ + pntRevFilter.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.keyCode == SWT.ARROW_RIGHT) { + opo.refresh_exposure(); + } else if (e.keyCode == SWT.ARROW_LEFT) { + opo.refresh_exposure(); + } + + } + + }); /** * Point elevation scale @@ -1050,12 +1091,12 @@ public class QcPrecipOptionsDialog extends AbstractMPEDialog { } public static float getPointFilterValue() { - float sel = pntFilter.getSelection() / 100.0f; + float sel = pntFilter.getSelection() / 1000.0f; return sel; } public static float getPointFilterReverseValue() { - float sel = (2000 - pntRevFilter.getSelection()) / 100.0f; + float sel = (20000 - pntRevFilter.getSelection()) / 1000.0f; return sel; } diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/baseRadarGraphics.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/baseRadarGraphics.xml index d08e4940f0..9182242a82 100644 --- a/cave/com.raytheon.viz.radar/localization/menus/radar/baseRadarGraphics.xml +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/baseRadarGraphics.xml @@ -82,6 +82,14 @@ + + + + + + + @@ -118,4 +126,4 @@ - \ No newline at end of file + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/dualPol/baseRadarAlgorithmOverlays.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/dualPol/baseRadarAlgorithmOverlays.xml index d9af69f2d9..c67e70aff6 100644 --- a/cave/com.raytheon.viz.radar/localization/menus/radar/dualPol/baseRadarAlgorithmOverlays.xml +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/dualPol/baseRadarAlgorithmOverlays.xml @@ -215,6 +215,14 @@ + + + + + + + @@ -236,4 +244,4 @@ - \ No newline at end of file + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseLocalRadarMenu.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseLocalRadarMenu.xml new file mode 100644 index 0000000000..b97074018a --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseLocalRadarMenu.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarAlgorithmOverlays.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarAlgorithmOverlays.xml new file mode 100644 index 0000000000..a9a026d1e1 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarAlgorithmOverlays.xml @@ -0,0 +1,247 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResBase.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResBase.xml new file mode 100644 index 0000000000..b343d9f553 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResBase.xml @@ -0,0 +1,1303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZSRM.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZSRM.xml new file mode 100644 index 0000000000..f8d653f720 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZSRM.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZV.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZV.xml new file mode 100644 index 0000000000..2605b6b893 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarBestResZV.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDataQuality.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDataQuality.xml new file mode 100644 index 0000000000..4f1d88e12e --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDataQuality.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDerivedProducts.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDerivedProducts.xml new file mode 100644 index 0000000000..1a58c86847 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarDerivedProducts.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /radar/%/${icao}/137/% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarFourPanel.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarFourPanel.xml new file mode 100644 index 0000000000..c5cee15621 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarFourPanel.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarLegacy.xml b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarLegacy.xml new file mode 100644 index 0000000000..dd4459a170 --- /dev/null +++ b/cave/com.raytheon.viz.radar/localization/menus/radar/klgx/baseRadarLegacy.xml @@ -0,0 +1,1874 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cave/com.raytheon.viz.radar/localization/styleRules/RadarUpperText.xml b/cave/com.raytheon.viz.radar/localization/styleRules/RadarUpperText.xml index 1a590304e5..2c0833dbc7 100644 --- a/cave/com.raytheon.viz.radar/localization/styleRules/RadarUpperText.xml +++ b/cave/com.raytheon.viz.radar/localization/styleRules/RadarUpperText.xml @@ -393,5 +393,9 @@ + + + + \ No newline at end of file diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java index 8725fd770f..f74b87a4ad 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/RadarHelper.java @@ -70,6 +70,8 @@ import com.raytheon.viz.awipstools.common.StormTrackData; * ------------ ---------- ----------- -------------------------- * Feb 16, 2009 mnash Initial creation * 03/07/2012 DR 14660 D. Friedman Added time-based getSTIData* functions. + * 03/01/2013 DR 15496 zwang Handle the expanded GSM + * Correct some status according to B14 ICD * * * @@ -138,19 +140,19 @@ public class RadarHelper { private static char DEGREE_SYMBOL = 0xB0; public static final String[] rdaOpStatusStr = { - "Automatic Calibration Disabled", "Online", + null, "Online", "Maintenance Action Required", "Maintenance Action Mandatory", - "Command Shutdown", "Inoperable", "Missing", "Wideband Disconnect" }; + "Command Shutdown", "Inoperable", null, "Wideband Disconnect" }; public static final String[] rpgNarrowbandStatus = { "Commanded Disconnect", "Narrowband Loadshed" }; public static final String[] rdaStatusStr = { null, "Startup", "Standby", - "Restart", "Operate", "Missing", "Off-line Operate" }; + "Restart", "Operate", null, "Off-line Operate" }; public static final String[] rdaAlarmStr = { "Indeterminate", "Tower/Utilities", "Pedestal", "Transmitter", - "Receiver/Signal Processor", "RDA Control", "RDA Communications" }; + "Receiver", "RDA Control", "RDA Communications", "Signal Processor" }; public static final String[] dteStr = { null, "None", "Reflectivity", "Velocity", "Spectrum Width", "Dual Polarization" }; @@ -160,20 +162,23 @@ public class RadarHelper { "Commanded Shutdown" }; public static final String[] rpgAlarmStr = { "No Alarms", - "Node Connectivity", null, "RPG Control Task Failure", + "Node Connectivity", "Wideband Failure", "RPG Control Task Failure", "Data Base Failure", null, "RPG Input Buffer Loadshed (Wideband)", null, "Product Storage Loadshed", null, null, null, "RPG/RPG Intercomputer Link Failure", "Redundant Channel Error", "Task Failure", "Media Failure" }; public static final String[] rpgStatusStr = { "Restart", "Operate", - "Standby", null, "Test Mode" }; + "Standby"}; public static final String[] productAvailStr = { "Product Availability", "Degraded Availability", "Not Available" }; public static final String[] rdaChannelStr = { "NWS Single Thread", "RDA 1", "RDA 2" }; + + public static final String[] vcpInfoStr = { "AVSET", + "SAILS", "Site-Specific VCP" }; /** * The default maximimum difference in time used when retrieving STI data (15 minutes.) diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarGFMInterrogator.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarGFMInterrogator.java new file mode 100644 index 0000000000..4061420171 --- /dev/null +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/interrogators/RadarGFMInterrogator.java @@ -0,0 +1,257 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.radar.interrogators; + +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.HashMap; +import java.util.Map; + +import javax.measure.converter.UnitConverter; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; + +import org.opengis.referencing.operation.MathTransform; + +import com.raytheon.uf.common.dataplugin.radar.RadarDataKey; +import com.raytheon.uf.common.dataplugin.radar.RadarDataPoint; +import com.raytheon.uf.common.dataplugin.radar.RadarRecord; +import com.raytheon.uf.common.dataplugin.radar.level3.generic.AreaComponent; +import com.raytheon.uf.common.dataplugin.radar.level3.generic.GenericDataComponent; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket.GFMAttributeIDs; +import com.raytheon.uf.common.geospatial.CRSCache; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; + +/** + * Interrogator class for Radar GFM sampling. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/04/2013   DCS51      zwang       Initial creation
+ * 
+ * 
+ * + * @author zwang + * @version 1.0 + */ + +public class RadarGFMInterrogator extends RadarGraphicInterrogator implements + IRadarInterrogator { + + public RadarGFMInterrogator() { + super(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.radar.interrogators.IRadarInterrogator#sample(com.raytheon + * .edex.plugin.radar.RadarRecord, com.vividsolutions.jts.geom.Coordinate, + * com.raytheon.uf.viz.core.drawables.ColorMapParameters) + */ + @Override + public Map sample(RadarRecord record, Coordinate latLon, + ColorMapParameters params) { + Map dataMap = new HashMap(); + if (latLon == null) { + return null; + } + double[] input = { latLon.x, latLon.y }; // rr + double[] output = new double[2]; // rr + try { + MathTransform mt = CRSCache.getInstance().getTransformFromLatLon( + record.getCRS()); + + mt.transform(input, 0, output, 0, 1); + dataMap.put("crsLocation", output == null ? "-1,-1" : output[0] + + "," + output[1]); + } catch (Exception e) { + return null; + } + + dataMap.put("ICAO", record.getIcao()); + dataMap.put("Mnemonic", record.getMnemonic()); + addParameters(record, latLon, dataMap); + return dataMap; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.radar.interrogators.IRadarInterrogator#addParameters + * (com.raytheon.uf.common.dataplugin.radar.RadarRecord, + * com.vividsolutions.jts.geom.Coordinate, java.util.Map) + */ + @Override + public int addParameters(RadarRecord radarRecord, Coordinate latLon, + Map dataMap) { + dataMap.put("Value", getDataValues(radarRecord, latLon)); + return 0; + } + + private String getDataValues(RadarRecord radarRecord, Coordinate latLon) { + StringBuffer rval = new StringBuffer(); + + Coordinate c1 = new Coordinate(latLon.x + .025, latLon.y + .025); + Coordinate c2 = new Coordinate(latLon.x - .025, latLon.y - .025); + Envelope env = new Envelope(c1, c2); + + UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND + .getConverterTo(NonSI.KNOT); + + NumberFormat formatter = new DecimalFormat("###"); + + String windX, windY; + double pU = 0.0; + double pV = 0.0; + double pSpd = 0.0; + double pDir = 0.0; + double wX = 0.0; + double wY = 0.0; + + if (radarRecord.getProductCode() == 140) { + + for (RadarDataKey key : radarRecord.getSymbologyData().keySet()) { + + // Get the data for the select feature + RadarDataPoint currPoint = radarRecord.getSymbologyData() + .get(key); + + AreaComponent currFeature; + HashMap> currPointData = currPoint + .getDisplayGenericPointData(); + + for (Integer type : currPointData.keySet()) { + for (GenericDataComponent currComp : currPointData + .get(type).values()) { + currFeature = (AreaComponent) currComp; + + int numParam = currFeature.getParameters().size(); + + if (numParam == 11) { + windX = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDX.getName()); + if ((windX != null) && (windX.length() > 0)) { + wX = Float.parseFloat(windX); + } + windY = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDY.getName()); + if ((windY != null) && (windY.length() > 0)) { + wY = Float.parseFloat(windY); + } + + // windX/windY unit is 1km, convert to 1/4km + Coordinate currStorm = radarRecord + .convertStormLatLon(wX * 4.0, wY * 4.0); + + if (env.contains(currStorm) && currPoint.isVisible()) { + + // propU + String pUStr = currFeature + .getValue(GFMAttributeIDs.PROPU.toString()); + if ((pUStr != null) && (pUStr.length() > 0)) { + pU = metersPerSecondToKnots.convert(new Double(pUStr)); + } + + // propV + String pVStr = currFeature + .getValue(GFMAttributeIDs.PROPV.toString()); + if ((pVStr != null) && (pVStr.length() > 0)) { + pV = metersPerSecondToKnots.convert(new Double(pVStr)); + } + pSpd = getSpeed(pU, pV); + pDir = getDir(pU, pV); + + // avg_speed + String spdStr = currFeature + .getValue(GFMAttributeIDs.AVG_SPEED.toString()); + if ((spdStr != null) && (spdStr.length() > 0)) { + double spd = metersPerSecondToKnots + .convert(new Double(spdStr)); + spdStr = formatter.format(spd); + } + + // avg_direction + String dirStr = currFeature + .getValue(GFMAttributeIDs.AVG_DIRECTION.toString()); + + if ((dirStr != null) && (dirStr.length() > 0)) { + double dir = new Double(dirStr); + dirStr = formatter.format(dir); + } + + // wsHarzard + String wsStr = currFeature + .getValue(GFMAttributeIDs.WSHAZARD.toString()); + if ((wsStr != null) && (wsStr.length() > 0)) { + double ws = metersPerSecondToKnots + .convert(new Double(wsStr)); + wsStr = formatter.format(ws); + } + + rval.append("Movement " + formatter.format(pSpd) + "kts@" + + formatter.format(pDir) + "\n"); + rval.append("Wind Behind " + spdStr + "kts@" + dirStr + "\n"); + rval.append("Wind Shear Hazard " + wsStr + "kts "); + + } + break; + } + } + } + + } + } + + return rval.toString(); + } + + // Get wind speed from (u,v) + private double getSpeed(double u, double v) { + double spd = 0.0; + spd = Math.sqrt(u * u + v * v); + + return spd; + } + + // Get wind direction from (u,v) + private double getDir(double u, double v) { + double R_EQ_ZERO = 1.0E-10; + double DEG_HALF_PI = 180.0; + + double spd = 0.0; + double dir = 0.0; + spd = Math.sqrt(u * u + v * v); + + if (spd < R_EQ_ZERO) { + dir = 0.0; + } else { + dir = (double)(Math.toDegrees(Math.atan2(u, v)) + DEG_HALF_PI + 1.0E-3); + } + + return dir; + } +} diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarProductFactory.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarProductFactory.java index 15cec62b99..794c1b13f3 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarProductFactory.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/RadarProductFactory.java @@ -30,6 +30,7 @@ import com.raytheon.uf.viz.core.map.MapDescriptor; import com.raytheon.uf.viz.core.rsc.LoadProperties; import com.raytheon.viz.radar.interrogators.IRadarInterrogator; import com.raytheon.viz.radar.interrogators.RadarDMDInterrogator; +import com.raytheon.viz.radar.interrogators.RadarGFMInterrogator; import com.raytheon.viz.radar.interrogators.RadarDefaultInterrogator; import com.raytheon.viz.radar.interrogators.RadarEETInterrogator; import com.raytheon.viz.radar.interrogators.RadarGraphicInterrogator; @@ -57,6 +58,7 @@ import com.raytheon.viz.radar.ui.xy.RadarXsectXYResource; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Aug 4, 2010 mnash Initial creation + * 03/04/2013 DCS51 zwang Handle GFM product * * * @@ -93,6 +95,9 @@ public class RadarProductFactory { } else if ("Graphic".equals(format)) { if (productCode == 149) { interrogator = new RadarDMDInterrogator(); + } + else if (productCode == 140) { + interrogator = new RadarGFMInterrogator(); } else { interrogator = new RadarGraphicInterrogator(); } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsDisplay.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsDisplay.java index ef35f9c409..069615f012 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsDisplay.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsDisplay.java @@ -69,6 +69,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 13, 2009 chammack Initial creation + * 03/04/2013 DCS51 zwang Handle GFM product * * * @@ -134,11 +135,14 @@ public class RadarGraphicsDisplay implements IRenderable { new GeneralGridEnvelope(new int[] { 0, 0 }, new int[] { 4096, 4096 }, false), generalEnvelope); IWireframeShape ws = target.createWireframeShape(true, mapDescriptor); + + // Used for GFM forecast positions + IWireframeShape gfmWs = target.createWireframeShape(true, mapDescriptor); symbologyData = radarRecord.getSymbologyData(); if (symbologyData != null) { RadarGraphicsPage rgp = new RadarGraphicsPage(mapDescriptor, gg, - ws, target, color); + ws, gfmWs, target, color); this.symbologyPages.add(rgp); // Determine if each set of Storm data should be displayed @@ -158,7 +162,8 @@ public class RadarGraphicsDisplay implements IRenderable { // logic in createSymbologyImages() rgp.addImages(currStorm, CoordinateSystem.LOCAL); - if (currStorm.getDataType().equals(RadarProductType.GENERIC)) { + //Handle DMD table data + if (radarRecord.getProductCode() == 149) { // Handle the tabular display data in the Generic Packet String data = GraphicDataUtil.getDMDGraphicDataValue( tableModifier, radarRecord, @@ -170,6 +175,7 @@ public class RadarGraphicsDisplay implements IRenderable { addTableRow(tableData, featureData); processTableData = true; } + } } @@ -203,10 +209,21 @@ public class RadarGraphicsDisplay implements IRenderable { } } } + // handle GFM product + else { + this.currentPage = pageNum; + + RadarGraphicsPage gab = this.pageMap.get(pageNum); + if (gab == null) { + gab = new RadarGraphicsPage(mapDescriptor, gg, ws, gfmWs, + target, color); + this.pageMap.put(pageNum, gab); + } + } this.currentPage = 0; } - + // Graphic block is organized into pages for display. The data for each // page is contained in packets. GraphicBlock gb = radarRecord.getGraphicBlock(); diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsPage.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsPage.java index 8ea8b1a2c3..6b4ae4321e 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsPage.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsPage.java @@ -24,6 +24,12 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; +import java.awt.image.BufferedImage; + +import javax.measure.converter.UnitConverter; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; import org.eclipse.swt.graphics.RGB; import org.geotools.coverage.grid.GeneralGridGeometry; @@ -36,6 +42,7 @@ import com.raytheon.uf.common.dataplugin.radar.level3.CellTrendDataPacket; import com.raytheon.uf.common.dataplugin.radar.level3.CellTrendVolumeScanPacket; import com.raytheon.uf.common.dataplugin.radar.level3.CorrelatedShearPacket; import com.raytheon.uf.common.dataplugin.radar.level3.DMDPacket.DMDAttributeIDs; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket; import com.raytheon.uf.common.dataplugin.radar.level3.ETVSPacket; import com.raytheon.uf.common.dataplugin.radar.level3.HailPositivePacket; import com.raytheon.uf.common.dataplugin.radar.level3.HailProbablePacket; @@ -76,14 +83,19 @@ import com.raytheon.uf.viz.core.DrawableLine; import com.raytheon.uf.viz.core.DrawableString; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; +import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; +import com.raytheon.uf.viz.core.data.prep.IODataPreparer; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IFont; import com.raytheon.uf.viz.core.drawables.IRenderable; import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.ext.ICanvasRenderingExtension; +import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.rsc.jts.JTSCompiler; +import com.raytheon.viz.pointdata.PointWindDisplay; +import com.raytheon.viz.pointdata.PointWindDisplay.DisplayType; import com.raytheon.viz.pointdata.drawables.IPointImageExtension; import com.raytheon.viz.pointdata.drawables.IPointImageExtension.PointImage; import com.raytheon.viz.radar.RadarHelper; @@ -107,6 +119,7 @@ import com.vividsolutions.jts.geom.LineString; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 8, 2009 chammack Initial creation + * 03/05/2013 DCS51 zwang Handle GFM product * * * @@ -129,6 +142,8 @@ public class RadarGraphicsPage implements IRenderable { private JTSCompiler compiler; private IWireframeShape wireframeShape; + + private IWireframeShape gfmFcstWireframeShape; /** Map of ascii strings in local coordinate system */ private Map localStringMap; @@ -174,7 +189,14 @@ public class RadarGraphicsPage implements IRenderable { private boolean drawBorder = false; private int recordsPerPage = 5; - + + // for GFM product, add gfmFcstWireframeShape + public RadarGraphicsPage(IDescriptor descriptor, GeneralGridGeometry gg, + IWireframeShape shape, IWireframeShape gfmShape, IGraphicsTarget target, RGB color) { + this(descriptor, gg, shape, target, color); + this.gfmFcstWireframeShape = gfmShape; + } + public RadarGraphicsPage(IDescriptor descriptor, GeneralGridGeometry gg, IWireframeShape shape, IGraphicsTarget target, RGB color, DmdModifier tableModifier) { @@ -443,6 +465,25 @@ public class RadarGraphicsPage implements IRenderable { } } } + // GFM + else if (type == 140) { + List gfmImages = new ArrayList(); + + // Handle each Feature in the GFM Packet + for (GenericDataComponent currComponent : stormData + .getDisplayGenericPointData().get(type).values()) { + // Handle Graphic portion + gfmImages = getGfmImage(currComponent); + + if (gfmImages.isEmpty()) { + displayStormID = false; + stormData.setVisible(false); + } else { + images.addAll(gfmImages); + stormData.setVisible(true); + } + } + } } // Only display storm id if other information is being displayed @@ -848,6 +889,135 @@ public class RadarGraphicsPage implements IRenderable { return image; } + // Handle GFM product + private List getGfmImage(GenericDataComponent currPt) + throws VizException { + List images = new ArrayList(); + + UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); + + boolean isFcst = false; + double x,y; + Coordinate pos1, pos2; + + int imgSize = 64; + + AreaComponent currFeature = (AreaComponent) currPt; + + int numPoints = currFeature.getPoints().size(); + int numParam = currFeature.getParameters().size(); + + String propU, propV, windU, windV, windX, windY; + double pU = 0.0; + double pV = 0.0; + double wU = 0.0; + double wV = 0.0; + double wX = 0.0; + double wY = 0.0; + + // if the component only has dectect ID and DeltaT + if (numParam == 2) { + isFcst = true; + } + // 11 parameters + else { + propU = currFeature.getValue(GFMPacket.GFMAttributeIDs.PROPU.getName()); + if ((propU != null) && (propU.length() > 0)) { + pU = metersPerSecondToKnots.convert(new Double(propU)); + } + propV = currFeature.getValue(GFMPacket.GFMAttributeIDs.PROPV.getName()); + if ((propV != null) && (propV.length() > 0)) { + pV = metersPerSecondToKnots.convert(new Double(propV)); + } + windU = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDU.getName()); + if ((windU != null) && (windU.length() > 0)) { + wU = metersPerSecondToKnots.convert(new Double(windU)); + } + windV = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDV.getName()); + if ((windV != null) && (windV.length() > 0)) { + wV = metersPerSecondToKnots.convert(new Double(windV)); + } + windX = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDX.getName()); + if ((windX != null) && (windX.length() > 0)) { + wX = Float.parseFloat(windX); + } + windY = currFeature.getValue(GFMPacket.GFMAttributeIDs.WINDBEHINDY.getName()); + if ((windY != null) && (windY.length() > 0)) { + wY = Float.parseFloat(windY); + } + + // Prop wind arrow + PlotObject poWind = new PlotObject(); + PointWindDisplay barb = new PointWindDisplay(imgSize * 0.4, 0.5, 2, 0); + barb.setImageParameters(imgSize, imgSize, 255, 255, 255, 1); + barb.setColor(this.color); + + // plot the wind arrow in the same length as 50 kts + double spd = Math.sqrt(pU * pU + pV * pV); + if (spd > 0) { + pU *= 50.0 / spd; + pV *= 50.0 / spd; + } + + barb.setWind(pU, pV, false); + BufferedImage imgBuf = barb.getWindImage(false, DisplayType.ARROW, 0.2); + IImage img = this.target.initializeRaster(new IODataPreparer(imgBuf, UUID.randomUUID().toString(), 0), null); + poWind.image = img; + + // Wind barb behind front + PlotObject wWind = new PlotObject(); + PointWindDisplay barb1 = new PointWindDisplay(imgSize * 0.4, 0.5, 2, 0); + barb1.setImageParameters(imgSize, imgSize, 255, 255, 255, 1); + barb1.setColor(this.color); + barb1.setWind(wU, wV, false); + BufferedImage imgBuf1 = barb1.getWindImage(false, DisplayType.BARB, 1); + IImage img1 = this.target.initializeRaster(new IODataPreparer(imgBuf1, UUID.randomUUID().toString(), 0), null); + wWind.image = img1; + + ReferencedCoordinate rc = referencedGfmCoord(wX, wY); + try { + poWind.coord = rc.asPixel(this.descriptor.getGridGeometry()); + poWind.pixelOffset = new int[] { 0, 0 }; + images.add(poWind); + + wWind.coord = rc.asPixel(this.descriptor.getGridGeometry()); + wWind.pixelOffset = new int[] { 0, 0 }; + images.add(wWind); + + } catch (Exception e) { + throw new VizException("Unable to transform coordinates", e); + } + } + + // Draw GFM fronts + x = currFeature.getPoints().get(0).getCoordinate1(); + y = currFeature.getPoints().get(0).getCoordinate2(); + try { + pos1 = referencedGfmCoord(x, y).asLatLon(); + + for (int k = 1; k < numPoints; k++) { + x = currFeature.getPoints().get(k).getCoordinate1(); + y = currFeature.getPoints().get(k).getCoordinate2(); + //convert xy to latlon + pos2 = referencedGfmCoord(x, y).asLatLon(); + + // Connect the dots + if (isFcst) { + gfmFcstWireframeShape.addLineSegment(new Coordinate[] {pos1, pos2 }); + } + else { + wireframeShape.addLineSegment(new Coordinate[] {pos1, pos2 }); + } + pos1 = pos2; + } + } catch (TransformException e) { + throw new VizException(e); + } catch (FactoryException e) { + throw new VizException(e); + } + return images; + } + private PlotObject getImage(HdaHailPoint currPt) throws VizException { PlotObject image = null; @@ -1045,7 +1215,12 @@ public class RadarGraphicsPage implements IRenderable { } // Paint map-relative vectors - if (this.wireframeShape != null) { + // GFM forecast positions should be dashed thick lines + if (this.gfmFcstWireframeShape != null) { + target.drawWireframeShape(this.wireframeShape, this.color, 3.0f); + target.drawWireframeShape(this.gfmFcstWireframeShape, this.color, 3.0f, LineStyle.DASHED); + } + else if (this.wireframeShape != null) { target.drawWireframeShape(this.wireframeShape, this.color, 1.0f); } @@ -1320,4 +1495,13 @@ public class RadarGraphicsPage implements IRenderable { this.tableX = this.startTableX; this.tableY = this.startTableY; } + + /** + * Need to convert x/y to lon/lat for GFM product + */ + public ReferencedCoordinate referencedGfmCoord(double i, double j) { + return new ReferencedCoordinate(rectifyCoordinate(new Coordinate(i * 4, j * 4)), + this.gridGeometry, Type.GRID_CENTER); + } + } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsResource.java index 02bbce856f..a8dc49589b 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/rsc/graphic/RadarGraphicsResource.java @@ -47,6 +47,7 @@ import com.raytheon.viz.radar.interrogators.IRadarInterrogator; import com.raytheon.viz.radar.rsc.AbstractRadarResource; import com.raytheon.viz.radar.rsc.RadarResourceData; import com.raytheon.viz.radar.ui.RadarDisplayManager; +import com.raytheon.viz.radar.VizRadarRecord; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; @@ -61,6 +62,7 @@ import com.vividsolutions.jts.geom.Envelope; * May 13, 2010 mnash Initial creation * Jul 20, 2010 #6187 bkowal The cache will be cleared out every time * a refresh is required. + * 03/05/2013 DCS51 zwang Handle GFM product * * * @@ -161,7 +163,15 @@ public class RadarGraphicsResource extends AbstractRadarResource */ @Override public String[] getUpperText(DataTime time) { - // Upper text would interfere with the table + + VizRadarRecord record = getRadarRecord(time); + + // Use upper text to display gfmCount for GFM (140) + if (record != null && record.getProductCode() == 140) { + return super.getUpperText(time); + } + + // Upper text would interfere with the table return null; } diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/textcontributors/GfmTextContributor.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/textcontributors/GfmTextContributor.java new file mode 100644 index 0000000000..1f4398e333 --- /dev/null +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/textcontributors/GfmTextContributor.java @@ -0,0 +1,70 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.radar.textcontributors; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.raytheon.uf.common.dataplugin.radar.RadarRecord; + + +/** + * + * Format GFM detection count for the upper text + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/05/2013   DCS51      zwang       Initial creation
+ * 
+ * 
+ * + * @author n + * @version 1.0 + */ +public class GfmTextContributor implements IRadarTextContributor { + + @Override + public String contributeText(RadarRecord record) { + + // Get the count of the GFM + int gfmCount = 0; + // One GFM detect ID has 3 Forecast time: 0, 10 minutes, 20 minutes + List stormIDList = record.getStormIDList(); + + if (stormIDList.size() == 0) { + return "GF detection count: " + gfmCount; + } + + Set gfmIDSet = new HashSet (); + + // get GFM IDs + // GFM storm ID is in format gfmID:forecastTime (1:10) + for (int i=0; i * @@ -59,6 +60,7 @@ public class UpperText { @XmlElement(name = "productDependentDate", type = ProdDepDateTextContributor.class), @XmlElement(name = "productDependentUSPMax", type = USPMaxTextContributor.class), @XmlElement(name = "productDependentDVLMax", type = DigitalVilMaxTextContributor.class), + @XmlElement(name = "gfmCount", type = GfmTextContributor.class), @XmlElement(name = "srmMovement", type = SrmMovementTextContributor.class), @XmlElement(name = "srmSource", type = SrmSourceTextContributor.class) }) protected List lines = new ArrayList(); @@ -66,4 +68,4 @@ public class UpperText { @XmlAttribute(name = "productCodes", required = true) protected List codes = new ArrayList(); -} \ No newline at end of file +} diff --git a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarGSMResource.java b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarGSMResource.java index 7fceda18e3..f36e4ca821 100644 --- a/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarGSMResource.java +++ b/cave/com.raytheon.viz.radar/src/com/raytheon/viz/radar/ui/xy/RadarGSMResource.java @@ -54,6 +54,7 @@ import com.raytheon.viz.radar.rsc.RadarResourceData; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 13, 2010 mnash Initial creation + * 03/01/2013 DR 15496 zwang Handled expanded GSM, display more status * * * @@ -147,7 +148,13 @@ public class RadarGSMResource extends AbstractRadarResource { "Op Mode/VCP = " + temp + "/VCP" + message.getVolumeCoveragePattern(), xOffset, yOffset, target, color); - + yOffset += lineSpace; + drawNexradString( + "VCP Supplemental Info = " + + RadarHelper.formatBits( + (short) message.getVcpInfo(), + RadarHelper.vcpInfoStr), xOffset, yOffset, + target, color); yOffset += lineSpace; rdaAvailString = RadarHelper.formatBits( (short) message.getProductAvail(), @@ -161,6 +168,7 @@ public class RadarGSMResource extends AbstractRadarResource { (short) message.getDataTransmissionEnable(), RadarHelper.dteStr), xOffset, yOffset, target, color); + yOffset += lineSpace; if (message.getCmdStatus() > 0) drawNexradString("CMD = Enabled", xOffset, yOffset, target, @@ -188,7 +196,7 @@ public class RadarGSMResource extends AbstractRadarResource { rpgNarrow = RadarHelper.formatBits( (short) message.getRpgNarrowbandStatus(), RadarHelper.rpgNarrowbandStatus); - if ("".equals(temp)) { + if ("".equals(rpgNarrow)) { rpgNarrow = "Normal"; } drawNexradString("RPG Narrowband = " + rpgNarrow, xOffset, yOffset, @@ -242,7 +250,7 @@ public class RadarGSMResource extends AbstractRadarResource { temp = RadarHelper.formatBits((short) message.getRdaAlarms(), RadarHelper.rdaAlarmStr); if ("".equals(temp)) { - temp = "No Data"; + temp = "No Alarms"; } drawNexradString("RDA Alarm = " + temp, xOffset, yOffset, target, @@ -277,7 +285,7 @@ public class RadarGSMResource extends AbstractRadarResource { double[] elevations = message.getElevation().clone(); char[] charArray = Integer.toBinaryString( message.getSuperResolutionCuts()).toCharArray(); - + elevations = Arrays.copyOf(elevations, message.getNumCuts()); Arrays.sort(elevations); for (int left = 0, right = elevations.length - 1; left < right; left++, right--) { diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java index 099e8c73c6..7ee967f8e0 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertBell.java @@ -68,6 +68,8 @@ import com.raytheon.viz.texteditor.alarmalert.util.FlashBellJob; * 03/19/2012 D. Friedman Fix alarming. Disable runloop in open(). * May 18, 2012 jkorman Added flashing alarm image. * Jul 25, 2012 15122 rferrel Add sound delay interval. + * Mar 06 2013 15827 mgamazaychikov Prevent Alarm Bell window from stealing focus + * from Text Editor. * * * @author mnash @@ -219,7 +221,6 @@ public class AlarmAlertBell extends Dialog implements MouseMoveListener, } alarmShell.setVisible(true); alarmShell.pack(); - alarmShell.setActive(); active = true; // Start a new flash job only if one isn't currently running! if (flasher == null) { diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertDlg.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertDlg.java index f934a7a059..5705bd3512 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertDlg.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/AlarmAlertDlg.java @@ -32,6 +32,8 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -71,6 +73,8 @@ import com.raytheon.viz.ui.dialogs.ModeListener; * Sep 9, 2009 mnash Initial creation * Oct 31,2011 8510 rferrel Cleaned up code made more robust * Sep 20,2011 1196 rferrel Change dialogs so they do not block. + * Mar 05,2013 15173 mgamazaychikov Set the initial location and dimension of + * dialog as it is in A1. * * * @@ -116,6 +120,10 @@ public class AlarmAlertDlg extends CaveSWTDialog { private static File currentFile; + private static final int HEIGHT_HINT = 150; + private static final int WIDTH_HINT = 500; + private static Point shellLocation = null; + private ILocalizationFileObserver listener = new ILocalizationFileObserver() { @Override public void fileUpdated(FileUpdatedMessage message) { @@ -182,14 +190,28 @@ public class AlarmAlertDlg extends CaveSWTDialog { preOpened(); opened(); + + setLocation(); } - @Override + /** + * Sets the shell location. + */ + private void setLocation() { + int shellSizeX = getShell().getSize().x; + int shellSizeY = getShell().getSize().y; + Rectangle displayArea = shell.getDisplay().getClientArea(); + int locationX = displayArea.width - shellSizeX; + int locationY = displayArea.y + shellSizeY; + shellLocation = new Point(locationX, locationY); + shell.setLocation(locationX, locationY); + return; + } + + @Override protected void initializeComponents(Shell shell) { setReturnValue(false); - shell.setMinimumSize(500, 0); - // make a composite that covers the entire shell shellComp = new Composite(shell, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); @@ -200,6 +222,11 @@ public class AlarmAlertDlg extends CaveSWTDialog { // Initialize all of the controls and layouts initializeComponents(); + + // Set the shell location + if (shellLocation != null) { + shell.setLocation(shellLocation); + } shell.addShellListener(new ShellAdapter() { public void shellClosed(ShellEvent event) { @@ -535,7 +562,8 @@ public class AlarmAlertDlg extends CaveSWTDialog { alarmAlertLabel.setLayoutData(gd); gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); - gd.heightHint = 200; + gd.widthHint = WIDTH_HINT; + gd.heightHint = HEIGHT_HINT; aaList = new List(shellComp, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); aaList.setLayoutData(gd); aaList.addSelectionListener(new SelectionAdapter() { @@ -567,7 +595,8 @@ public class AlarmAlertDlg extends CaveSWTDialog { proximityAlarmLabel.setLayoutData(gd); gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); - gd.heightHint = 200; + gd.widthHint = WIDTH_HINT; + gd.heightHint = HEIGHT_HINT; paList = new List(shellComp, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); paList.setLayoutData(gd); paList.addSelectionListener(new SelectionAdapter() { diff --git a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/CurrentAlarmQueue.java b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/CurrentAlarmQueue.java index 8d8d0e62ce..31c0300df0 100644 --- a/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/CurrentAlarmQueue.java +++ b/cave/com.raytheon.viz.texteditor/src/com/raytheon/viz/texteditor/alarmalert/dialogs/CurrentAlarmQueue.java @@ -37,6 +37,7 @@ import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -96,6 +97,9 @@ import com.raytheon.viz.ui.dialogs.ModeListener; * Alarm Queue" GUI * Sep 6, 2012 13365 rferrel Accumulate and Display fix. * Sep 25, 2012 1196 lvenable Dialog refactor for AlarmDisplayWindow. + * Mar 05,2013 15173 mgamazaychikov The dimensions and location of closed window + * are saved and set on the next open. + * * * * @author mnash @@ -134,14 +138,26 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements private static CurrentAlarmQueue INSTANCE; - private static Point closeLocation; + /** + * Location and dimensions of the dialog on the close. + */ + private static Point closeLocation = null; + + private static Point closeDimensions = null; /** * Redraw flag indicating if the window should redraw on a resize. */ private boolean canRedraw = true; - private static final int MIN_WIDTH = 350; + /** + * Maximum width,initial height and offset of the window + */ + private static final int SHELL_WIDTH = 350; + + private static final int INIT_HEIGHT = 200; + + private static final int INIT_OFFSET = 15; /** * @param parentShell @@ -237,7 +253,6 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements protected void initializeComponents(final Shell shell) { setReturnValue(false); - shell.setMinimumSize(MIN_WIDTH, 200); // Create the main layout for the shell. font = new Font(shell.getDisplay(), "Helvetica", 11, SWT.BOLD); @@ -246,6 +261,18 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements shellComp = new Composite(shell, SWT.NONE); shellComp.setLayout(constructShellLayout()); shellComp.setLayoutData(gd); + + /* + * DR15173 - Create a listener to save the location + * and dimensions of closed window. + */ + shell.addShellListener(new ShellAdapter() { + public void shellClosed(ShellEvent event) { + closeLocation = getShell().getLocation(); + closeDimensions = getShell().getSize(); + shell.dispose(); + } + }); shell.addControlListener(new ControlAdapter() { @Override @@ -256,25 +283,53 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements final Shell resizedShell = (Shell) e.getSource(); final Point point = resizedShell.getSize(); + final Point location = resizedShell.getLocation(); - if (point.x != MIN_WIDTH) { - canRedraw = false; - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - // resizedShell.setMinimumSize(MIN_WIDTH, point.y); - canRedraw = true; - } - }); - } + canRedraw = false; + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + /* + * DR15173 - Enforce that the window width does not exceed the SHELL_WIDTH. + */ + shell.setBounds(location.x, location.y, SHELL_WIDTH, point.y); + shell.setMinimumSize(SHELL_WIDTH, 0); + canRedraw = true; + } + }); } }); // Initialize all of the controls and layouts initializeComponents(); + + // Set the shell location and dimensions. + setShellGeometry(); } /** + * Sets the geometry for the Current Alarm Queue shell + */ + private void setShellGeometry() { + Rectangle displayArea = shell.getDisplay().getClientArea(); + int locationX = displayArea.x + INIT_OFFSET; + int locationY = displayArea.y + INIT_OFFSET; + int width = SHELL_WIDTH; + int height = INIT_HEIGHT; + if (CurrentAlarmQueue.closeLocation != null) { + locationX = CurrentAlarmQueue.closeLocation.x; + locationY = CurrentAlarmQueue.closeLocation.y; + } + if (CurrentAlarmQueue.closeDimensions != null) { + height = CurrentAlarmQueue.closeDimensions.y; + } + shell.setMinimumSize(width, height); + shell.setLocation(locationX, locationY); + return; + } + + + /** * Initializes each component of the shell */ private void initializeComponents() { @@ -611,25 +666,4 @@ public class CurrentAlarmQueue extends CaveSWTDialog implements protected void opened() { // shell.setSize(600, 300); } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.dialogs.CaveSWTDialog#preOpened() - */ - @Override - protected void preOpened() { - super.preOpened(); - - shell.addShellListener(new ShellAdapter() { - @Override - public void shellClosed(ShellEvent event) { - closeLocation = getShell().getLocation(); - } - }); - - if (closeLocation != null) { - getShell().setLocation(closeLocation); - } - } } diff --git a/cave/com.raytheon.viz.volumebrowser/DataSelectionMenuItems.xml b/cave/com.raytheon.viz.volumebrowser/DataSelectionMenuItems.xml index ac341a164d..c6d6e8a80d 100644 --- a/cave/com.raytheon.viz.volumebrowser/DataSelectionMenuItems.xml +++ b/cave/com.raytheon.viz.volumebrowser/DataSelectionMenuItems.xml @@ -24,7 +24,6 @@ NAMWX NGM80 NICIE - RUC80 TPC-HurWind TPCWindProb WNAwave diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/ModelFamilies.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/ModelFamilies.xml index 54556827c4..dad9eee026 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/ModelFamilies.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/ModelFamilies.xml @@ -58,10 +58,10 @@
- + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -114,10 +114,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -170,10 +170,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -226,10 +226,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -275,10 +275,10 @@ - - + + - + @@ -322,10 +322,10 @@ - - + + - + @@ -369,10 +369,10 @@ - - + + - + @@ -416,10 +416,10 @@ - - + + - + @@ -463,10 +463,10 @@ - - + + - + @@ -510,10 +510,10 @@ - - + + - + @@ -564,10 +564,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -620,10 +620,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -676,10 +676,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -732,10 +732,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -788,10 +788,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -844,10 +844,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + @@ -900,10 +900,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFamilies.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFamilies.xml index a56c423e0f..bb291d2438 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFamilies.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFamilies.xml @@ -88,10 +88,10 @@ - + menuText="RAP13" id="rap13" useReferenceTime="true"> + - + diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFourPanelFamilies.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFourPanelFamilies.xml index 5402739342..0ff4a96526 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFourPanelFamilies.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseFourPanelFamilies.xml @@ -60,10 +60,10 @@ - + menuText="RAP13" id="rap134panel" useReferenceTime="true"> + - + diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseStdEnvPackage.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseStdEnvPackage.xml index 883da804eb..d6415decc9 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseStdEnvPackage.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseStdEnvPackage.xml @@ -43,8 +43,8 @@ - + menuText="RAP13" id="rap13stdenv" useReferenceTime="true"> + diff --git a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseSurfaceFamilies.xml b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseSurfaceFamilies.xml index 8f43c1a04d..6952018a44 100644 --- a/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseSurfaceFamilies.xml +++ b/cave/com.raytheon.viz.volumebrowser/localization/menus/volume/baseSurfaceFamilies.xml @@ -55,8 +55,8 @@ - + menuText="RAP13" id="rap13surface" useReferenceTime="true"> + + diff --git a/deltaScripts/13.3.1/lightsourcecolumn.sql b/deltaScripts/13.3.1/lightsourcecolumn.sql new file mode 100644 index 0000000000..91a42af77e --- /dev/null +++ b/deltaScripts/13.3.1/lightsourcecolumn.sql @@ -0,0 +1,3 @@ +ALTER TABLE binlightning ADD COLUMN lightsource character varying(5); +ALTER TABLE binlightning ALTER COLUMN lightsource SET STORAGE EXTENDED; +ALTER TABLE binlightning ALTER COLUMN lightsource SET DEFAULT 'NLDN'::character varying; diff --git a/edexOsgi/build.edex/esb/conf/modes.xml b/edexOsgi/build.edex/esb/conf/modes.xml index a1d57a7d67..b513457152 100644 --- a/edexOsgi/build.edex/esb/conf/modes.xml +++ b/edexOsgi/build.edex/esb/conf/modes.xml @@ -99,6 +99,7 @@ nctaf-ingest.xml nctext-ingest.xml ncuair-ingest.xml + ntrans-ingest.xml ffmp-ingest.xml diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/ncep/hold/NcInventoryDefinitions/NsharpGridInventory.xml b/edexOsgi/build.edex/esb/data/utility/common_static/base/ncep/hold/NcInventoryDefinitions/NsharpGridInventory.xml new file mode 100644 index 0000000000..6cdc8021c6 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/ncep/hold/NcInventoryDefinitions/NsharpGridInventory.xml @@ -0,0 +1,10 @@ + + + NsharpGridInventory + pluginName,info.datasetId,dataTime + + + + + + diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/radar/ssssRadars.txt b/edexOsgi/build.edex/esb/data/utility/common_static/base/radar/ssssRadars.txt new file mode 100644 index 0000000000..5b3b10bde1 --- /dev/null +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/radar/ssssRadars.txt @@ -0,0 +1 @@ +klgx diff --git a/edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/NAM12.py b/edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/NAM12.py index c3554eabc4..5d07364d34 100644 --- a/edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/NAM12.py +++ b/edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/NAM12.py @@ -47,7 +47,7 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 02/16/12 14439 jdynina modified Haines calculation -# +# 03/04/13 15585 jzeng Modified wxtype range in calcWx() # ## USE_WETBULB = 1 @@ -417,7 +417,7 @@ class NAM12Forecaster(Forecaster): # and add those # prob = popprobs[popcat] - for iwx in range(13): + for iwx in range(1, 13): wxstring = wxtypes[iwx] ispopwx = logical_and(ispopcat, equal(wx, iwx)) some = logical_or.reduce(logical_or.reduce(ispopwx)) diff --git a/edexOsgi/com.raytheon.edex.plugin.radar/src/com/raytheon/edex/plugin/radar/util/RadarMenuUtil.java b/edexOsgi/com.raytheon.edex.plugin.radar/src/com/raytheon/edex/plugin/radar/util/RadarMenuUtil.java index a5652c5d60..be6defcae9 100644 --- a/edexOsgi/com.raytheon.edex.plugin.radar/src/com/raytheon/edex/plugin/radar/util/RadarMenuUtil.java +++ b/edexOsgi/com.raytheon.edex.plugin.radar/src/com/raytheon/edex/plugin/radar/util/RadarMenuUtil.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import com.raytheon.uf.common.dataplugin.radar.util.RadarsInUseUtil; +import com.raytheon.uf.common.dataplugin.radar.util.SsssRadarUtil; import com.raytheon.uf.common.dataplugin.radar.util.TerminalRadarUtils; import com.raytheon.uf.common.menus.xml.CommonAbstractMenuContribution; import com.raytheon.uf.common.menus.xml.CommonIncludeMenuContribution; @@ -49,6 +50,7 @@ import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.edex.menus.AbstractMenuUtil; + /** * Builds menus using JAXB * @@ -58,7 +60,8 @@ import com.raytheon.uf.edex.menus.AbstractMenuUtil; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jun 30, 2010 mnash Initial creation - * Feb 25, 2013 DR14418 zwang Change radar menu to dual pol style + * Feb 25, 2013 DR14418 zwang Change radar menu to dual pol style + * 03/07/2013 DR15495 zwang Handle additional elevation for ssss radars * * * @@ -72,7 +75,7 @@ public class RadarMenuUtil extends AbstractMenuUtil implements .getHandler(RadarMenuUtil.class); private final int NUM_POSSIBLE_RADARS = 25; - + /** * */ @@ -138,9 +141,17 @@ public class RadarMenuUtil extends AbstractMenuUtil implements } includeMenuItem.substitutions = vars; } else { - includeMenuItem.fileName = new File(path - + "dualPol" + File.separator - + "baseLocalRadarMenu.xml"); + if (SsssRadarUtil.isSsssRadar(radars.get(i).toLowerCase())) { + String ssssRadar = radars.get(i).toLowerCase(); + includeMenuItem.fileName = new File(path + + ssssRadar + File.separator + + "baseLocalRadarMenu.xml"); + } + else { + includeMenuItem.fileName = new File(path + + "dualPol" + File.separator + + "baseLocalRadarMenu.xml"); + } vars = new VariableSubstitution[1]; vars[0] = new VariableSubstitution(); vars[0].key = "icao"; @@ -206,9 +217,17 @@ public class RadarMenuUtil extends AbstractMenuUtil implements includeMenuContribution.substitutions = vars; terminal = true; } else { - includeMenuContribution.fileName = new File(path - + "dualPol" + File.separator - + "baseLocalRadarMenu.xml"); + if (SsssRadarUtil.isSsssRadar(radars.get(i).toLowerCase())) { + String ssssRadar = radars.get(i).toLowerCase(); + includeMenuContribution.fileName = new File(path + + ssssRadar + File.separator + + "baseLocalRadarMenu.xml"); + } + else { + includeMenuContribution.fileName = new File(path + + "dualPol" + File.separator + + "baseLocalRadarMenu.xml"); + } vars = new VariableSubstitution[1]; vars[0] = new VariableSubstitution(); vars[0].key = "icao"; diff --git a/edexOsgi/com.raytheon.edex.plugin.radar/utility/common_static/base/radarInfo.txt b/edexOsgi/com.raytheon.edex.plugin.radar/utility/common_static/base/radarInfo.txt index 331f63b908..3b000d835d 100644 --- a/edexOsgi/com.raytheon.edex.plugin.radar/utility/common_static/base/radarInfo.txt +++ b/edexOsgi/com.raytheon.edex.plugin.radar/utility/common_static/base/radarInfo.txt @@ -138,6 +138,7 @@ 136|256 |0 |4.0 |0 |SO |SuperOb |SuperOb |SO |SuperOb| | | | | | | | | |82 | 137|16 |9 |1.0 |230 |ULR |User Selectable Lyr Refl |{S} User Sel Layer Ref ({U}) |{S} ULR |Radial | | | | | | | | | |88 |dBZ 139|0 |0 |0.0 |230 |MRU |Rapid Update Mesocyclone |{S} Meso Rapid Update Page {P}/{P#} |{S} MRU All {P}/{P#} |Graphic|y | | | | | | | | |91 | +140|0 |0 |0.0 |230 |GFM |Gust Front MIGFA |{S} Gust Front MIGFA |{S} GFM |Graphic| | | | | | | | | |28 | 141|0 |0 |0.0 |230 |MD |Mesocyclone |{S} Mesocyclone {P}/{P#} |{S} Mesocyclone {P}/{P#} |Graphic| | | | | | | | | |92 | 143|0 |0 |0.0 |230 |TRU |TVS Rapid Update |{T} {S} TVS Rapid Update Page {P}/{P#} |{S} TRU All Pg {P}/{P#} |Graphic|y | | | | | | | | |93 | 149|0 |0 |0.0 |230 |DMD |Digital Mesocyclone Data |{S} {T} Digital Mesocyclone Data {P}/{P#} |{S} {T} DMD {P}/{P#} |Graphic|y | | | | | | | | |94 | diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ShefDecoder.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ShefDecoder.java index fea8674e45..1387f04e5a 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ShefDecoder.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/ShefDecoder.java @@ -55,6 +55,7 @@ import com.raytheon.uf.edex.decodertools.core.DecoderTools; * 01/14/2009 1864 J. Sanchez Update parse method to handle missing record identifier. * 01/15/2009 1892 J. Sanchez Update parse method, set obsTimeFlag to false when done. * 12/--/2009 jkorman Major refactor - split into ShefDecoder/SHEFParser + * 03/07/2013 15071 W. Kwock Skip empty data files. * */ public class ShefDecoder { @@ -93,6 +94,10 @@ public class ShefDecoder { String traceId = null; + if (data == null || data.length == 0){ + return null; + } + if (headers != null) { traceId = (String) headers.get(DecoderTools.INGEST_FILE_NAME); } diff --git a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/database/PostShef.java b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/database/PostShef.java index 2b9ff78110..e1b9239756 100644 --- a/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/database/PostShef.java +++ b/edexOsgi/com.raytheon.edex.plugin.shef/src/com/raytheon/edex/plugin/shef/database/PostShef.java @@ -104,6 +104,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * Changed default value for alertAlarm * 05/28/2009 2410 J. Sanchez Posted data for unknstnvalue. * 12/11/2009 2488 M. Duff Fixed problem with storing text products. + * 03/07/2013 15545 w. kwock Added Observe time to log * * * @@ -137,7 +138,7 @@ public class PostShef { private static final String POST_START_MSG = "Posting process started for LID [%s] PEDTSEP [%s] value [%s]"; - private static final String LOV_POST_MSG = "Data [%s] for LID [%s] posted to the latestObsTable for PE [%s]"; + private static final String LOV_POST_MSG = "Data [%s] ObsTime[%s] for LID [%s] posted to the latestObsValue for PE [%s]"; private static final String SHEF_ON = "ON"; @@ -714,7 +715,8 @@ public class PostShef { qualityCode, prodId, prodTime, shefPostDuplicateDef, stats, postDate); if (dataLog) { - log.info(String.format(LOV_POST_MSG, dataValue, locId, + log.info(String.format(LOV_POST_MSG, dataValue, + data.getObservationTimeObj(), locId, data.getPhysicalElement().getCode())); } } diff --git a/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/impl/TextLightningParser.java b/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/impl/TextLightningParser.java index 5f080b4e69..67c5f4389b 100644 --- a/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/impl/TextLightningParser.java +++ b/edexOsgi/com.raytheon.edex.plugin.textlightning/src/com/raytheon/edex/plugin/textlightning/impl/TextLightningParser.java @@ -44,6 +44,7 @@ import com.raytheon.uf.common.dataplugin.binlightning.impl.LtgStrikeType; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Dec 15, 2009 3983 jsanchez Initial creation + * Feb 27, 2013 DCS 152 jgerth/elau Support for WWLLN * * * @@ -66,7 +67,10 @@ public class TextLightningParser { // 10:03:24:13:35:00.68 72.000 157.000 -14.2 1 private static final String LIGHTNING_PTRN_B = "(\\d{2,2}:\\d{2,2}:\\d{2,2}:\\d{2,2}:\\d{2,2}:\\d{2,2}\\.\\d{2,2})\\s{1,}(\\d{1,2}\\.\\d{2,})\\s{1,}(-?\\d{1,3}\\.\\d{2,})\\s{1,}(-?\\d{1,3}\\.\\d{1,})\\s{1,}(\\d{1,2}).*"; private static final Pattern LTG_PTRN_B = Pattern.compile(LIGHTNING_PTRN_B); - + + // 2012-03-14T18:58:00,-5.5021,-45.9669,0.0,1 + private static final String LIGHTNING_PTRN_C = "(\\d{4,4}-\\d{2,2}-\\d{2,2})T(\\d{2,2}:\\d{2,2}:\\d{2,2}),(-?\\d{1,2}.\\d{1,4}),(-?\\d{1,3}.\\d{1,4}),(0.0),(1)"; + private static final Pattern LTG_PTRN_C = Pattern.compile(LIGHTNING_PTRN_C); /** * default constructor. @@ -169,6 +173,7 @@ public class TextLightningParser { strike.setMillis(0); strike.setMsgType(LtgMsgType.STRIKE_MSG_FL); strike.setType(LtgStrikeType.STRIKE_CG); + strike.setLightSource("UNKN"); reports.add(strike); } else { m = LTG_PTRN_B.matcher(line); @@ -206,11 +211,49 @@ public class TextLightningParser { strike.setMillis(Integer.parseInt(msec)*10); strike.setMsgType(LtgMsgType.STRIKE_MSG_FL); strike.setType(LtgStrikeType.STRIKE_CG); + strike.setLightSource("UNKN"); reports.add(strike); + } else { + m = LTG_PTRN_C.matcher(line); + if (m.matches()) { + String[] datec = m.group(1).split("-"); + String[] timec = m.group(2).split(":"); + String year = datec[0]; + String month = datec[1]; + String day = datec[2]; + String hour = timec[0]; + String min = timec[1]; + String sec = timec[2]; + String msec = "0"; + String sls = "WWLLN"; + + String latitude = m.group(3); + String longitude= m.group(4); + String strength = m.group(5); + String count = m.group(6); + + strike = new LightningStrikePoint( + Double.parseDouble(latitude),Double.parseDouble(longitude)); + strike.setStrikeStrength(Double.parseDouble(strength)); + strike.setStrikeCount(Integer.parseInt(count)); + strike.setMonth(Integer.parseInt(month)); + strike.setDay(Integer.parseInt(day)); + strike.setYear(Integer.parseInt(year)); + strike.setHour(Integer.parseInt(hour)); + strike.setMinute(Integer.parseInt(min)); + strike.setSecond(Integer.parseInt(sec)); + strike.setMillis(Integer.parseInt(msec)*10); + strike.setMsgType(LtgMsgType.STRIKE_MSG_FL); + strike.setType(LtgStrikeType.STRIKE_CG); + strike.setLightSource(sls); + reports.add(strike); + } else { + logger.error("Cannot match lightning input " + line); + } } } } catch (NumberFormatException e){ - logger.debug("Invalid numerical value", e); + logger.debug("Invalid numerical value", e); } } } diff --git a/edexOsgi/com.raytheon.edex.plugin.textlightning/utility/edex_static/base/distribution/textlightning.xml b/edexOsgi/com.raytheon.edex.plugin.textlightning/utility/edex_static/base/distribution/textlightning.xml index 55f357382e..f7ff1aa5f7 100644 --- a/edexOsgi/com.raytheon.edex.plugin.textlightning/utility/edex_static/base/distribution/textlightning.xml +++ b/edexOsgi/com.raytheon.edex.plugin.textlightning/utility/edex_static/base/distribution/textlightning.xml @@ -21,4 +21,5 @@ AWIPS_* FAA_* + WWLLN_* \ No newline at end of file diff --git a/edexOsgi/com.raytheon.edex.rpgenvdata/src/com/raytheon/edex/rpgenvdata/RPGEnvironmentalDataManager.java b/edexOsgi/com.raytheon.edex.rpgenvdata/src/com/raytheon/edex/rpgenvdata/RPGEnvironmentalDataManager.java index 0211fedc9a..30dbcfa3d7 100644 --- a/edexOsgi/com.raytheon.edex.rpgenvdata/src/com/raytheon/edex/rpgenvdata/RPGEnvironmentalDataManager.java +++ b/edexOsgi/com.raytheon.edex.rpgenvdata/src/com/raytheon/edex/rpgenvdata/RPGEnvironmentalDataManager.java @@ -37,6 +37,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.measure.converter.UnitConverter; +import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; @@ -45,6 +46,7 @@ import org.apache.tools.bzip2.CBZip2OutputStream; import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.geometry.DirectPosition2D; +import org.opengis.metadata.spatial.PixelOrientation; import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; @@ -92,7 +94,7 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery; * ?? ?? Initial Creation * 1-3-2013 DR 15667 M.Porricelli Made EnvironParamsLevelTable.xml * accessible from SITE level -* +* 03/04/2013 DR 14770 D. Friedman Correct clipped grid coordinates. **/ public class RPGEnvironmentalDataManager { private static final transient IUFStatusHandler statusHandler = UFStatus @@ -538,26 +540,24 @@ public class RPGEnvironmentalDataManager { GridGeometry2D gridGeom = MapUtil.getGridGeometry(gridCoverage); GridEnvelope2D ge = gridGeom.getGridRange2D(); int maxY = ge.getHigh(1); - MathTransform llToGrid; MathTransform gridToLL; + MathTransform llToCRS; + MathTransform crsToGrid; - llToGrid = TransformFactory.latLonToGrid(gridGeom, - PixelInCell.CELL_CORNER); + llToCRS = MapUtil.getTransformFromLatLon(gridGeom.getCoordinateReferenceSystem()); + crsToGrid = gridGeom.getCRSToGrid2D(PixelOrientation.CENTER); gridToLL = TransformFactory.gridToLatLon(gridGeom, - PixelInCell.CELL_CORNER); + PixelInCell.CELL_CENTER); DirectPosition2D stationLL = new DirectPosition2D( radarStation.getLon(), radarStation.getLat()); - DirectPosition2D stationIJx = new DirectPosition2D(0, 0); + DirectPosition2D stationXY = new DirectPosition2D(0, 0); - llToGrid.transform(stationLL, stationIJx); + llToCRS.transform(stationLL, stationXY); - long radarI = Math.round(stationIJx.x); - long radarJ = maxY - Math.round(stationIJx.y); int i1, j1, i2, j2; + double delta; - // TODO: get this from the math transform?... - long radInPointsI, radInPointsJ; if (gridCoverage instanceof LambertConformalGridCoverage) { LambertConformalGridCoverage lcgc = (LambertConformalGridCoverage) gridCoverage; Unit spacingUnit = Unit.valueOf(lcgc.getSpacingUnit()); @@ -569,11 +569,8 @@ public class RPGEnvironmentalDataManager { "Grid spacing units (%s) not compatible clip radius units (%s)", spacingUnit, clipRadUnit)); } - UnitConverter uc = spacingUnit.getConverterTo(clipRadUnit); - radInPointsI = Math.round(configuration.clipRadius.value - / uc.convert(lcgc.getDx())); - radInPointsJ = Math.round(configuration.clipRadius.value - / uc.convert(lcgc.getDy())); + UnitConverter uc = clipRadUnit.getConverterTo(SI.METER); + delta = uc.convert(configuration.clipRadius.value); result.tangentPoint = new DirectPosition2D(lcgc.getLov(), lcgc.getLatin1()); @@ -582,10 +579,18 @@ public class RPGEnvironmentalDataManager { "Only Lambert conformal projection is supported"); } - i1 = (int) (radarI - radInPointsI); - i2 = (int) (radarI + radInPointsI); - j1 = (int) (radarJ - radInPointsJ); - j2 = (int) (radarJ + radInPointsJ); + double cx1 = stationXY.x - delta; + double cy1 = stationXY.y - delta; + double cx2 = stationXY.x + delta; + double cy2 = stationXY.y + delta; + + DirectPosition2D c = new DirectPosition2D(); + crsToGrid.transform(new DirectPosition2D(cx1, cy1), c); + i1 = (int) Math.round(c.x); + j1 = maxY - (int) Math.round(c.y); + crsToGrid.transform(new DirectPosition2D(cx2, cy2), c); + i2 = (int) Math.round(c.x); + j2 = maxY - (int) Math.round(c.y); if (i1 < ge.getLow(0) || i2 > ge.getHigh(0) || j1 < ge.getLow(1) || j2 > ge.getHigh(1)) { diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java index 67e0fd5d92..83a6b9f80f 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java @@ -68,6 +68,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * 20080107 720 jkorman remove default assignments from attributes. * 20080708 1174 jkorman Added persistenceTime handling. * 20090206 1990 bphillip Removed populateDataStore method + * 20130227 DCS 152 jgerth/elau Support for WWLLN and multiple sources * * * @author jkorman @@ -135,6 +136,13 @@ public class BinLightningRecord extends @DynamicSerializeElement @XmlAttribute private Calendar stopTime; + + // JJG - source of lightning data + @Column(length = 5) + @DataURI(position = 3) + @XmlAttribute + @DynamicSerializeElement + private String lightSource; // Used to track @Transient @@ -207,7 +215,24 @@ public class BinLightningRecord extends * A strike report to add. */ public void addStrike(LightningStrikePoint strike) { - if (insertIndex < obsTimes.length) { + // jjg add + if (lightSource == null) { + if (strike.getLightSource() == null) { + lightSource = (String) "NLDN"; + } else if (strike.getLightSource().isEmpty()) { + lightSource = (String) "UNKN"; + } else { + lightSource = (String) strike.getLightSource(); + } + } else { + if (strike.getLightSource() == null) { + lightSource = (String) "NLDN"; + } else if (!lightSource.equals(strike.getLightSource())) + lightSource = (String) "UNKN"; + } + // end + + if (insertIndex < obsTimes.length) { long t1 = startTimeMillis; Calendar c = TimeTools.getBaseCalendar(strike.getYear(), @@ -380,6 +405,24 @@ public class BinLightningRecord extends return strikeCounts; } + /** + * JJG - Get the lightning source + * + * @return + */ + public String getLightSource() { + return lightSource; + } + + /** + * JJG - Set the lightning source + * + * @param lightSource + */ + public void setLightSource(String lightSource) { + this.lightSource = lightSource; + } + /** * Get the IDecoderGettable reference for this record. * diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/LightningStrikePoint.java b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/LightningStrikePoint.java index 62d9cb26ed..4d6f6071bb 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/LightningStrikePoint.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/impl/LightningStrikePoint.java @@ -31,6 +31,7 @@ import com.raytheon.uf.edex.decodertools.core.BasePoint; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20070810 379 jkorman Initial Coding from prototype. + * 20130227 DCS 152 jgerth Support for WWLLN and multiple sources * * * @@ -49,6 +50,9 @@ public class LightningStrikePoint extends BasePoint // Number of strikes for this record. private int strikeCount; + + // JJG - Lightning data source + private String lightSource; /** * Construct a LightningStrikePoint using given data. @@ -150,6 +154,24 @@ public class LightningStrikePoint extends BasePoint this.msgType = msgType; } + /** + * JJG - Get the lightning source + * @return + */ + public String getLightSource() + { + return lightSource; + } + + /** + * JJG - Set the lightning source + * @param lightSource + */ + public void setLightSource(String lightSource) + { + this.lightSource = lightSource; + } + /** * Format this lightning strike report using the NCDC strike observation format. * diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPTemplates.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPTemplates.java index 3cf3a8edfa..4b7b38b257 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPTemplates.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPTemplates.java @@ -82,7 +82,7 @@ import com.vividsolutions.jts.io.WKBReader; * 07/29/09 2152 D. Hladky Initial release * 07/09/10 3914 D. Hladky Localization work * 12/13/10 7484 D. Hladky Service Backup - * + * 03/01/13 DR13228 G. Zhang Add VGB county and related code * * * @author dhladky @@ -105,6 +105,8 @@ public class FFMPTemplates { private HashMap>>> virtualGageBasinsInParentPfaf = null; + private HashMap>>> vgbsInCounty = null;// DR 13228 + private HashMap>> virtualDomainMap = null; private Map>> cwaRawGeometries = new ConcurrentHashMap>>(); @@ -224,7 +226,8 @@ public class FFMPTemplates { virtualGageBasinsInParentPfaf = new HashMap>>>(); ftcm = FFMPTemplateConfigurationManager.getInstance(); frcm = FFMPRunConfigurationManager.getInstance(); - + vgbsInCounty = new HashMap>>>();// DR 13228 + try { ftcm.readConfigXml(); @@ -1346,7 +1349,9 @@ public class FFMPTemplates { writeVGBFile(virtuals, cwa, dataKey); } } else { + virtuals = readVGBFile("VIRTUAL", cwa, dataKey); + } return virtuals; @@ -1379,26 +1384,49 @@ public class FFMPTemplates { virtualmap.put(cwa, map); + HashMap> vgbMap = new HashMap>();// DR 13228 + HashMap> virtualGageBasins = new HashMap>( (int) (map.size() * 1.3)); + for (FFMPVirtualGageBasinMetaData vgb : map.values()) { - Long id = vgb.getParentPfaf(); + Long id = vgb.getParentPfaf(); + String stateCommaCnty=vgb.getState()+", "+vgb.getCounty();// DR 13228 see getCountyStateName(,) + ArrayList list = virtualGageBasins - .get(id); + .get(id); + ArrayList list2=vgbMap.get(stateCommaCnty.toUpperCase());// DR 13228 + if (list == null) { list = new ArrayList(); virtualGageBasins.put(id, list); } - list.add(vgb); + list.add(vgb); + + // DR 13228 + if(list2==null){ + list2=new ArrayList(); + vgbMap.put(stateCommaCnty.toUpperCase(),list2); + } + list2.add(vgb);// DR 13228 } + HashMap>> vMapCounty = vgbsInCounty.get(dataKey);// DR 13228 HashMap>> virtualMapPfaf = virtualGageBasinsInParentPfaf .get(dataKey); if (virtualMapPfaf == null) { virtualMapPfaf = new HashMap>>(); } + + // DR 13228 + if(vMapCounty==null) { + vMapCounty = new HashMap>>();// DR 13228 + } + vMapCounty.put(cwa, vgbMap);// DR 13228 + vgbsInCounty.put(dataKey,vMapCounty);// DR 13228 + virtualMapPfaf.put(cwa, virtualGageBasins); virtualGageBasinsInParentPfaf.put(dataKey, virtualMapPfaf); } @@ -1583,9 +1611,9 @@ public class FFMPTemplates { * @param pfaf * @return */ - public synchronized ArrayList getVirtualGageBasinLookupIds( - String dataKey, Long pfaf) { - + public synchronized /*ArrayList*/ArrayList getVirtualGageBasinLookupIds( + String dataKey, Long pfaf, String huc, String rowName) { +if(isCountyRow(huc, rowName)) return getVgbLookupIdsByCounty(dataKey, pfaf, huc, rowName); HashMap>> virtualMap = virtualGageBasinsInParentPfaf .get(dataKey); @@ -1596,15 +1624,15 @@ public class FFMPTemplates { if (map != null) { ArrayList list = map.get(pfaf); if (list != null && !list.isEmpty()) { - ArrayList result = new ArrayList(); + ArrayList result = new ArrayList();//ArrayList vgblist = new ArrayList(); for (FFMPVirtualGageBasinMetaData md : list) - result.add(md.getLookupId()); - return result; + /*vgblist.add(md);*/result.add(md.getLookupId()); + return /*vgblist;*/result; } } } - return new ArrayList(); + return /*new ArrayList();*/new ArrayList(); } @@ -2321,4 +2349,44 @@ public class FFMPTemplates { } } } + + /** + * DR 13228 + */ + public static boolean isCountyRow(String huc, String rowName){ + + return "COUNTY".equals(huc) && rowName.contains(",");// see getCountyStateName(,) + + } + + /** + * DR 13228 + */ + public synchronized ArrayList getVgbLookupIdsByCounty( + String dataKey, Long pfaf, String huc, String rowName) { + + String stateCommaCnty = rowName;//.split(",")[1]; + + HashMap>> virtualMap = vgbsInCounty.get(dataKey); + + for (DomainXML domain : domains) { + + HashMap> map = virtualMap + .get(domain.getCwa()); + if (map != null) { + ArrayList list = map.get(stateCommaCnty.trim().toUpperCase()); + + if (list != null && !list.isEmpty()) { + ArrayList result = new ArrayList(); + for (FFMPVirtualGageBasinMetaData md : list){ + result.add(md.getLookupId()); + + } + return result; + } + } + } + return new ArrayList(); + } + } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPUtils.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPUtils.java index a7d3fb4e02..623d3aab02 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPUtils.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPUtils.java @@ -79,8 +79,8 @@ import com.vividsolutions.jts.io.WKTWriter; * ------------ ---------- ----------- -------------------------- * 06/22/09 2152 D. Hladky Initial release * 06/18/12 DR 15108 G. Zhang Fix County FIPS 4-digit issue + * 03/01/13 DR 13228 G. Zhang Add state for VGB query and related code * - * * @author dhladky * @version 1 */ @@ -195,7 +195,7 @@ public class FFMPUtils { double extent, String cwa, String mode) { LinkedHashMap virtualBasins = new LinkedHashMap(); - String sql = "SELECT lid, county, name, lat, lon FROM location " + String sql = "SELECT lid, county, name, lat, lon, state FROM location "// DR 13228 state added + "where lid in " + "(select distinct(lid) from IngestFilter " + "where pe in ('PC', 'PP') " + "and ingest = 'T' " + "and dur < 2000)"; @@ -800,7 +800,7 @@ public class FFMPUtils { public static Geometry getCwaGeometry(String cwa, String mode) { // convert buffer to km, then degrees String sql = "Select asBinary(" - + ScanUtils.getStandardResolutionLevel("cwa") + + ScanUtils.getHighResolutionLevel("cwa") // DR 13228.getStandardResolutionLevel("cwa") + ") from mapdata.cwa where cwa = '" + cwa + "'"; ISpatialQuery sq = null; @@ -1214,7 +1214,11 @@ public class FFMPUtils { if ((lat != Double.NaN) && (lon != Double.NaN)) { basin.setCoordinate(new Coordinate(lon, lat)); } - + + if (dbResult[5] != null) { + basin.setState((String) dbResult[5]);// DR 13228 + } + return basin; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPVirtualGageBasinMetaData.java b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPVirtualGageBasinMetaData.java index fc45cd29b1..80b70c2157 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPVirtualGageBasinMetaData.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.ffmp/src/com/raytheon/uf/common/dataplugin/ffmp/FFMPVirtualGageBasinMetaData.java @@ -14,7 +14,7 @@ import com.vividsolutions.jts.geom.Coordinate; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 01may10 3937 dhladky Setup - * + * 01mar13 DR13228 gzhang Add basin state * * * @author dhladky @@ -39,6 +39,10 @@ public class FFMPVirtualGageBasinMetaData implements ISerializableObject { /** basin county **/ @DynamicSerializeElement public String county; + + /** basin state DR 13228 **/ + @DynamicSerializeElement + public String state; /** basin county **/ @DynamicSerializeElement @@ -88,6 +92,14 @@ public class FFMPVirtualGageBasinMetaData implements ISerializableObject { this.county = county; } + public String getState() { + return state;// DR 13228 + } + + public void setState(String state) { + this.state = state;// DR 13228 + } + public Long getParentPfaf() { return parentPfaf; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarDataPoint.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarDataPoint.java index 2ab28dff5f..70f273ec40 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarDataPoint.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarDataPoint.java @@ -26,6 +26,7 @@ import com.raytheon.uf.common.dataplugin.radar.level3.StormIDPacket; import com.raytheon.uf.common.dataplugin.radar.level3.SymbologyPacket; import com.raytheon.uf.common.dataplugin.radar.level3.SymbologyPoint; import com.raytheon.uf.common.dataplugin.radar.level3.DMDPacket.DMDAttributeIDs; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket.GFMAttributeIDs; import com.raytheon.uf.common.dataplugin.radar.level3.StormIDPacket.StormIDPoint; import com.raytheon.uf.common.dataplugin.radar.level3.generic.GenericDataComponent; import com.raytheon.uf.common.serialization.ISerializableObject; @@ -42,6 +43,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 17, 2009 2000 askripsk Initial creation + * 03/04/2013 DCS51 zwang Handle GFM product * * * @@ -286,8 +288,23 @@ public class RadarDataPoint implements ISerializableObject { */ public void addDisplayData(int type, T point) { - String stormID = point.getValue(DMDAttributeIDs.ASSOCIATE_STORM_ID - .toString()); + + String stormID = ""; + // DMD + if (type == 149) { + stormID = point.getValue(DMDAttributeIDs.ASSOCIATE_STORM_ID + .toString()); + } + // GFM + else if (type == 140) { + stormID = point.getValue(GFMAttributeIDs.DETECT_ID + .toString()); + String deltaT = point.getValue(GFMAttributeIDs.FORECAST_DELTA_T + .toString()); + + stormID += ":"; + stormID += deltaT; + } if (!"".equalsIgnoreCase(stormID)) { this.stormID = stormID; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarRecord.java index f5861b687c..ca3d1c2b25 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/RadarRecord.java @@ -59,6 +59,8 @@ import com.raytheon.uf.common.dataplugin.radar.level3.CellTrendDataPacket; import com.raytheon.uf.common.dataplugin.radar.level3.CellTrendVolumeScanPacket; import com.raytheon.uf.common.dataplugin.radar.level3.DMDPacket; import com.raytheon.uf.common.dataplugin.radar.level3.DMDPacket.DMDAttributeIDs; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket; +import com.raytheon.uf.common.dataplugin.radar.level3.GFMPacket.GFMAttributeIDs; import com.raytheon.uf.common.dataplugin.radar.level3.DataLevelThreshold; import com.raytheon.uf.common.dataplugin.radar.level3.GSMBlock.GSMMessage; import com.raytheon.uf.common.dataplugin.radar.level3.GenericDataPacket; @@ -114,6 +116,7 @@ import com.vividsolutions.jts.geom.Coordinate; * getPersistenceTime() from new IPersistable * 10/09/2007 465 randerso Updated to better represent level 3 data * 20071129 472 jkorman Added IDecoderGettable interface. + * 03/04/2013 DCS51 zwang Handle MIGFA product * * * @author bphillip @@ -1034,9 +1037,19 @@ public class RadarRecord extends PersistablePluginDataObject implements private void addPacketData(double i, double j, String stormID, int type, RadarProductType productType, T currData, boolean needToConvert) { - if (needToConvert) { - // switch to lat/lon - Coordinate coor = convertStormLatLon(i, j); + + // Convert x/y to lon/lat + if (needToConvert) { + Coordinate coor; + + // for MIGFA, i/j unit is 1km, for other radar products, unit is 1/4km + if (type == 140) { + coor = convertStormLatLon(i * 4.0, j * 4.0); + } + else { + coor = convertStormLatLon(i, j); + } + i = coor.x; j = coor.y; } @@ -1310,7 +1323,45 @@ public class RadarRecord extends PersistablePluginDataObject implements currFeature, convertLatLon); } continue PACKET; - } else if (currPacket instanceof GenericDataPacket) { + } else if (currPacket instanceof GFMPacket) { + // Need to get each component/feature out and located the + // thing + GFMPacket packet = (GFMPacket) currPacket; + + // need to convert x/y to lon/lat + convertLatLon = true; + + Map map = new HashMap(); + + for (GenericDataParameter param : packet.getParams() + .values()) { + + GFMAttributeIDs id = null; + id = GFMAttributeIDs.getAttribute(param.getId()); + + if (id != null) { + for (MapValues vals : MapValues.values()) { + if (id.getName().equals(vals.getName())) { + map.put(vals, param.getValue()); + } + } + } + } + getMapRecordVals().put(MapValues.GFM_TYPE, map); + + AreaComponent currFeature; + for (GenericDataComponent currComponent : packet + .getFeatures().values()) { + currFeature = (AreaComponent) currComponent; + //first point of GFM + i = currFeature.getPoints().get(0).getCoordinate1(); + j = currFeature.getPoints().get(0).getCoordinate2(); + + addPacketData(i, j, type, RadarProductType.GENERIC, + currFeature, convertLatLon); + } + continue PACKET; + }else if (currPacket instanceof GenericDataPacket) { // Generic Packet will contain most of the data for the // product, so, in general, nothing probably needs to be // done here diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GFMPacket.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GFMPacket.java new file mode 100644 index 0000000000..ac11cda541 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GFMPacket.java @@ -0,0 +1,219 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.dataplugin.radar.level3; + +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.raytheon.uf.common.dataplugin.radar.level3.generic.GenericDataComponent; +import com.raytheon.uf.common.dataplugin.radar.level3.generic.GenericDataParameter; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +/** + * This is a GFM centric version of the Generic Packet + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/04/13     DCS51      zwang       Initial creation
+ * 
+ * 
+ * + * @author zwang + * @version 1.0 + */ + +@DynamicSerialize +public class GFMPacket extends GenericDataPacket { + public static enum GFMAttributeIDs { + DETECT_ID("detect_num"), FORECAST_DELTA_T("forecast_delta_t"), + PROPU("propU"), PROPV("propV"), + AVG_SPEED("avg_speed"), AVG_DIRECTION("avg_direction"), + WINDBEHINDU("windBehindU"), WINDBEHINDV("windBehindV"), + WINDBEHINDX("windBehindX"), WINDBEHINDY("windBehindY"), + WSHAZARD("wsHazard"); + + private String name; + + private GFMAttributeIDs(String name) { + this.name = name; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name + * the name to set + */ + public void setName(String name) { + this.name = name; + } + + public static GFMAttributeIDs getAttribute(String name) { + for (GFMAttributeIDs id : GFMAttributeIDs.values()) { + if (name.equals(id.getName())) { + return id; + } + } + return null; + } + + @Override + public String toString() { + return name; + } + } + + private static final int GFM_PRODUCT_CODE = 140; + + @DynamicSerializeElement + private List featureIDs; + + // Organizes the components/features based on gfm_ID(DETECT_ID:DELTA_T) + @DynamicSerializeElement + private HashMap features; + + @DynamicSerializeElement + private HashMap params; + + static { + PacketFactory.registerGenericPacketType(GFMPacket.class, + GFM_PRODUCT_CODE); + } + + public GFMPacket(int packetId, DataInputStream in) throws IOException { + super(packetId, in); + } + + public GFMPacket() { + + } + + public String getValue(String featureID, GFMAttributeIDs attributeID) { + String rval = ""; + + rval = features.get(featureID).getValue(attributeID.toString()); + + return rval; + } + + /** + * @return the featureIDs + */ + public List getFeatureIDs() { + return featureIDs; + } + + /** + * @param featureIDs + * the featureIDs to set + */ + public void setFeatureIDs(List featureIDs) { + this.featureIDs = featureIDs; + } + + /** + * @return the features + */ + public HashMap getFeatures() { + return features; + } + + /** + * @param features + * the features to set + */ + public void setFeatures(HashMap features) { + this.features = features; + } + + public GenericDataComponent getFeature(String eventID) { + GenericDataComponent rval = null; + + rval = this.features.get(eventID); + + return rval; + } + + public HashMap getParams() { + return params; + } + + public void setParams(HashMap params) { + this.params = params; + } + + /** + * Converts the components to GFM Features and groups by gfmID + */ + private void groupFeatures() { + features = new HashMap(); + featureIDs = new ArrayList(); + params = new HashMap(); + String detectID = ""; + String deltaT = ""; + String gfmID = ""; + + for (GenericDataParameter param : parameters) { + params.put(param.getId(), param); + } + // Get the DETECT_ID out of each component + for (GenericDataComponent currFeature : components) { + // Loop through the values for the DETECT_ID + for (GenericDataParameter currParam : currFeature.getParameters()) { + if (currParam.getId().equalsIgnoreCase( + GFMAttributeIDs.DETECT_ID.toString())) + detectID = currParam.getValue(); + if (currParam.getId().equalsIgnoreCase( + GFMAttributeIDs.FORECAST_DELTA_T.toString())) + deltaT = currParam.getValue(); + } + + // combine the detectID and deltaT to form a new ID (gfmID) + gfmID = detectID + ":" + deltaT; + features.put(gfmID, currFeature); + featureIDs.add(gfmID); + } + } + + @Override + protected void init(DataInputStream in) throws IOException { + super.init(in); + + // Relates all of the GFM feature based on the gfmID + groupFeatures(); + } + + @Override + public String toString() { + return super.toString(); + } +} diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GSMBlock.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GSMBlock.java index f7868a6c7d..fcfc24e587 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GSMBlock.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/GSMBlock.java @@ -35,6 +35,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * ------------ ---------- ----------- -------------------------- * 1-26-2009 mnash Initial creation * 1-20-2010 DR 4059 Zihou Wang Decode more GSM status + * 03/01/13 DR15496 zwang Decode expanded GSM * * * @author mnash @@ -121,6 +122,9 @@ public class GSMBlock extends AbstractBlock implements ISerializableObject { @DynamicSerializeElement public int buildVersion; + @DynamicSerializeElement + public int vcpInfo; + /** * @return the mode */ @@ -420,7 +424,22 @@ public class GSMBlock extends AbstractBlock implements ISerializableObject { public void setBuildVersion(int buildVersion) { this.buildVersion = buildVersion; } + + /** + * @return the vcpSupInfo + */ + public int getVcpInfo() { + return vcpInfo; + } + /** + * @param vcpSupInfo + * the vcpSupInfo to set + */ + public void setVcpInfo(int vcpInfo) { + this.vcpInfo = vcpInfo; + } + @Override public String toString() { return String @@ -459,10 +478,9 @@ public class GSMBlock extends AbstractBlock implements ISerializableObject { message.operabilityStatus = in.readShort(); message.volumeCoveragePattern = in.readShort(); message.numCuts = in.readShort(); - message.elevation = new double[20]; + message.elevation = new double[25]; for (int j = 0; j < 20; j++) { message.elevation[j] = in.readShort(); - } message.rdaStatus = in.readShort(); message.rdaAlarms = in.readShort(); @@ -480,7 +498,17 @@ public class GSMBlock extends AbstractBlock implements ISerializableObject { message.rdaChannelNum = in.readShort(); in.skip(4); message.buildVersion = in.readShort(); - + + // GSM size is increased to 200 bytes since Build 14.0 + if (message.buildVersion >= 140) { + for (int j = 0; j < 5; j++) { + message.elevation[20+j] = in.readShort(); + } + message.vcpInfo = in.readShort(); + } + else { + message.vcpInfo = 0; + } } @Override diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/PacketFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/PacketFactory.java index cac4332f14..ea202f3a91 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/PacketFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/PacketFactory.java @@ -38,7 +38,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * + * 03/04/2013 DCS51 zwang Handle GFM product * * * @@ -103,6 +103,7 @@ public class PacketFactory { GenericDataPacket.class.getName(), LinkedContourVectorPacket.class.getName(), UnlinkedContourVectorPacket.class.getName(), + GFMPacket.class.getName(), DMDPacket.class.getName() }; // Properties props = diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/generic/AreaComponent.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/generic/AreaComponent.java index 5c69506536..11447fe523 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/generic/AreaComponent.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/level3/generic/AreaComponent.java @@ -37,7 +37,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * May 19, 2009 askripsk Initial creation - * + * 03/04/2013 DCS51 zwang Handle product GFM * * * @author askripsk @@ -223,7 +223,7 @@ public class AreaComponent extends GenericDataComponent { @Override public String toString() { - return "Point 1: " + coordinate1 + " Point 2: " + coordinate2; + return "Coord 1: " + coordinate1 + " Coord 2: " + coordinate2; } } @@ -238,23 +238,22 @@ public class AreaComponent extends GenericDataComponent { @Override public void parseData(DataInputStream in) throws IOException { - this.setParameters(GenericUtil.parseParameters(in)); - - GenericUtil.handlePointer(in); - - // Set the format of the component - this.setFormat(AreaPointFormat.valueOf(in.readByte())); - - // Skip the two bytes between the type and format, since the encoding - // is: 0x?00? - in.readShort(); + this.setParameters(GenericUtil.parseParameters(in)); + // Set the format of the component (0x?000?) + this.setFormat(AreaPointFormat.valueOf(in.readShort())); + // Read in the byte that determines the type - this.setType(AreaPointType.valueOf(in.readByte())); - + this.setType(AreaPointType.valueOf(in.readShort())); + // Get the number of points in the component int pointCount = in.readInt(); - + + if (pointCount != 0) { + // redundant + pointCount = in.readInt(); + } + AreaPoint currPoint; for (int i = 0; i < pointCount; i++) { currPoint = new AreaPoint(); @@ -262,7 +261,7 @@ public class AreaComponent extends GenericDataComponent { currPoint.parseData(in); points.add(currPoint); - } + } } /** diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/RadarConstants.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/RadarConstants.java index f2a3e3e0b9..11a2b6d1e5 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/RadarConstants.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/RadarConstants.java @@ -31,6 +31,7 @@ import java.util.regex.Pattern; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 18, 2009 mnash Initial creation + * 03/04/2013 DCS51 zwang Add a map type for GFM product * * * @@ -47,7 +48,7 @@ public class RadarConstants { DMD_TYPE, RCM_TYPE, STI_TYPE, MESO_TYPE, LEG_MESO_TYPE, TVS_TYPE, VAD_TYPE, HAIL_TYPE, STORM_ID, DMD_ELEV_TIMES( "elev_time"), DMD_ELEV_ANGLES("elev_angle"), DMD_LAST_ELEV( "last_elev_flag"), DMD_AVG_SPD("avg_spd"), DMD_AVG_DIR( - "avg_dir"), HI_MAX_HAIL_SIZE, STI_AVG_SPEED, STI_AVG_DIRECTION, HI_POSH, HI_POH, STI_AZIMUTH_DIRECTION, STI_AZIMUTH_RANGE, STI_MOVEMENT_DIRECTION, STI_MOVEMENT_SPEED, STI_FORECAST_15_DIRECTION, STI_FORECAST_15_RANGE, STI_FORECAST_30_DIRECTION, STI_FORECAST_30_RANGE, STI_FORECAST_45_DIRECTION, STI_FORECAST_45_RANGE, STI_FORECAST_60_DIRECTION, STI_FORECAST_60_RANGE, STI_ERROR_FCST, STI_ERROR_MEAN, STI_DEF_DIR, STI_DEF_SPD, STI_MAX_TIME, STI_NUM_PAST_VOLS, STI_CORR_SPD, STI_THRESH_MIN_SPD, STI_ALLOW_ERROR, STI_FORECAST_INT, STI_NUM_INT, STI_ERROR_INT, MESO_STORM_ID, MESO_FEATURE_TYPE, MESO_BASE_KFT, MESO_TOP_KFT, MESO_AZIMUTH_DIRECTION, MESO_AZIMUTH_RANGE, MESO_HGT, MESO_DIAM_RAD, MESO_DIAM_AZ, MESO_SHEAR, VAD_U, VAD_W, VAD_V, VAD_DIR, VAD_SPD, VAD_RMS, VAD_DIV, VAD_SRNG, VAD_ELEV, VAD_ANALYSIS_SLANT_RNG, VAD_BEGIN_AZIMUTH_ANGLE, VAD_END_AZIMUTH_ANGLE, VAD_NUM_PASSES, VAD_RMS_THRESHOLD, TVS_FEATURE_TYPE, TVS_AZIMUTH, TVS_RANGE, TVS_AVGDV, TVS_LLDV, TVS_MXDV, TVS_DVHGT, TVS_DEPTH, TVS_BASE, TVS_TOP, TVS_MXSHR, TVS_SHRHGT, TVS_MIN_REFLECT, TVS_CIRC_RADIUS_1, TVS_CIRC_RADIUS_2, TVS_VECTOR_VEL_DIFF, TVS_MAX_PATTERN_VEC_RANGE, TVS_CIRC_RADIUS_RANGE, TVS_MAX_PATTER_VECTOR_HEIGHT, TVS_MAX_2D_FEATURES, TVS_MAX_NUM_PATTERN_VECTORS, TVS_MIN_2D_FEATURES, TVS_DIFF_VEL_1, TVS_DIFF_VEL_2, TVS_DIFF_VEL_3, TVS_DIFF_VEL_4, TVS_DIFF_VEL_5, TVS_DIFF_VEL_6, TVS_MIN_3D_FEATURE_DEPTH, TVS_MIN_3D_FEATURE_LOW_LVL_DELTA, TVS_MIN_TVS_DELTA_VEL, TVS_MAX_3D_FEATURES, TVS_MAX_TVS, TVS_MAX_ELEVATED_TVS, TVS_MIN_VECTORS, TVS_MIN_TVS_BASE_HEIGHT, TVS_2D_VECTOR_RADIAL_DISTANCE, TVS_MIN_TVS_ELEVATION, TVS_2D_VECTOR_AZIMUTHAL_DIST, TVS_MIN_AVG_DELTA_VEL_HEIGHT, TVS_2D_FEATURE_ASPECT_RATIO, TVS_MAX_STORM_ASSOCIATION_DIST, MESO_CIRC_ID, MESO_SR, MESO_RV, MESO_DV, MESO_BASE, MESO_DEPTH, MESO_DEPTH_PERCENT, MESO_MAX_RV, MESO_MAX_RV_SPD, MESO_TVS_TYPE, MESO_MOTION_DIR, MESO_MOTION_SPD, MESO_MSI, RCM_RDA_SITE, RCM_TIME, RCM_PROD_CAT, RCM_OPER_MODE, RCM_SCAN_STRAT, RCM_TOT_INTENS, RCM_REFL_STRING, RCM_MT_HGT, RCM_MT_LOC, RCM_NCEN, RCM_CENTROIDS, VAD_WINDS, RCM_NUM_TVS, RCM_NUM_MESO, RCM_NUM_CENTROIDS, RCM_CENT, RCM_MESO, RCM_TVS; + "avg_dir"), HI_MAX_HAIL_SIZE, STI_AVG_SPEED, STI_AVG_DIRECTION, HI_POSH, HI_POH, STI_AZIMUTH_DIRECTION, STI_AZIMUTH_RANGE, STI_MOVEMENT_DIRECTION, STI_MOVEMENT_SPEED, STI_FORECAST_15_DIRECTION, STI_FORECAST_15_RANGE, STI_FORECAST_30_DIRECTION, STI_FORECAST_30_RANGE, STI_FORECAST_45_DIRECTION, STI_FORECAST_45_RANGE, STI_FORECAST_60_DIRECTION, STI_FORECAST_60_RANGE, STI_ERROR_FCST, STI_ERROR_MEAN, STI_DEF_DIR, STI_DEF_SPD, STI_MAX_TIME, STI_NUM_PAST_VOLS, STI_CORR_SPD, STI_THRESH_MIN_SPD, STI_ALLOW_ERROR, STI_FORECAST_INT, STI_NUM_INT, STI_ERROR_INT, MESO_STORM_ID, MESO_FEATURE_TYPE, MESO_BASE_KFT, MESO_TOP_KFT, MESO_AZIMUTH_DIRECTION, MESO_AZIMUTH_RANGE, MESO_HGT, MESO_DIAM_RAD, MESO_DIAM_AZ, MESO_SHEAR, VAD_U, VAD_W, VAD_V, VAD_DIR, VAD_SPD, VAD_RMS, VAD_DIV, VAD_SRNG, VAD_ELEV, VAD_ANALYSIS_SLANT_RNG, VAD_BEGIN_AZIMUTH_ANGLE, VAD_END_AZIMUTH_ANGLE, VAD_NUM_PASSES, VAD_RMS_THRESHOLD, TVS_FEATURE_TYPE, TVS_AZIMUTH, TVS_RANGE, TVS_AVGDV, TVS_LLDV, TVS_MXDV, TVS_DVHGT, TVS_DEPTH, TVS_BASE, TVS_TOP, TVS_MXSHR, TVS_SHRHGT, TVS_MIN_REFLECT, TVS_CIRC_RADIUS_1, TVS_CIRC_RADIUS_2, TVS_VECTOR_VEL_DIFF, TVS_MAX_PATTERN_VEC_RANGE, TVS_CIRC_RADIUS_RANGE, TVS_MAX_PATTER_VECTOR_HEIGHT, TVS_MAX_2D_FEATURES, TVS_MAX_NUM_PATTERN_VECTORS, TVS_MIN_2D_FEATURES, TVS_DIFF_VEL_1, TVS_DIFF_VEL_2, TVS_DIFF_VEL_3, TVS_DIFF_VEL_4, TVS_DIFF_VEL_5, TVS_DIFF_VEL_6, TVS_MIN_3D_FEATURE_DEPTH, TVS_MIN_3D_FEATURE_LOW_LVL_DELTA, TVS_MIN_TVS_DELTA_VEL, TVS_MAX_3D_FEATURES, TVS_MAX_TVS, TVS_MAX_ELEVATED_TVS, TVS_MIN_VECTORS, TVS_MIN_TVS_BASE_HEIGHT, TVS_2D_VECTOR_RADIAL_DISTANCE, TVS_MIN_TVS_ELEVATION, TVS_2D_VECTOR_AZIMUTHAL_DIST, TVS_MIN_AVG_DELTA_VEL_HEIGHT, TVS_2D_FEATURE_ASPECT_RATIO, TVS_MAX_STORM_ASSOCIATION_DIST, MESO_CIRC_ID, MESO_SR, MESO_RV, MESO_DV, MESO_BASE, MESO_DEPTH, MESO_DEPTH_PERCENT, MESO_MAX_RV, MESO_MAX_RV_SPD, MESO_TVS_TYPE, MESO_MOTION_DIR, MESO_MOTION_SPD, MESO_MSI, RCM_RDA_SITE, RCM_TIME, RCM_PROD_CAT, RCM_OPER_MODE, RCM_SCAN_STRAT, RCM_TOT_INTENS, RCM_REFL_STRING, RCM_MT_HGT, RCM_MT_LOC, RCM_NCEN, RCM_CENTROIDS, VAD_WINDS, RCM_NUM_TVS, RCM_NUM_MESO, RCM_NUM_CENTROIDS, RCM_CENT, RCM_MESO, RCM_TVS, GFM_TYPE; private String name; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/SsssRadarUtil.java b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/SsssRadarUtil.java new file mode 100644 index 0000000000..33579f2b58 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.radar/src/com/raytheon/uf/common/dataplugin/radar/util/SsssRadarUtil.java @@ -0,0 +1,128 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.dataplugin.radar.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.raytheon.uf.common.localization.LocalizationContext; +import com.raytheon.uf.common.localization.LocalizationFile; +import com.raytheon.uf.common.localization.PathManager; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; +import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; + +/** + * TODO Add Description + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 03/07/13     DR15495    zwang       Handle SSSS radars
+ * 
+ * 
+ * + * @author zwang + * @version 1.0 + */ + +public class SsssRadarUtil { + + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(RadarsInUseUtil.class); + + private static final IUFStatusHandler handler = UFStatus + .getHandler(RadarsInUseUtil.class); + + private static List ssssRadars; + + private static boolean parsed = false; + + private static synchronized void parseFile() throws IOException{ + PathManager pm = (PathManager) PathManagerFactory.getPathManager(); + LocalizationContext context = pm.getContext(LocalizationType.COMMON_STATIC, + LocalizationLevel.BASE); + + if (parsed) { + return; + } + + parsed = true; + ssssRadars = new ArrayList(); + LocalizationFile file = pm.getLocalizationFile(context, "radar" + + File.separator + "ssssRadars.txt"); + + if (!file.exists()) { + statusHandler.info("File ssssRadars.txt not found "); + } + else{ + BufferedReader buf = new BufferedReader(new FileReader( + file.getFile())); + String temp = buf.readLine(); + while (temp != null) { + temp = temp.trim(); + if (temp.startsWith("#")) { + // Skip comment lines if any + break; + } else if (!temp.trim().isEmpty()) { + ssssRadars.add(temp); + } + temp = buf.readLine(); + } + buf.close(); + } + } + + public static List getSsssRadars() { + if (parsed) + return ssssRadars; + else { + try { + parseFile(); + } catch (IOException e) { + handler.handle(Priority.ERROR, "Error occurred looking up radars", + e); + } + } + return ssssRadars; + } + + public static boolean isSsssRadar(String radar) { + if (!parsed) { + try { + parseFile(); + } catch (IOException e) { + handler.handle(Priority.ERROR, "Error occurred looking up radars", + e); + } + } + + return ssssRadars.contains(radar); + } + +} diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.qc/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.edex.plugin.qc/META-INF/MANIFEST.MF index d9f7a9a3d2..412794d00c 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.qc/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.edex.plugin.qc/META-INF/MANIFEST.MF @@ -12,7 +12,8 @@ Require-Bundle: com.raytheon.edex.common;bundle-version="1.11.17", com.raytheon.uf.common.python;bundle-version="1.11.17", org.jep;bundle-version="1.0.0", com.raytheon.uf.common.localization;bundle-version="1.11.17", - javax.persistence;bundle-version="1.0.0" + javax.persistence;bundle-version="1.0.0", + ucar.nc2;bundle-version="1.0.0" Export-Package: com.raytheon.uf.edex.plugin.qc.common Import-Package: com.raytheon.edex.uengine.tasks.query, com.raytheon.uf.common.message.response, diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/QCScanner.java b/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/QCScanner.java index 7cd845f7d4..a9e8cb558f 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/QCScanner.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/QCScanner.java @@ -21,31 +21,51 @@ package com.raytheon.uf.edex.plugin.qc; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.Arrays; +import java.util.Date; import java.util.Map; +import java.util.regex.Pattern; -import jep.JepException; +import ucar.ma2.Array; +import ucar.ma2.ArrayChar; +import ucar.ma2.Section; +import ucar.nc2.Attribute; +import ucar.nc2.NetcdfFile; +import ucar.nc2.Variable; import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.qc.QCRecord; import com.raytheon.uf.common.dataplugin.qc.internal.QCPaths; -import com.raytheon.uf.common.python.thread.PythonScriptManager; -import com.raytheon.uf.common.python.thread.PythonScriptManager.ScriptRequest; +import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.edex.database.plugin.PluginFactory; +import com.raytheon.uf.edex.plugin.qc.dao.QCDao; +/** + * Scans NetCDF files generated by A1 legacy applications and generates + * QCRecord instances that refer to their records. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 2010-12-03   #4775      D. Friedman Initial version
+ * ...
+ * 2013-03-07   DR 15842   D. Friedman Use Java NetCDF library instead of pupynere 
+ * 
+ * 
+ * + * @author dfriedma + * @version 1.0 + */ public class QCScanner { - private static PythonScriptManager psm; - - static { - try { - psm = new PythonScriptManager( - QCPaths.getPythonScriptPath("qcScanner.py"), - QCPaths.PYTHON_INCLUDE_PATH, 2); - } catch (JepException e) { - throw new RuntimeException( - "Failed to initialize QCScanner Python scripting. QCScanner python calls will Fail!"); - } - } + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(QCScanner.class); private Integer maxRecordsInChunk; @@ -55,41 +75,14 @@ public class QCScanner { } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private PluginDataObject[] scan() throws Exception, JepException { - // TODO: need to prevent multiple threads from accessing... - List result = new ArrayList(); - + public void scanInChunks() throws Exception { Map paths = QCPaths.getPaths(); - for (String key : paths.keySet()) { - HashMap args = new HashMap(); - File qcDataFile = paths.get(key); - args.put("directory", qcDataFile.getPath()); - args.put("qcType", key); - - psm.callScript(new ScriptRequest("init", args)); - args = null; - if (maxRecordsInChunk != null) { - args = new HashMap(); - args.put("max_records", maxRecordsInChunk); - } - result.addAll((List) psm - .callScript(new ScriptRequest("scan", args))); - } - - return (PluginDataObject[]) result.toArray(new PluginDataObject[result - .size()]); - } - - public void scanInChunks() throws Exception, JepException { - PluginDataObject[] chunk; - while (true) { - chunk = scan(); - if (chunk != null && chunk.length > 0) - target.acceptRecords(chunk); - else - break; + for (Map.Entry entry : paths.entrySet()) { + String type = entry.getKey(); + File directory = entry.getValue(); + QCDirectoryScanner scanner = new QCDirectoryScanner(type, directory); + scanner.scan(); } } @@ -123,4 +116,112 @@ public class QCScanner { this.target = target; } + private static final Pattern filePattern = Pattern.compile("^\\d+_\\d+$"); + + // Approximate total max length of vars listed in idVariables attributes. + private static final int ID_LENGTH = 24; + + private class QCDirectoryScanner { + private String qcType; + private File directory; + private QCDao qcDao; + + public QCDirectoryScanner(String qcType, File directory) { + this.qcType = qcType; + this.directory = directory; + } + + public void scan() throws PluginException { + qcDao = (QCDao) PluginFactory.getInstance().getPluginDao("qc"); + + for (String fn : directory.list()) { + if (filePattern.matcher(fn).matches()) { + try { + scanFile(fn); + } catch (Exception e) { + statusHandler.error(String.format("error reading %s/%s: %s", + directory, fn, e.getMessage()), e); + } + } + } + } + + private void scanFile(String fn) throws Exception { + NetcdfFile nc = NetcdfFile.open(new File(directory, fn).toString()); + try { + int index = qcDao.getMaxRecordIndex(qcType, fn); + if (index < 0) + index = 0; + else + index += 1; + int nRecords = nc.getUnlimitedDimension().getLength(); + if (index >= nRecords) + return; + String[] idVariablesNames = nc + .findGlobalAttribute("idVariables") + .getStringValue().split(","); + Variable[] idVariables = new Variable[idVariablesNames.length]; + for (int i = 0; i < idVariables.length; ++i) + idVariables[i] = nc.findVariable(idVariablesNames[i]); + Variable vObsTime = nc.findVariable("observationTime"); + double vObsTimeFillValue = vObsTime.findAttribute("_FillValue").getNumericValue().doubleValue(); + Double vObsTimeMissingValue = null; + Attribute a = vObsTime.findAttribute("missing_value"); + if (a != null) + vObsTimeMissingValue = a.getNumericValue().doubleValue(); + Variable vLat = nc.findVariable("latitude"); + Variable vLon = nc.findVariable("longitude"); + Variable vElev = nc.findVariable("elevation"); + + while (index < nRecords) { + PluginDataObject[] records = new PluginDataObject[Math.min(maxRecordsInChunk, nRecords - index)]; + int[] ofs = new int[] { index }; + int[] len = new int[] { records.length }; + Section sec = new Section(); + sec.appendRange(index, index + records.length - 1); + sec.appendRange(); + Array dObsTime = vObsTime.read(ofs, len); + Array dLat = vLat.read(ofs, len); + Array dLon = vLon.read(ofs, len); + Array dElev = vElev.read(ofs, len); + ArrayChar[] dIDs = new ArrayChar[idVariables.length]; + for (int i = 0; i < dIDs.length; ++i) + dIDs[i] = (ArrayChar) idVariables[i].read(sec); + int ri = 0; + int oi = 0; + while (ri < records.length) { + QCRecord r = new QCRecord(); + r.setPluginName("qc"); + double obsTime = dObsTime.getDouble(ri); + if (obsTime != vObsTimeFillValue && + (vObsTimeMissingValue == null || + vObsTimeMissingValue != obsTime)) { + r.setDataTime(new DataTime(new Date((long)(obsTime * 1000)))); + SurfaceObsLocation loc = new SurfaceObsLocation(); + loc.assignLocation(dLat.getDouble(ri), dLon.getDouble(ri)); + loc.setElevation(dElev.getInt(ri)); + StringBuilder stationId = new StringBuilder(ID_LENGTH); + for (ArrayChar idArray : dIDs) { + stationId.append(idArray.getString(ri)); + } + loc.setStationId(stationId.toString()); + r.setLocation(loc); + r.setNcSet(fn); + r.setNcIndex(index); + r.setQcType(qcType); + r.constructDataURI(); + records[oi++] = r; + } + ++index; + ++ri; + } + if (oi < records.length) + records = Arrays.copyOf(records, oi); + target.acceptRecords(records); + } + } finally { + nc.close(); + } + } + } } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/dao/QCDao.java b/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/dao/QCDao.java index 5b7f2f3b20..46405834a0 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/dao/QCDao.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.qc/src/com/raytheon/uf/edex/plugin/qc/dao/QCDao.java @@ -268,12 +268,12 @@ public class QCDao extends PointDataPluginDao { "Operation not supported on the QC plugin"); } - // Support function for Python script. Too much of a pain to get it to work - // in Python - public int getMaxRecordIndex(String setName) + /** Support function for the QCScanner */ + public int getMaxRecordIndex(String qcType, String setName) throws DataAccessLayerException { DatabaseQuery q = new DatabaseQuery(daoClass.getName()); q.setMaxResults(1); + q.addQueryParam("qcType", qcType); q.addQueryParam("ncSet", setName); q.addReturnedField("pointDataView.curIdx"); q.addOrder("pointDataView.curIdx", false); diff --git a/nativeLib/build.native/build-notification.sh b/nativeLib/build.native/build-notification.sh index 93d40400d9..2bb5a68c36 100644 --- a/nativeLib/build.native/build-notification.sh +++ b/nativeLib/build.native/build-notification.sh @@ -122,7 +122,7 @@ if [ $? -ne 0 ]; then echo "ERROR: Unable to create directory - ${BUILD_ROOT}/workspace_/notification/bin." exit 1 fi -mkdir ${BUILD_ROOT}/awips2/notification/lib +mkdir ${BUILD_ROOT}/awips2/notification/${FOSS_LIB_DIR} if [ $? -ne 0 ]; then echo "ERROR: Unable to create directory - ${BUILD_ROOT}/workspace_/notification/lib." exit 1 @@ -141,14 +141,14 @@ fi # libedex_com.so -> notification/lib if [ -f "${BUILD_ROOT}/workspace_/edex_com/${BUILD_CONFIGURATION}/libedex_com.so" ]; then cp -v "${BUILD_ROOT}/workspace_/edex_com/${BUILD_CONFIGURATION}/libedex_com.so" \ - ${BUILD_ROOT}/awips2/notification/lib + ${BUILD_ROOT}/awips2/notification/${FOSS_LIB_DIR} if [ $? -ne 0 ]; then echo "ERROR: Failed to copy libedex_com.so to its destination." exit 1 fi else cp -v "${WORKSPACE}/edex_com/${BUILD_CONFIGURATION}/libedex_com.so" \ - ${BUILD_ROOT}/awips2/notification/lib + ${BUILD_ROOT}/awips2/notification/${FOSS_LIB_DIR} if [ $? -ne 0 ]; then echo "ERROR: Failed to copy libedex_com.so to its destination." exit 1 @@ -192,14 +192,14 @@ if [ $? -ne 0 ]; then fi # org.apache.thrift lib -> notification/lib cp -vPf ${BUILD_ROOT}/workspace_/org.apache.thrift/${FOSS_LIB_DIR}/* \ - ${BUILD_ROOT}/awips2/notification/lib + ${BUILD_ROOT}/awips2/notification/${FOSS_LIB_DIR} if [ $? -ne 0 ]; then echo "ERROR: Failed to copy the org.apache.thrift lib to its destination." exit 1 fi # org.apache.qpid lib -> notification/lib cp -vPf ${BUILD_ROOT}/workspace_/org.apache.qpid/${FOSS_LIB_DIR}/* \ - ${BUILD_ROOT}/awips2/notification/lib + ${BUILD_ROOT}/awips2/notification/${FOSS_LIB_DIR} if [ $? -ne 0 ]; then echo "ERROR: Failed to copy the org.apache.qpid lib to its destination." exit 1 diff --git a/ncep/com.raytheon.uf.edex.ncep.feature/feature.xml b/ncep/com.raytheon.uf.edex.ncep.feature/feature.xml index d2d1940b9a..a435e60aea 100644 --- a/ncep/com.raytheon.uf.edex.ncep.feature/feature.xml +++ b/ncep/com.raytheon.uf.edex.ncep.feature/feature.xml @@ -31,7 +31,6 @@ version="0.0.0" unpack="false"/> - + + + + diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/src/gov/noaa/nws/ncep/common/dataplugin/ncairep/NcAirepRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/src/gov/noaa/nws/ncep/common/dataplugin/ncairep/NcAirepRecord.java index 156b519095..d8297739f5 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/src/gov/noaa/nws/ncep/common/dataplugin/ncairep/NcAirepRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ncairep/src/gov/noaa/nws/ncep/common/dataplugin/ncairep/NcAirepRecord.java @@ -268,7 +268,7 @@ public class NcAirepRecord extends PluginDataObject implements ISpatialEnabled, @Embedded @DynamicSerializeElement - private PointDataView pdv; + private PointDataView pointDataView; /** * @@ -866,7 +866,7 @@ public class NcAirepRecord extends PluginDataObject implements ISpatialEnabled, */ @Override public PointDataView getPointDataView() { - return this.pdv; + return this.pointDataView; } /* @@ -878,7 +878,7 @@ public class NcAirepRecord extends PluginDataObject implements ISpatialEnabled, */ @Override public void setPointDataView(PointDataView pdv) { - this.pdv = pdv; + this.pointDataView = pdv; } } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/.classpath b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.classpath similarity index 88% rename from ncep/gov.noaa.nws.ncep.metParameters/.classpath rename to ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.classpath index 4d017d74db..ad32c83a78 100644 --- a/ncep/gov.noaa.nws.ncep.metParameters/.classpath +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.classpath @@ -3,6 +3,5 @@ - diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.project b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.project new file mode 100644 index 0000000000..17faaa5c8f --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.project @@ -0,0 +1,28 @@ + + + gov.noaa.nws.ncep.common.dataplugin.ntrans + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.settings/org.eclipse.jdt.core.prefs b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..910602e68d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Tue Feb 19 10:47:44 EST 2013 +eclipse.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.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.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..08e5f04928 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/MANIFEST.MF @@ -0,0 +1,21 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Ntrans Plug-in +Bundle-SymbolicName: gov.noaa.nws.ncep.common.dataplugin.ntrans +Bundle-Version: 1.0.0.qualifier +Eclipse-RegisterBuddy: com.raytheon.edex.common, com.raytheon.uf.common.serialization +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Require-Bundle: com.raytheon.edex.common;bundle-version="1.11.7", + javax.persistence;bundle-version="1.0.0", + org.apache.log4j;bundle-version="1.0.0", + org.apache.commons.logging;bundle-version="1.0.4", + gov.noaa.nws.ncep.common;bundle-version="1.0.0", + org.eclipse.ui;bundle-version="3.4.1", + org.eclipse.core.runtime;bundle-version="3.4.0" +Export-Package: gov.noaa.nws.ncep.common.dataplugin.ntrans, + gov.noaa.nws.ncep.common.dataplugin.ntrans.dao +Bundle-Vendor: AWIPS II migration +Import-Package: com.raytheon.uf.edex.decodertools.core, + com.raytheon.uf.edex.decodertools.time, + com.raytheon.uf.edex.wmo.message, + org.junit diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject new file mode 100644 index 0000000000..5e43035463 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -0,0 +1 @@ +gov.noaa.nws.ncep.common.dataplugin.ntrans.NtransRecord diff --git a/ncep/gov.noaa.nws.ncep.metParameters/build.properties b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/build.properties similarity index 100% rename from ncep/gov.noaa.nws.ncep.metParameters/build.properties rename to ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/build.properties diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/component-deploy.xml b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/component-deploy.xml new file mode 100644 index 0000000000..82d3846fdd --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/component-deploy.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd.ecl b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/gov.noaa.nws.ncep.common.dataplugin.ntrans.ecl similarity index 100% rename from ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd.ecl rename to ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/gov.noaa.nws.ncep.common.dataplugin.ntrans.ecl diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java new file mode 100644 index 0000000000..50c96bb228 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/NtransRecord.java @@ -0,0 +1,187 @@ +/** + * NtransRecord + * + * This java class performs the mapping to the database table for NTRANS Metafiles + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 02/2013 B. Hebbard Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.common.dataplugin.ntrans; + +import java.util.Calendar; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import com.raytheon.uf.common.dataplugin.IDecoderGettable; +import com.raytheon.uf.common.dataplugin.annotations.DataURI; +import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; +import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; +import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; + +@Entity +@Table(name = "ntrans", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) +@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) +@DynamicSerialize +public class NtransRecord extends PersistablePluginDataObject { + + private static final long serialVersionUID = 1L; + + @Column + @DataURI(position=1) + @XmlElement + @DynamicSerializeElement + private String validTimeString; + + @Column + @DataURI(position=2) + @XmlElement + @DynamicSerializeElement + private String productNameString; + + @Column + @DataURI(position=3) + @XmlElement + @DynamicSerializeElement + private Calendar startTime; + + @Column + @DataURI(position=4) + @XmlElement + @DynamicSerializeElement + private Calendar endTime; + + @Column + //@DataURI(position=5) + @XmlElement + @DynamicSerializeElement + private String reportType; + + @Column + //@DataURI(position=6) + @XmlElement + @DynamicSerializeElement + private String inputFile; + + @Transient + private byte[] convertedMessage; + + @Column + //@DataURI(position=7) + @XmlElement + @DynamicSerializeElement + private int recordLength; + + /** + * Default Constructor + */ + public NtransRecord() { + } + + /** + * Constructs an NTRANS record from a dataURI + * + * @param uri + * The dataURI + */ + public NtransRecord(String uri) { + super(uri); + } + + public String getValidTimeString() { + return validTimeString; + } + + public void setValidTimeString(String validTimeString) { + this.validTimeString = validTimeString; + } + + public String getProductNameString() { + return productNameString; + } + + public void setProductNameString(String productNameString) { + this.productNameString = productNameString; + } + + public Calendar getStartTime() { + return startTime; + } + + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + public Calendar getEndTime() { + return endTime; + } + + public void setEndTime(Calendar endTime) { + this.endTime = endTime; + } + + public String getReportType() { + return reportType; + } + + public void setReportType(String reportType) { + this.reportType = reportType; + } + + public String getInputFile() { + return inputFile; + } + + public void setInputFile(String inputFile) { + this.inputFile = inputFile; + } + + public byte[] getConvertedMessage() { + return convertedMessage; + } + + public void setConvertedMessage(byte[] convertedMessage) { + this.convertedMessage = convertedMessage; + } + + @Override + public IDecoderGettable getDecoderGettable() { + // TODO Auto-generated method stub + return null; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + @Override + public void setIdentifier(Object dataURI) { + this.identifier = dataURI; + } + + public int getRecordLength() { + return recordLength; + } + + public void setRecordLength(int recordLength) { + this.recordLength = recordLength; + } +} diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/NtransDao.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/NtransDao.java new file mode 100644 index 0000000000..92a32bf069 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/NtransDao.java @@ -0,0 +1,90 @@ +/** + * NtransDao + * + * This java class performs the dataaccess layer functionality to the HDF5 for ASCAT,Quikscat + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 11/2009 Uma Josyula Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ +package gov.noaa.nws.ncep.common.dataplugin.ntrans.dao; + +import java.util.ArrayList; +import java.util.List; + + +import gov.noaa.nws.ncep.common.dataplugin.ntrans.NtransRecord; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.dataplugin.persist.IPersistable; +import com.raytheon.uf.common.datastorage.IDataStore; +import com.raytheon.uf.common.datastorage.StorageException; +import com.raytheon.uf.common.datastorage.records.ByteDataRecord; +import com.raytheon.uf.common.datastorage.records.IDataRecord; +import com.raytheon.uf.edex.database.plugin.PluginDao; + +public class NtransDao extends PluginDao{ + public NtransDao(String pluginName) throws PluginException { + super(pluginName); + } + + @Override + protected IDataStore populateDataStore(IDataStore dataStore, + IPersistable record) throws StorageException { + + NtransRecord ntransRecord = (NtransRecord) record; + int msgLength = (ntransRecord.getConvertedMessage()).length; + long nx,ny; + System.out.println("@@ came into NtransDao"); + + nx = 1; + ny = msgLength; + + long[] sizes = new long[] { nx, ny }; + IDataRecord storageRecord = new ByteDataRecord("Ntrans", ntransRecord.getDataURI(), + (byte[]) ntransRecord.getConvertedMessage(), 2, sizes); + System.out.println("@@ came into NtransDao and storageRecord set"); + + storageRecord.setCorrelationObject(ntransRecord); + dataStore.addDataRecord(storageRecord); + System.out.println("@@ NtransDao about to return datastore"); + + return dataStore; + } + + + + @Override + public List getHDF5Data(List objects, + int tileSet) throws PluginException { + List retVal = new ArrayList(); + System.out.println("In decoderDao getHDF5Data"); + + for (PluginDataObject obj : objects) { + IDataRecord[] record = null; + if (obj instanceof IPersistable) { + /* connect to the data store and retrieve the data */ + try { + record = getDataStore((IPersistable) obj).retrieve( + obj.getDataURI()); + } catch (Exception e) { + throw new PluginException( + "Error retrieving NTRANS HDF5 data", e); + } + retVal.add(record); + } + } + + return retVal; + } + + + + +} + + diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/package-info.java new file mode 100644 index 0000000000..4735d700ad --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/dao/package-info.java @@ -0,0 +1,4 @@ +/** +* Contains data access object for NTRANS data. +*/ +package gov.noaa.nws.ncep.common.dataplugin.ntrans.dao; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/package-info.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/package-info.java new file mode 100644 index 0000000000..d7cb36ab4b --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.ntrans/src/gov/noaa/nws/ncep/common/dataplugin/ntrans/package-info.java @@ -0,0 +1,4 @@ +/** +* Contains table record for decoder plug-ins +*/ +package gov.noaa.nws.ncep.common.dataplugin.ntrans; diff --git a/ncep/gov.noaa.nws.ncep.common.dataplugin.solarimage/src/gov/noaa/nws/ncep/common/dataplugin/solarimage/SolarImageRecord.java b/ncep/gov.noaa.nws.ncep.common.dataplugin.solarimage/src/gov/noaa/nws/ncep/common/dataplugin/solarimage/SolarImageRecord.java index f197f90d29..0d8f76a2b6 100644 --- a/ncep/gov.noaa.nws.ncep.common.dataplugin.solarimage/src/gov/noaa/nws/ncep/common/dataplugin/solarimage/SolarImageRecord.java +++ b/ncep/gov.noaa.nws.ncep.common.dataplugin.solarimage/src/gov/noaa/nws/ncep/common/dataplugin/solarimage/SolarImageRecord.java @@ -26,6 +26,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ---------------- -------------------------- * 12/05/2012 865 sgurung, qzhou Initial creation. + * 01/07/2013 865 qzhou Added "Site" for Halpha. + * 01/28/2013 865 qzhou Changed float to double for intTime. * * * @author sgurung, qzhou @@ -77,7 +79,16 @@ public class SolarImageRecord extends PersistablePluginDataObject { @Column @DynamicSerializeElement @XmlAttribute - private float intTime; + private Double intTime; + + /** + * Site + */ + @DataURI(position = 5) + @Column + @DynamicSerializeElement + @XmlAttribute + private String site; /** * hdu containing image data @@ -90,6 +101,7 @@ public class SolarImageRecord extends PersistablePluginDataObject { /** * report type */ + @DataURI(position = 6) @Column @DynamicSerializeElement @XmlAttribute @@ -167,7 +179,7 @@ public class SolarImageRecord extends PersistablePluginDataObject { /** * @return the intTime */ - public float getIntTime() { + public Double getIntTime() { return intTime; } @@ -175,10 +187,25 @@ public class SolarImageRecord extends PersistablePluginDataObject { * @param intTime * the intTime to set */ - public void setIntTime(float intTime) { + public void setIntTime(Double intTime) { this.intTime = intTime; } + /** + * @return the site + */ + public String getSite() { + return site; + } + + /** + * @param site + * the site to set + */ + public void setSite(String site) { + this.site = site; + } + /** * @return the reportType */ diff --git a/ncep/gov.noaa.nws.ncep.common.staticdata/src/gov/noaa/nws/ncep/common/staticdata/IStaticDataProvider.java b/ncep/gov.noaa.nws.ncep.common.staticdata/src/gov/noaa/nws/ncep/common/staticdata/IStaticDataProvider.java index 2fef1455be..71aa511009 100644 --- a/ncep/gov.noaa.nws.ncep.common.staticdata/src/gov/noaa/nws/ncep/common/staticdata/IStaticDataProvider.java +++ b/ncep/gov.noaa.nws.ncep.common.staticdata/src/gov/noaa/nws/ncep/common/staticdata/IStaticDataProvider.java @@ -22,6 +22,7 @@ import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; /** * Interface that contains all methods to load NCEP static data. @@ -34,7 +35,8 @@ import com.vividsolutions.jts.geom.MultiPolygon; * 02/12 ? B. Yin Initial Creation. * 05/12 734 J. Zeng add getAllRfcs() and getAllCwas() * 08/12 #770 Q. Zhou added loadContWatchNum() - * 09/05 ? B. Yin Changed county cluster return type. + * 09/12 ? B. Yin Changed county cluster return type. + * 01/13 #966 B. Yin Added methods to load bounds into. * * * @author B. Yin @@ -97,4 +99,10 @@ public interface IStaticDataProvider { //for continuing watches public List loadContWatchNum(); + + //for clipping bounds + public List getBoundsTableList(); + public List getBoundsNames( String table ); + public Polygon loadBounds( String boundsTable, String boundsName ); + } diff --git a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/LatLonLocTbl.java b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/LatLonLocTbl.java index 84cc63656f..da8833bdb0 100755 --- a/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/LatLonLocTbl.java +++ b/ncep/gov.noaa.nws.ncep.edex.common/src/gov/noaa/nws/ncep/edex/tools/decoder/LatLonLocTbl.java @@ -35,6 +35,7 @@ import org.apache.commons.logging.LogFactory; import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.LocalizationContext; import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; +import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.edex.decodertools.core.LatLonPoint; @@ -58,24 +59,25 @@ public class LatLonLocTbl { public static void readLocTable(String tableName) throws Exception { - final String NCEP_DIR = "ncep"; - final String stnsDir = "stns"; - final String vorsLocTableName = "vors.xml"; +// final String NCEP_DIR = "ncep"; +// final String stnsDir = "stns"; +// final String vorsLocTableName = "vors.xml"; + final String VORS_TABLE = "ncep" + File.separator + "stns" + File.separator + "vors.xml"; IPathManager manager = PathManagerFactory.getPathManager(); LocalizationContext baseContext = null; - File baseDir = null; - String stnsFileName = null; - baseContext = manager.getContext(EDEX_STATIC, LocalizationLevel.BASE); - baseContext.setContextName(NCEP_DIR); - baseDir = manager.getFile(baseContext, ""); + + baseContext = manager.getContext( + LocalizationContext.LocalizationType.EDEX_STATIC, + LocalizationContext.LocalizationLevel.BASE); + LocalizationFile file = null; if (tableName == "vors") { - stnsFileName = baseDir + File.separator + stnsDir + File.separator - + vorsLocTableName; + file = manager.getStaticLocalizationFile(VORS_TABLE); } - logger.debug(" stnsFileName=" + stnsFileName); - myloc = new StationTable(stnsFileName); + + if ( file != null ) + myloc = new StationTable(file.getFile().getAbsolutePath()); } diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/utility/edex_static/base/distribution/airmet.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/utility/edex_static/base/distribution/airmet.xml index ef05f4697f..3a4ab06e89 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/utility/edex_static/base/distribution/airmet.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.airmet/utility/edex_static/base/distribution/airmet.xml @@ -1,4 +1,6 @@ - ^WAUS4[1-6].* + ^WAUS4[1-6] KKCI + ^WAHW[03]1 PHFO + ^WAAK4[7-9] PAWU diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/AwwDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/AwwDecoder.java index f18691734f..5653e062d7 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/AwwDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/decoder/AwwDecoder.java @@ -132,7 +132,7 @@ public class AwwDecoder extends AbstractDecoder { boolean isWtchFlag = AwwDecoder.isWtch(record);//Ticket 456 - boolean isSevereWeatherStatusFlag = AwwDecoder.isSevereWeatherStatus(record); +// boolean isSevereWeatherStatusFlag = AwwDecoder.isSevereWeatherStatus(record); // Get report type String reportType = AwwParser.getReportType(theBulletin); @@ -213,7 +213,7 @@ public class AwwDecoder extends AbstractDecoder { /* * construct VTEC object and then add it to the current Ugc for SevereWeatherStatus aww reocrd */ - if(isSevereWeatherStatusFlag && AwwParser.isSegmentTextValid(segment)) { + if( AwwParser.isSegmentTextValid(segment)) { /* * parse and then set the Watch Number for Status Report */ @@ -239,6 +239,7 @@ public class AwwDecoder extends AbstractDecoder { } } + } } catch (Exception e) { @@ -250,6 +251,10 @@ public class AwwDecoder extends AbstractDecoder { * Check the AWW record object. If not, throws exception. */ if (record != null) { + //T976 - check if the record has a valid UGC. If not return an empty PluginDataObject array + if ( record.getAwwUGC() == null || record.getAwwUGC().size() == 0 ) + return new PluginDataObject[0]; + record.setReportType(reportType.trim().replace(' ', '_')); record.setTraceId(traceId); record.setPluginName(pluginName); @@ -300,14 +305,13 @@ public class AwwDecoder extends AbstractDecoder { public static boolean isWtch(AwwRecord ar){ if(ar == null) return false; - - return "WWUS30".equalsIgnoreCase(ar.getWmoHeader()); + return ("WWUS30".equalsIgnoreCase(ar.getWmoHeader())); } - public static boolean isSevereWeatherStatus(AwwRecord awwReocrd) { - boolean isSevereWeatherStatus = false; - if("WOUS20".equalsIgnoreCase(awwReocrd.getWmoHeader())) - isSevereWeatherStatus = true; - return isSevereWeatherStatus; - } +// public static boolean isSevereWeatherStatus(AwwRecord awwReocrd) { +// boolean isSevereWeatherStatus = false; +// if("WOUS20".equalsIgnoreCase(awwReocrd.getWmoHeader())) +// isSevereWeatherStatus = true; +// return isSevereWeatherStatus; +// } } diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/util/AwwParser.java b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/util/AwwParser.java index 84f119f658..082b2e1e26 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/util/AwwParser.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.aww/src/gov/noaa/nws/ncep/edex/plugin/aww/util/AwwParser.java @@ -235,11 +235,11 @@ public class AwwParser { // "WW\\s\\d{3}\\sTORNADO\\s([A-Z]{2}\\s)+CW\\s(\\d{6}Z)\\s\\-\\s(\\d{6}Z)" // Pattern used to extract Thunderstorm watch number for WATCH // String THUNDERSTORM_WATCH_NUMBER_EXP = "WW\\s(\\d{3})\\sTHUNDERSTORM"; - String THUNDERSTORM_WATCH_NUMBER_EXP = "WW\\s(\\d{3})\\sSEVERE\\sTHUNDERSTORM"; + String THUNDERSTORM_WATCH_NUMBER_EXP = "WW\\s(\\d{1,4})\\sSEVERE\\sTHUNDERSTORM"; //T976 - replaced (\\d{3}) with (\\d{1,4} Pattern thunderstormWatchNumberPattern = Pattern.compile(THUNDERSTORM_WATCH_NUMBER_EXP); Matcher thunderstormWatchNumberMatcher = thunderstormWatchNumberPattern.matcher(segment); - String THUNDERSTORM_WATCH_NUMBER_EXP2 = "WW\\s(\\d{3})\\sSEVERE\\sTSTM"; + String THUNDERSTORM_WATCH_NUMBER_EXP2 = "WW\\s(\\d{1,4})\\sSEVERE\\sTSTM"; //T976 - replaced (\\d{3}) with (\\d{1,4} Pattern thunderstormWatchNumberPattern2 = Pattern.compile(THUNDERSTORM_WATCH_NUMBER_EXP2); Matcher thunderstormWatchNumberMatcher2 = thunderstormWatchNumberPattern2.matcher(segment); @@ -250,7 +250,7 @@ public class AwwParser { watchNumber = thunderstormWatchNumberMatcher2.group(1).trim(); // System.out.println("in processUgcToRetrieveWatchNumber - find THUNDERSTORM_WATCH_NUMBER using 'SEVERE TSTM' key word=" + watchNumber); } else { - String TORNADO_WATCH_NUMBER_EXP = "WW\\s(\\d{3})\\sTORNADO"; + String TORNADO_WATCH_NUMBER_EXP = "WW\\s(\\d{1,4})\\sTORNADO"; //T976 - replaced (\\d{3}) with (\\d{1,4} Pattern tornadoWatchNumberPattern = Pattern.compile(TORNADO_WATCH_NUMBER_EXP); Matcher tornadoWatchNumberMatcher = tornadoWatchNumberPattern.matcher(segment); if(tornadoWatchNumberMatcher.find()) { @@ -264,7 +264,7 @@ public class AwwParser { public static String processUgcToRetrieveWatchNumberForStatusReport(String segment) { String watchNumber = ""; - String STATUS_REPORT_WATCH_NUMBER_EXP = "STATUS REPORT ON WW\\s(\\d{3})"; + String STATUS_REPORT_WATCH_NUMBER_EXP = "STATUS REPORT ON WW\\s(\\d{1,4})"; //T976 - replaced (\\d{3}) with (\\d{1,4} Pattern statusReportWatchNumberPattern = Pattern.compile(STATUS_REPORT_WATCH_NUMBER_EXP); Matcher statusReportWatchNumberMatcher = statusReportWatchNumberPattern.matcher(segment); if(statusReportWatchNumberMatcher.find()) { @@ -276,7 +276,7 @@ public class AwwParser { public static boolean isSegmentTextValid(String segment) { boolean isSegmentValid = false; - String STATUS_REPORT_WATCH_NUMBER_EXP = "STATUS REPORT ON WW\\s(\\d{3})"; + String STATUS_REPORT_WATCH_NUMBER_EXP = "STATUS REPORT ON WW\\s(\\d{1,4})"; //T976 - replaced (\\d{3}) with (\\d{1,4} Pattern statusReportWatchNumberPattern = Pattern.compile(STATUS_REPORT_WATCH_NUMBER_EXP); Matcher statusReportWatchNumberMatcher = statusReportWatchNumberPattern.matcher(segment); if(statusReportWatchNumberMatcher.find()) { @@ -355,6 +355,8 @@ public class AwwParser { // Add current P-VTEC message to set. currentUgc.addAwwVtecLine(currentVtec); } + }else{ + return null; //T976 } AwwParser.processFips(ugcline, currentUgc, mndTime); @@ -517,7 +519,7 @@ public class AwwParser { // Regular expression for VTEC line final String VTEC_EXP = "(/([A-Z]{1}).([A-Z]{3}).([A-Z]{4}).([A-Z]{2}).([A-Z]{1}).([0-9]{4}).([0-9]{6}T[0-9]{4})Z-([0-9]{6}T[0-9]{4})Z/\\x0d\\x0d\\x0a)+"; //final String WTCH_VTEC_EXP = "WW\\s\\d{3}\\sTORNADO\\s([A-Z]{2}\\s)+CW\\s(\\d{6}Z)\\s\\-\\s(\\d{6}Z)"; -final String WTCH_VTEC_EXP = "WW\\s(\\d{3})\\s(TORNADO|SEVERE TSTM)\\s((\\w|\\s)*)\\s(\\d{6}Z)\\s\\-\\s(\\d{6}Z)"; +final String WTCH_VTEC_EXP = "WW\\s(\\d{1,4})\\s(TORNADO|SEVERE TSTM)\\s((\\w+|\\s+)*)\\s(\\d{6}Z)\\s\\-\\s(\\d{6}Z)"; // Pattern used to extract VTEC line // final Pattern vtecPattern = Pattern.compile(VTEC_EXP); //final Pattern wtchVtecPattern = Pattern.compile(WTCH_VTEC_EXP); @@ -575,6 +577,9 @@ if(wtchVtecMatcher.find()) { } } + if (currentUgc.getAwwVtecLine() == null || currentUgc.getAwwVtecLine().size() == 0 ) //T976 - If the UGC has no VTEC/HVTEC info, return null. + return null; + AwwParser.processFips(ugcline, currentUgc, mndTime); latlonIndex[0] = 0; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.classpath b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.classpath new file mode 100644 index 0000000000..ad32c83a78 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.metParameters/.project b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.project similarity index 92% rename from ncep/gov.noaa.nws.ncep.metParameters/.project rename to ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.project index ca528e9b3e..3efd3a40ab 100644 --- a/ncep/gov.noaa.nws.ncep.metParameters/.project +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.project @@ -1,6 +1,6 @@ - gov.noaa.nws.ncep.metParameters + gov.noaa.nws.ncep.edex.plugin.ntrans diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.settings/org.eclipse.jdt.core.prefs b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..ff9196c13d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Tue Feb 19 10:48:27 EST 2013 +eclipse.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.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.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..1b6853482e --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: NTRANS PlugIn +Bundle-SymbolicName: gov.noaa.nws.ncep.edex.plugin.ntrans +Bundle-Version: 1.0.0.qualifier +Eclipse-RegisterBuddy: com.raytheon.edex.common, com.raytheon.uf.common.serialization +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Require-Bundle: com.raytheon.edex.common;bundle-version="1.11.22", + gov.noaa.nws.ncep.edex.common;bundle-version="1.0.0", + javax.persistence;bundle-version="1.0.0", + org.apache.commons.logging;bundle-version="1.0.4", + gov.noaa.nws.ncep.common;bundle-version="1.0.0", + com.raytheon.uf.edex.decodertools;bundle-version="1.11.22", + gov.noaa.nws.ncep.common.dataplugin.ntrans;bundle-version="1.0.0" +Import-Package: org.apache.log4j +Export-Package: gov.noaa.nws.ncep.edex.plugin.ntrans.decoder diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/build.properties b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/build.properties new file mode 100644 index 0000000000..5791d48d5f --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + res/ diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/component-deploy.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/component-deploy.xml new file mode 100644 index 0000000000..82d3846fdd --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/component-deploy.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable.ecl b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/gov.noaa.nws.ncep.edex.plugin.ntrans.ecl similarity index 100% rename from ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable.ecl rename to ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/gov.noaa.nws.ncep.edex.plugin.ntrans.ecl diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-common.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-common.xml new file mode 100644 index 0000000000..4ebbb136ff --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-common.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-ingest.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-ingest.xml new file mode 100644 index 0000000000..06597f58f6 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/res/spring/ntrans-ingest.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + ntrans + + + + + + + + + + + + + + + + + + + + java.lang.Throwable + + + + + + java.lang.Throwable + + + + + + + \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/NtransDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/NtransDecoder.java new file mode 100644 index 0000000000..84c258a979 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/NtransDecoder.java @@ -0,0 +1,199 @@ +/** + * + * NTRANS Decoder + * + * This class decodes legacy NTRANS Metafiles. + * + * HISTORY + * + * Date Author Description + * ------------ ---------- ----------- -------------------------- + * 03/2013 B. Hebbard Initial creation + * + * This code has been developed by the SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.edex.plugin.ntrans.decoder; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import gov.noaa.nws.ncep.common.dataplugin.ntrans.NtransRecord; + +import com.raytheon.edex.exception.DecoderException; +import com.raytheon.edex.plugin.AbstractDecoder; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.dataplugin.PluginException; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.edex.esb.Headers; + + +public class NtransDecoder extends AbstractDecoder { + + private static String pluginName ;//= "NTRANS"; + /** + * Constructor + * + * @throws DecoderException + */ + public NtransDecoder(String name) throws DecoderException { + pluginName = name; + } + + private class FrameHeader { + String validTimeString; + String productNameString; + int startPos; + int endPos; + } + + /** + * + * @param inputFile : ingest file to be decoded + * @return + * @throws DecoderException + * @throws PluginException + * + */ + public synchronized PluginDataObject[] decodeNtransMetafile(File inputFile) throws DecoderException, PluginException { + byte [] fileData = null; + byte [] headerData = null; + InputStream inputStream = null; + String fileTitle = null; + short fileMaxFrame = 0; + short fileVersion = 0; + short fileMachineTypes = 0; + byte [] fileReservedSpace = new byte[42]; + + List frameHeaders = new ArrayList(); + List records = new ArrayList(); + List pdolist = new ArrayList(); + + try { + + fileName = inputFile.getName(); + inputStream = new FileInputStream(inputFile); + + // Read NTRANS metafile header + + /* + headerData = new byte[80]; + int headerBytesRead = inputStream.read(headerData); + */ + + byte[] fileTitleBytes = new byte[32]; + int fileTitleBytesRead = inputStream.read(fileTitleBytes); + fileTitle = new String(fileTitleBytes); + //System.out.println("[File title: " + fileTitle + "]"); + + byte[] remHeaderBytes = new byte[48]; + int remHeaderBytesRead = inputStream.read(remHeaderBytes); + ByteBuffer byteBuffer = null; + byteBuffer = ByteBuffer.allocate(48); + byteBuffer.put(remHeaderBytes,0,48); + byteBuffer.rewind(); + + fileMaxFrame = byteBuffer.getShort(); + fileVersion = byteBuffer.getShort(); + fileMachineTypes = byteBuffer.getShort(); + + // Read NTRANS frame headers (follow file header; precede frame contents) + + for (int frame = 0 ; frame < fileMaxFrame-1 ; frame++) { + if (frame>=500) break; + byte[] frameHeaderBytes = new byte[72]; + int frameHeaderBytesRead = inputStream.read(frameHeaderBytes); + if (frameHeaderBytes[0] == 0x00 && frameHeaderBytes[1] == 0x20) break; // hit data + byteBuffer = ByteBuffer.allocate(72); + byteBuffer.put(frameHeaderBytes); + byteBuffer.rewind(); + byte[] labelTitleBytes = new byte[64]; + byteBuffer.get(labelTitleBytes); + String labelTitle = new String(labelTitleBytes); + int startPos = byteBuffer.getInt(); + int endPos = byteBuffer.getInt(); + //System.out.println("[startPos " + startPos + " endPos " + endPos + "]"); + FrameHeader fh = new FrameHeader (); + fh.validTimeString = labelTitle.substring(0, 8); + fh.productNameString = labelTitle.substring(9); + fh.startPos = startPos; + fh.endPos = endPos; + frameHeaders.add(fh); + } + + System.out.println("this"); + + // Read NTRANS frames (CGM coded images) + + for (FrameHeader fh : frameHeaders) { + int startPos = fh.startPos; + int endPos = fh.endPos; + byte[] frameImage = { 0x04 , 0x02 }; // test + //byte[] frameImage = new byte[endPos - startPos + 0]; + //int imageBytesRead = inputStream.read(frameImage); + System.out.println("stop"); + + // Create NTRANS record (PDO) + + NtransRecord record = new NtransRecord(); + record.setInputFile(inputFile.getName()); + record.setConvertedMessage(frameImage); + record.setValidTimeString(fh.validTimeString); + record.setProductNameString(fh.productNameString); + Calendar dummyTBD = Calendar.getInstance(); + record.setStartTime(dummyTBD); + record.setEndTime(dummyTBD); + record.setRecordLength(0); + record.setDataTime(new DataTime(dummyTBD)); + + if (record != null) { + try { + record.setPluginName(pluginName); + record.constructDataURI(); + } + catch (PluginException e) { + throw new DecoderException("Error constructing dataURI", e); + } + } + + records.add(record); + } + + } + catch (IOException ioe) { + logger.error("Error reading input file " + inputFile.getName(), ioe); + fileData = null; + } + catch (Exception e) { + fileData = null; + } + finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException ioe) { + logger.error("Could not close input file " + inputFile.getName()); + } + } + } + + if (records.isEmpty()) { + return new PluginDataObject[0]; + } else { + PluginDataObject[] pdos = records.toArray(new PluginDataObject[0]); + return pdos; + } + + + } +} + + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/package-info.java b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/package-info.java new file mode 100644 index 0000000000..4d1dadc8da --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/src/gov/noaa/nws/ncep/edex/plugin/ntrans/decoder/package-info.java @@ -0,0 +1,4 @@ +/** +* Contains decoder.java for decoder plug-ins +*/ +package gov.noaa.nws.ncep.edex.plugin.ntrans.decoder;; diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/common_static/base/purge/ntransPurgeRules.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/common_static/base/purge/ntransPurgeRules.xml new file mode 100644 index 0000000000..8ec526365d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/common_static/base/purge/ntransPurgeRules.xml @@ -0,0 +1,6 @@ + + + + 02-00:00:00 + + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/edex_static/base/distribution/ntrans.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/edex_static/base/distribution/ntrans.xml new file mode 100644 index 0000000000..405e30cfe4 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.ntrans/utility/edex_static/base/distribution/ntrans.xml @@ -0,0 +1,3 @@ + + + diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/src/gov/noaa/nws/ncep/edex/plugin/solarimage/SolarImageDecoder.java b/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/src/gov/noaa/nws/ncep/edex/plugin/solarimage/SolarImageDecoder.java index f0309ac732..56cda08657 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/src/gov/noaa/nws/ncep/edex/plugin/solarimage/SolarImageDecoder.java +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/src/gov/noaa/nws/ncep/edex/plugin/solarimage/SolarImageDecoder.java @@ -26,6 +26,8 @@ import com.raytheon.uf.common.time.DataTime; * Date Ticket# Engineer Description * ------------ ---------- --------------- ------------------------ * 12/05/2012 865 qzhou, sgurung Initial creation. + * 01/07/2013 865 qzhou Change "_" to "-". Add wavelength default "NA". Add "Site" for Halpha. + * 01/28/2013 865 qzhou Changed float to double for intTime. * * * @author qzhou, sgurung @@ -47,6 +49,8 @@ public class SolarImageDecoder extends AbstractDecoder { private static final String INT_TIME = "INT_TIME"; + private static final String SITE = "SITE"; + private static final String[] OBS_TIME_STRINGS = { "DATE_OBS", "DATE-OBS", "DATEOBS"}; private static final String[] THEMATIC = { "themes", "covariances", "channels", "means" }; @@ -89,7 +93,7 @@ public class SolarImageDecoder extends AbstractDecoder { } catch (FitsException e) { // TODO Auto-generated catch block. Please revise as appropriate. logger.error(e); - return new PluginDataObject[0]; + //return new PluginDataObject[0]; } if (hdu == null) { @@ -99,15 +103,29 @@ public class SolarImageDecoder extends AbstractDecoder { record.setReportType("SOLARIMAGE"); record.setImageHDUNum(imageHDUNum); - record.setInstrument(hdu.getInstrument() + ((hdu.getTrimmedString(DETECTOR)!=null) ? "-" + hdu.getTrimmedString(DETECTOR) :"")); + + // combine instrument-detector to instrument + String instrument = hdu.getInstrument(); + String detector = hdu.getTrimmedString(DETECTOR); + if (instrument == null) + instrument = "NA"; + else + instrument = instrument.replaceAll("_", "-"); + record.setInstrument(instrument + ((detector!=null) ? "-" + detector.replaceAll("_", "-") :"")); + String telescope = hdu.getTelescope(); if (telescope != null && telescope.startsWith("SDO/")) telescope = telescope.substring(0, 3); - if (telescope != null && telescope.equals(STEREO)) // find which one (A or B) - telescope = hdu.getTrimmedString(OBSERVATORY); - record.setSatellite(telescope); + if (telescope != null && telescope.equals(STEREO)) { // find which one (A or B) + telescope = hdu.getTrimmedString(OBSERVATORY); //STEREO_A, STEREO_B + } + record.setSatellite(telescope.replaceAll("_", "-")); + if (telescope.equals("NSO-GONG")) + record.setSite(hdu.getTrimmedString(SITE)); + else + record.setSite("NA"); String wavelen = hdu.getTrimmedString(WAVELENGTH); if (wavelen == null) { @@ -115,35 +133,29 @@ public class SolarImageDecoder extends AbstractDecoder { if (hdu.getHeader().containsKey(WAVELENGTH)) wavelen = hdu.getHeader().findCard(WAVELENGTH).getValue(); } - record.setWavelength(wavelen); + + if (wavelen == null || wavelen.isEmpty() || wavelen.trim().equals("0") || wavelen.trim().equals("0.0")) + wavelen = "NA"; + + record.setWavelength(wavelen.toUpperCase().replaceAll("_", "-")); // Temporary hack for Thematic data - if (wavelen == null && hdu.getTelescope().startsWith("SDO/AIA")) { + if (hdu.getTrimmedString(WAVELENGTH) == null && hdu.getTelescope().startsWith("SDO/AIA")) { BasicHDU tempHDU = fits.getHDU(1); if (tempHDU != null) { String value = tempHDU.getTrimmedString("TTYPE1"); if (value != null ) { for (String str: THEMATIC) { if (value.contains(str)) { - record.setWavelength("Thematic"); + record.setWavelength("THEMATIC"); break; } } } } } -// if (wavelen == null) { -// String themes = "themes"; -// BasicHDU tempHDU = fits.getHDU(1); -// if (tempHDU != null) { -// String value = tempHDU.getTrimmedString("TTYPE1"); -// if (value != null && value.equals(themes)) { -// record.setWavelength(themes); -// } -// } -// } - record.setIntTime(hdu.getHeader().getFloatValue(INT_TIME)); + record.setIntTime(hdu.getHeader().getDoubleValue(INT_TIME)); Calendar obTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")); obTime.setTime(getObservationTime(hdu)); diff --git a/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/utility/common_static/base/purge/solarimagePurgeRules.xml b/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/utility/common_static/base/purge/solarimagePurgeRules.xml index 2ebbdc4194..1ab725f9dd 100644 --- a/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/utility/common_static/base/purge/solarimagePurgeRules.xml +++ b/ncep/gov.noaa.nws.ncep.edex.plugin.solarimage/utility/common_static/base/purge/solarimagePurgeRules.xml @@ -5,7 +5,6 @@ solarimage default - - true + 27-00:00:00 \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MdlSoundingQuery.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MdlSoundingQuery.java index 17cdad73db..8b513a5b71 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MdlSoundingQuery.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/MdlSoundingQuery.java @@ -70,7 +70,7 @@ import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.impl.CoordinateArraySequence; public class MdlSoundingQuery { - private static final String NCGRIB_TBL_NAME = "ncgrib"; + private static final String NCGRIB_TBL_NAME = "ncgrib";//obsoleting.... private static final String D2DGRIB_TBL_NAME = "grid"; private static String NC_PARMS = "HGHT, UREL, VREL, TMPK, OMEG, RELH"; @@ -89,10 +89,11 @@ public class MdlSoundingQuery { .getConverterTo(SI.CELSIUS); private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); + //Note; we are using NCInventory now. So, this api is actually not used. public static NcSoundingTimeLines getMdlSndTimeLine(String mdlType, String currentDBTblName) { NcSoundingTimeLines tl = new NcSoundingTimeLines(); - + /* if(currentDBTblName.equals(NCGRIB_TBL_NAME)){ Object[] refTimeAry = null; String queryStr = new String("Select Distinct reftime FROM " @@ -120,8 +121,19 @@ public class MdlSoundingQuery { e.printStackTrace(); } - } + } */ + //Chin: modified for Unified Grid DB + // Use the following SQL statement + //Select Distinct reftime FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id where grid_info.datasetid='gfs' ORDER BY reftime DESC + Object[] refTimeAry = null; + String queryStr = new String("Select Distinct reftime FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id where grid_info.datasetid='" + + mdlType + + "' ORDER BY reftime DESC"); + + CoreDao dao = new CoreDao(DaoConfig.forClass(NcgribRecord.class)); + refTimeAry = (Object[]) dao.executeSQLQuery(queryStr); + tl.setTimeLines(refTimeAry); return tl; @@ -130,6 +142,7 @@ public class MdlSoundingQuery { public static NcSoundingTimeLines getMdlSndRangeTimeLine(String mdlType, String refTimeStr, String currentDBTblName) { NcSoundingTimeLines tl = new NcSoundingTimeLines(); + /* if(currentDBTblName.equals(NCGRIB_TBL_NAME)){ Object[] refTimeAry = null; String queryStr = new String("Select Distinct rangestart FROM " @@ -159,9 +172,56 @@ public class MdlSoundingQuery { } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); - } + }*/ + //Chin: modified for Unified Grid DB + // make sure data in DB is not just nHour data, as those data are not used by Nsharp. And when query to it, the returned will be + // null. We do not want to show such sounding time line to user. + // use this SQL query string for gfs as example. + /* + * Select Distinct rangestart FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id where + * grid.reftime = '2012-01-26 00:00:00' AND grid.rangestart = grid.rangeend AND grid_info.datasetid='mesoEta212' AND + * grid_info.parameter_abbreviation='T' order by rangestart + */ + Object[] soundingTimeAry = null; + List reSoundingTimeAry = new ArrayList(); + String queryStr = new String("Select Distinct rangestart FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id where grid.reftime = '" + + refTimeStr + ":00:00' AND grid.rangestart = grid.rangeend AND grid_info.datasetid='"+mdlType+"' AND grid_info.parameter_abbreviation='T' order by rangestart"); + //System.out.println("queryStr " + queryStr); + CoreDao dao = new CoreDao(DaoConfig.forClass(GridRecord.class)); + soundingTimeAry = (Object[]) dao.executeSQLQuery(queryStr); + for(int i=0; i< soundingTimeAry.length; i++){ + /* + * Chin: make sure the time line has more than 5 T(temp) values at pressure (levelone) greater/equal than/to 100 hPa (mbar) + * use this SQL : + * Select count(rangestart) FROM (select rangestart FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id + * FULL JOIN level ON grid_info.level_id= level.id + * where grid.rangestart = '2012-01-26 03:00:00.0' AND + * grid.rangestart = grid.rangeend AND grid_info.datasetid='mesoEta212' AND + * grid_info.parameter_abbreviation='T' AND level.levelonevalue > 99) X HAVING count(X.rangestart) >5 + */ + String queryStr1 = new String("Select count(rangestart) FROM (select rangestart FROM grid FULL JOIN grid_info ON grid.info_id=grid_info.id FULL JOIN level ON grid_info.level_id= level.id where grid.rangestart = '" + + soundingTimeAry[i] + "' AND grid.rangestart = grid.rangeend AND grid_info.datasetid='"+mdlType+"' AND grid_info.parameter_abbreviation='T' AND level.levelonevalue > 99) X HAVING count(X.rangestart) >5"); + Object[] countAry = null; + //System.out.println("queryStr1 " + queryStr1); + countAry = (Object[]) dao.executeSQLQuery(queryStr1); + java.math.BigInteger count = new java.math.BigInteger("0"); + if(countAry.length >0 ){ + //System.out.println("rangestart =" +soundingTimeAry[i]+" number="+countAry[0]); + count = (java.math.BigInteger)countAry[0]; + } + //else{ + // System.out.println("rangestart =" +soundingTimeAry[i]+" return null"); + //} + if(count.intValue() > 5){ + Object timeLine= soundingTimeAry[i]; + reSoundingTimeAry.add(timeLine); + } } + + tl.setTimeLines(reSoundingTimeAry.toArray()); + + //} return tl; } // public static NcSoundingProfile getMdlSndData(double lat, double lon, // String stn, long refTimeL, long validTimeL, String sndTypeStr, diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java index c2d8b7e63c..1c84703775 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/NcSoundingDrv.java @@ -154,7 +154,7 @@ public class NcSoundingDrv { public void setUseNcSoundingLayer2(boolean useNcSoundingLayer2) { this.useNcSoundingLayer2 = useNcSoundingLayer2; - System.out.println("useNcSoundingLayer2 set to "+useNcSoundingLayer2); + //System.out.println("useNcSoundingLayer2 set to "+useNcSoundingLayer2); } public long[] getRangeTimeArr() { @@ -173,7 +173,7 @@ public class NcSoundingDrv { String tStr= String.format("%1$tY-%1$tm-%1$td %1$tH:00:00", timeCal); this.rangeTimeStringLst.add(tStr); this.rangeTimeCalLst.add(timeCal); - System.out.println("setRangeTimeArr: time in long="+rangeTimeArr[i]+ " in str="+tStr); + //System.out.println("setRangeTimeArr: time in long="+rangeTimeArr[i]+ " in str="+tStr); } } public String[] getStnIdArr() { diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/ObservedSoundingQuery.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/ObservedSoundingQuery.java index 38705202be..06ae3e9471 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/ObservedSoundingQuery.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/ObservedSoundingQuery.java @@ -292,7 +292,7 @@ public class ObservedSoundingQuery { return tl; } synopTimeAry = (Object[]) dao.executeSQLQuery(queryStr); - //*System.out.println("size of synoptictime " + synopTimeAry.length); + //System.out.println("size of synoptictime " + synopTimeAry.length); //for(int i=0; i < synopTimeAry.length; i++){ // if(synopTimeAry[i] != null) @@ -997,14 +997,14 @@ public class ObservedSoundingQuery { result = request.execute(); long t002 = System.currentTimeMillis(); //totalRqTime=totalRqTime+(t002-t001); - System.out.println("getObservedSndNcUairDataGeneric data query alone took "+(t002-t001)+"ms"); + //System.out.println("getObservedSndNcUairDataGeneric data query alone took "+(t002-t001)+"ms"); if (result != null) { long t003 = System.currentTimeMillis(); returnedDbRecords = NcUairToRecord.toNcUairRecordsList(result); if(returnedDbRecords!= null && returnedDbRecords.size() > 0){ - System.out.println("getObservedSndNcUairDataGeneric Before loop: Number of records in returnedDbRecords="+returnedDbRecords.size()); + //System.out.println("getObservedSndNcUairDataGeneric Before loop: Number of records in returnedDbRecords="+returnedDbRecords.size()); //Chin: keep list of records for same station //search through all returned records and keep same staion's records in one list int loopLen; @@ -1114,13 +1114,13 @@ public class ObservedSoundingQuery { } long t004 = System.currentTimeMillis(); - System.out.println(" sorting return records took "+(t004-t003)+"ms"); + //System.out.println(" sorting return records took "+(t004-t003)+"ms"); } } catch (Exception e) { e.printStackTrace(); } - System.out.println("getObservedSndNcUairDataGeneric Number profiles (record[]s) in finalRecordArrayList="+finalRecordArrayList.size()); + //System.out.println("getObservedSndNcUairDataGeneric Number profiles (record[]s) in finalRecordArrayList="+finalRecordArrayList.size()); return finalRecordArrayList; } /* diff --git a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/PfcSoundingQuery.java b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/PfcSoundingQuery.java index 3e3d1f9da9..4223d48f01 100644 --- a/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/PfcSoundingQuery.java +++ b/ncep/gov.noaa.nws.ncep.edex.uengine/src/gov/noaa/nws/ncep/edex/uengine/tasks/profile/PfcSoundingQuery.java @@ -566,9 +566,9 @@ public class PfcSoundingQuery { d=d.substring(0, d.length()-1);//get rid of last "," values.add(d); //rangestart data type defined in SoundingSite is "Date" operands.add("in"); - for (int i=0; i < fields.size(); i++) { - System.out.println("getPfcSndDataGeneric: field ="+ fields.get(i) + " value= "+ values.get(i) + " operand= "+operands.get(i)); - } + //for (int i=0; i < fields.size(); i++) { + // System.out.println("getPfcSndDataGeneric: field ="+ fields.get(i) + " value= "+ values.get(i) + " operand= "+operands.get(i)); + //} List parameters = new ArrayList(12); parameters.addAll(ModelSoundingPointDataTransform.LVL_PARAMETERS); parameters.add(ModelSoundingPointDataTransform.P_LATITUDE); @@ -583,8 +583,8 @@ public class PfcSoundingQuery { long t01 = System.currentTimeMillis(); lSndSiteRecords = ModelSoundingPointDataTransform.getSoundingSites(fields, values, operands, parameters); long t02 = System.currentTimeMillis(); - System.out.println("getPfcSndDataGeneric sounding site record size = "+ lSndSiteRecords.size()+ - " took "+(t02-t01)+ " ms"); + //System.out.println("getPfcSndDataGeneric sounding site record size = "+ lSndSiteRecords.size()+ + // " took "+(t02-t01)+ " ms"); for(SoundingSite sndSite:lSndSiteRecords){ //set pf data NcSoundingProfile pf = new NcSoundingProfile(); diff --git a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd/.project b/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd/.project deleted file mode 100644 index e545c70a90..0000000000 --- a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1Vcrd - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable/.project b/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable/.project deleted file mode 100644 index cd07ab7253..0000000000 --- a/ncep/gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - gov.noaa.nws.ncep.edex.util.grib1vcrd.Grib1VcrdTable - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.metParameters/META-INF/MANIFEST.MF deleted file mode 100644 index 619a865372..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/META-INF/MANIFEST.MF +++ /dev/null @@ -1,20 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: MetParameters -Bundle-SymbolicName: gov.noaa.nws.ncep.metParameters;singleton:=true -Bundle-Version: 1.0.0.qualifier -Bundle-Activator: gov.noaa.nws.ncep.metparameters.Activator -Require-Bundle: org.eclipse.ui, - com.raytheon.viz.core;bundle-version="1.12.1142", - org.eclipse.core.runtime, - org.junit -Bundle-ActivationPolicy: lazy -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Import-Package: com.vividsolutions.jts.geom, - com.vividsolutions.jts.io, - gov.noaa.nws.ncep.common.log.logger, - javax.measure.converter, - javax.measure.quantity, - javax.measure.unit -Export-Package: gov.noaa.nws.ncep.metParameters.parameterConversion, - gov.noaa.nws.ncep.metparameters diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/GempakConstants.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/GempakConstants.java deleted file mode 100644 index 66d7a3421d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/GempakConstants.java +++ /dev/null @@ -1,100 +0,0 @@ -package gov.noaa.nws.ncep.metParameters.parameterConversion; - -/** - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket# Engineer    Description
- * ------------ ------- ----------- --------------------------
- *        2011	398		Archana		Initial Creation
- * 04 Apr 2011	398		F. J. Yen	Change fields in METERS_TO_KILOMETERS. FEET_TO_MILES,
- * 									METERS_TO_DECAMETERS to floating point.
- * 
- * - * @author archana - */ -public class GempakConstants { - - /**Missing Float value*/ - public static final float RMISSD = -9999.0f; - - /**Missing Integer value*/ - public static final float IMISSD = -9999; - - /**Missing value fuzziness*/ - public static final float RDIFFD = 0.1f; - - /**Earth's radius*/ - public static final float RADIUS = 6371200.f; - - /**Earth's angular velocity*/ - public static final float OMEGA = 7.2921E-5f; - - /**Acceleration of gravity*/ - public static final float GRAVTY = 9.80616f; - - public static final float RDGAS = 287.04f; - - /** Gas constant of dry air*/ - public static final float RKAP = RDGAS / GRAVTY; - - /**Centigrade -> Kelvin*/ - public static final float TMCK = 273.15f; - - /**US standard atmospheric lapse rate*/ - public static final float GAMUSD = 6.5f; - - /**Poisson constant*/ - public static final float RKAPPA = 2.0f / 7.0f; - - /**Inverse Poisson constant*/ - public static final float AKAPPA = 7.0f / 2.0f; - - /** Used in conversion from Celsius to Farenheit*/ - public static final float RPRM = 9.0f / 5.0f; - - public static final float PI = 3.14159265f; - - public static final float HALFPI = PI / 2.0f; - - public static final float TWOPI = 2 * PI; - - public static final float PI4TH = PI / 4; - - public static final float DTR = PI / 180; - - public static final float RTD = 180 / PI; - - public static final float FEET_TO_METERS = 0.3048f; - - public static final float METERS_TO_FEET = 3.28084f; - - public static final float MILES_PER_HOUR_TO_KNOTS = 0.868976f; - - public static final float KNOTS_TO_MILES_PER_HOUR = 1 / 0.868976f; - - public static final float METERS_PER_SEC_TO_KNOTS = 1.9425f; - - public static final float KNOTS_TO_METERS_PER_SEC = 1 / 1.9425f; - - public static final float FEET_TO_MILES = 1f / 5280f; - - public static final float MILES_TO_FEET = 5280; - - public static final float METERS_TO_KILOMETERS = 1 / 1000f; - - public static final float KILOMETERS_TO_METERS = 1000.0f; - - public static final float METERS_TO_DECAMETERS = 1f / 10f; - - public static final float DECAMETERS_TO_METERS = 10.0f; - - public static final float NAUTICAL_MILES_TO_METERS = 1852.0f; - - public static final float METERS_TO_NAUTICAL_MILES = 1 / 1852.0f; - - public static final float INCHES_TO_MILLIMETERS = 25.4f; - - public static final float MILLIMETERS_TO_INCHES = .0393701f; -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/NcUnits.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/NcUnits.java deleted file mode 100644 index 6adb42fb8e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/NcUnits.java +++ /dev/null @@ -1,54 +0,0 @@ -package gov.noaa.nws.ncep.metParameters.parameterConversion; - - -import gov.noaa.nws.ncep.metParameters.quantity.RateOfChangeInTemperatureWithHeight; -import gov.noaa.nws.ncep.metParameters.quantity.RateOfChangeInTemperatureWithPressure; - -import javax.measure.quantity.Length; -import javax.measure.quantity.Pressure; -import javax.measure.unit.NonSI; -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; -import javax.measure.unit.UnitFormat; -/** - * @author archana - * - */ -public class NcUnits { - public static final Unit GRAMS_PER_KILOGRAM = SI.GRAM.divide(SI.KILOGRAM) ; - public static final Unit HUNDREDS_OF_FEET = NonSI.FOOT.times( 100 ); - public static Unit INCHES_PER_THREE_HOURS = NonSI.INCH.divide(NonSI.HOUR.times( 3 ) ); - public static final Unit JOULES_PER_KILOGRAM = SI.JOULE.divide(SI.KILOGRAM) ; - //public static final Unit KILOGRAM_PER_METER_CUBE = VolumetricDensity.UNIT; - public static final Unit MILLIBAR = SI.HECTO( SI.PASCAL ); - public static final Unit FREQUENCY_SQUARED = SI.HERTZ.times(SI.HERTZ); - //TODO Rename CELSIUS_PER_KILOMETER to TEMPERATURE_PER_UNIT_HEIGHT ?? - - public static final Unit CELSIUS_PER_KILOMETER = - new ProductUnit( SI.CELSIUS.divide( SI.KILOMETER ) ); - public static final Unit KELVIN_PER_MILLIBAR = - new ProductUnit( SI.KELVIN.divide( NcUnits.MILLIBAR ) ); - - public static void register(){ - if( UnitFormat.getUCUMInstance().isValidIdentifier( "100*inHg") ) { - System.out.println("100*inHg is invalid"); - } - UnitFormat.getUCUMInstance().label( NonSI.INCH_OF_MERCURY.divide(100), "centi_inHg" ); - UnitFormat.getUCUMInstance().label( HUNDREDS_OF_FEET, "hecto_ft" ); -// UnitFormat.getUCUMInstance().label( GRAMS_PER_KILOGRAM, "g/kg" ); -// UnitFormat.getUCUMInstance().label( JOULES_PER_KILOGRAM, "J/kg" ); - UnitFormat.getUCUMInstance().label( MILLIBAR, "mb" ); -// UnitFormat.getUCUMInstance().label( CELSIUS_PER_KILOMETER, "℃/km" ); -// UnitFormat.getUCUMInstance().label( KELVIN_PER_MILLIBAR, "K/mb" ); - - // UnitFormat.getUCUMInstance().label( KILOGRAM_PER_METER_CUBE, "kg/m³" ); -// UnitFormat.getUCUMInstance().label( INCHES_PER_THREE_HOURS, "in/hr*3" ); -// UnitFormat.getUCUMInstance().label( FREQUENCY_SQUARED, "Hz^2" ); //not sure if this will parse... - - // aliases to make editing the plotParameter.xml files easier (ie no non-ascii chars) - UnitFormat.getUCUMInstance().label( NonSI.DEGREE_ANGLE, "degree" ); - - - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/PRLibrary.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/PRLibrary.java deleted file mode 100644 index 68f4fd8d19..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/parameterConversion/PRLibrary.java +++ /dev/null @@ -1,2205 +0,0 @@ -/* - * - * PRLibrary - * - * Date created 04 May 2011 - * - * This code has been developed by the SIB for use in the AWIPS2 system. - */ -package gov.noaa.nws.ncep.metParameters.parameterConversion; - -import gov.noaa.nws.ncep.metparameters.Amount; - -import java.util.Arrays; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.VolumetricDensity; -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -import com.raytheon.uf.viz.core.exception.VizException; - - -public final class PRLibrary { - - /** - * Computes altimeter from the station pressure and elevation - * @param pres - pressure at the station - * @param selv - elevation of the station - * @return the computed altimeter in Inches - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prAltp( Amount pres, Amount selv) throws InvalidValueException, NullPointerException{ - System.out.println("From prAltp:"); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" selv = " + selv.doubleValue()); - - checkNullOrInvalidValue( pres ); - checkNullOrInvalidValue( selv ); - selv = checkAndConvertInputAmountToExpectedUnits(selv, SI.METER ); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - double seaLevelTempInKelvin = GempakConstants.TMCK + 15; - double hgtk = selv.getUnit().getConverterTo( SI.KILOMETER ).convert( selv.doubleValue() ) ; - double exponent = - ( GempakConstants.GRAVTY / ( GempakConstants.GAMUSD * GempakConstants.RDGAS ) * 1000 ); - // double base = pres * ( 1.0f - ( hgtk * GempakConstants.GAMUSD / seaLevelTempInKelvin ) ); - // float altm = (float) Math.pow( base, Math.exp( exponent ) ); - // return prAlti( pres * altm ); - double base = ( 1.0 - ( hgtk * GempakConstants.GAMUSD / seaLevelTempInKelvin ) ); - double altm = Math.pow( base, exponent ); - double altp = pres.doubleValue() * altm; - return ( new Amount ( altp, NonSI.INCH_OF_MERCURY ) ); - } - - - - - /*** - * Computes the Ceiling converted to Mean Sea Level in hundreds of feet - * @param ceil - Ceiling in hundreds of feet - * @param selv - Station elevation in meters - * @return The ceiling converted to Mean Sea Level in hundreds of feet - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prCmsl( Amount ceil, Amount selv) throws InvalidValueException, NullPointerException{ - System.out.println("From prCmsl:"); - System.out.println(" ceil = " + ceil.doubleValue()); - System.out.println(" selv = " + selv.doubleValue()); - /*Sanity check*/ - checkNullOrInvalidValue( ceil ); - checkNullOrInvalidValue( selv ); - selv = checkAndConvertInputAmountToExpectedUnits(selv, NcUnits.HUNDREDS_OF_FEET); - ceil = checkAndConvertInputAmountToExpectedUnits(ceil, NcUnits.HUNDREDS_OF_FEET); - return ( new Amount ( selv.doubleValue() + ceil.doubleValue() , NcUnits.HUNDREDS_OF_FEET ) ); - } - - /** - * Computes the wind direction in degrees from the input u and v components of velocity, - * both of which must be in the same units (either meters/second or knots) - * @param uX - U component of velocity - * @param vX- V component of velocity - * @return The wind direction in degrees - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDrct ( Amount uX, Amount vX) throws InvalidValueException, NullPointerException{ - System.out.println("From prDrct:"); - System.out.println(" uX = " + uX.doubleValue()); - System.out.println(" vX = " + vX.doubleValue()); - - checkNullOrInvalidValue(uX); - checkNullOrInvalidValue(vX); - double vXVal = Double.NaN; - double uXVal = Double.NaN; - if ( uX.getUnit() != vX.getUnit() && uX.getUnit().isCompatible(vX.getUnit() )) { - vXVal = vX.getUnit().getConverterTo(uX.getUnit() ).convert(vX.doubleValue() ); - vX = new Amount ( vXVal, uX.getUnit() ); - } - uXVal = uX.doubleValue(); - double prDrct = 0.0; - - if ( ( uXVal != 0 ) || ( vXVal != 0 ) ){ - prDrct = Math.atan2(-uXVal, -vXVal) * GempakConstants.RTD; - if ( prDrct <= 0 ) - prDrct += 360; - } - return ( new Amount ( prDrct , NonSI.DEGREE_ANGLE )); - - } - - /** - * Computes the density of dry air given the pressure (in mb) - * and temperature (in Celsius) - * @param pres - Pressure in millibars - * @param tmpc - Temperature in Celsius - * @return Density of dry air in kg/(m**3) - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDden ( Amount pres, Amount tmpc ) throws InvalidRangeException, InvalidValueException, NullPointerException{ - System.out.println("From prDden:"); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" tmpc = " + tmpc.doubleValue()); - - double prdden = GempakConstants.RMISSD; - /*Check for bad data*/ - checkNullOrInvalidValue(pres); - checkNullOrInvalidValue(tmpc); - pres = checkAndConvertInputAmountToExpectedUnits( pres, NcUnits.MILLIBAR ); - tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc, SI.CELSIUS ); - - double tmpcVal = tmpc.doubleValue(); - if ( tmpcVal < -GempakConstants.TMCK ) - throw new InvalidRangeException("From prDden: temperature must be greater than or equal to -273.15 "); - - /* Convert temperature and compute*/ - double tmpk = tmpc.getUnit().getConverterTo( SI.KELVIN ).convert( tmpcVal ); - prdden = 100 * pres.doubleValue() / ( GempakConstants.RDGAS * tmpk ); - - return new Amount ( prdden, VolumetricDensity.UNIT ); - } - - /*** - * Computes the dewpoint depression, from tmpx and dwpx, both of which - * must be in the same units (one of Kelvin, Celsius or Farenheit) - * @param tmpx - Air temperature - * @param dwpx - Dewpoint temperature - * @return the dewpoint depresssion (in the same units are tmpx and dwpx) - * if both tmpx and dwpx are valid values - */ - - public static final Amount prDdep ( Amount tmpx, Amount dwpx) throws InvalidValueException, NullPointerException{ - System.out.println("From prDdep:"); - System.out.println(" tmpx = " + tmpx.doubleValue()); - System.out.println(" dwpx = " + dwpx.doubleValue()); - checkNullOrInvalidValue(tmpx); - checkNullOrInvalidValue(tmpx); - Amount prDdep = null; - - dwpx = checkAndConvertInputAmountToExpectedUnits( dwpx, tmpx.getUnit() ); - double dewpointDepression = tmpx.doubleValue() - dwpx.doubleValue(); - prDdep = new Amount ( dewpointDepression , tmpx.getUnit()); - return prDdep; - } - - /** - * Computes DMAX, the maximum temperature obtained by - * comparing the 6-hour maximum at 00Z, - * the 6-hour maximum at 06Z and - * the local midnight maximum (reported at 00 LST) - * if either of the 6-hour values is missing, the maximum is set to missing. - * The inputs are in Celsius, the output in degrees Farenheit - * @param t00x - 6-hour maximum temperature at 00Z, Celsius - * @param t06x - 6-hour maximum temperature at 06Z, Celsius - * @param tdxc - Local midnight max temperature at 00 LST, Celsius - * @return The maximum of the 3 temperature values (in Farenheit) - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDmax ( Amount t00x, Amount t06x, Amount tdxc) throws InvalidValueException, NullPointerException{ - System.out.println("From prDmax:"); - System.out.println(" t00x = " + t00x.doubleValue()); - System.out.println(" t06x = " + t06x.doubleValue()); - System.out.println(" tdxc= " + tdxc.doubleValue()); - - checkNullOrInvalidValue(t00x); - checkNullOrInvalidValue(t06x); - t00x = checkAndConvertInputAmountToExpectedUnits( t00x, SI.CELSIUS ); - t06x = checkAndConvertInputAmountToExpectedUnits( t06x, SI.CELSIUS ); - - if ( tdxc != null && tdxc.doubleValue() > -9999 ) { - tdxc = checkAndConvertInputAmountToExpectedUnits( tdxc, SI.CELSIUS ); - double[] tempArray = { t00x.doubleValue(), t06x.doubleValue(), tdxc.doubleValue() }; - - Arrays.sort(tempArray); - double newTemp = SI.CELSIUS.getConverterTo(NonSI.FAHRENHEIT).convert(tempArray[2]); - return ( new Amount ( newTemp , NonSI.FAHRENHEIT ) ); - } - else{ - double t00xVal = t00x.doubleValue(); - double t06xVal = t06x.doubleValue(); - Amount dmax = ( t00xVal > t06xVal - ? checkAndConvertInputAmountToExpectedUnits(t00x, NonSI.FAHRENHEIT) - : checkAndConvertInputAmountToExpectedUnits(t06x, NonSI.FAHRENHEIT ) ); - return dmax; - } - - } - - /** - *
-	 * Computes the minimum temperature obtained by
-	 * comparing the 6-hour minimum at 12Z and the 6-hour minimum at 18Z.
-	 * if either of the 6-hour values is missing, the minimum is set to missing.
-	 * The inputs are in degrees C, the output in degrees F.
-	 *  
- * @param t12n - 6-hour minimum temperature at 12Z, deg Celsius - * @param t18n - 6-hour minimum temperature at 18Z, deg Celsius - * @return the minimum temperature (in Farenheit) after comparing the two input values, if they exist - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDmin ( Amount t12n, Amount t18n ) throws InvalidValueException, NullPointerException{ - System.out.println("From prDmin:"); - System.out.println(" t12n = " + t12n.doubleValue()); - System.out.println(" t18n = " + t18n.doubleValue()); - checkNullOrInvalidValue( t12n ); - checkNullOrInvalidValue( t18n ); - t12n = checkAndConvertInputAmountToExpectedUnits( t12n,SI.CELSIUS); - t18n = checkAndConvertInputAmountToExpectedUnits( t18n,SI.CELSIUS); - Amount minValue = ( t12n.doubleValue() < t18n.doubleValue() ? t12n : t18n); - return ( checkAndConvertInputAmountToExpectedUnits(minValue, NonSI.FAHRENHEIT) ); - - } - - /** - * Computes the dewpoint as the difference between the input temperature and dewpoint depression - * @param tmpx - temperature (in Celsius or Farenheit or Kelvin) - * @param dpdx - the dewpoint depression ( in the same units as the temperature) - * @return the dewpoint in the same units as ( in the same units as the temperature) - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDwdp( Amount tmpx, Amount dpdx ) throws InvalidValueException, NullPointerException{ - System.out.println("From prDwdp:"); - System.out.println(" tmpx = " + tmpx.doubleValue()); - System.out.println(" dpdx = " + dpdx.doubleValue()); - - checkNullOrInvalidValue(tmpx); - checkNullOrInvalidValue(dpdx); - Unit tempUnits = (Unit) tmpx.getUnit(); - Unit dewpointDepUnits = (Unit) dpdx.getUnit(); - if ( !tempUnits.equals( dewpointDepUnits) && tempUnits.isCompatible(dewpointDepUnits)){ - double dewpointDepValue= (double) dewpointDepUnits.getConverterTo(tempUnits).convert(dpdx.doubleValue()); - dpdx = new Amount ( dewpointDepValue, tempUnits); - } - - Amount dewpointTemperature = new Amount ( tmpx.doubleValue() - dpdx.doubleValue(), tempUnits ); - return dewpointTemperature; - } - - /** - * Computes the dewpoint ( in Celsius ) from the mixing ratio (in grams/kilogram) - * and the pressure (in mb) - * @param rmix - the mixing ratio (in grams/kilogram) - * @param pres - the pressure (in mb) - * @return the dewpoint (in Celsius), if both the input values are valid - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prDwpt( Amount rmix, Amount pres) throws InvalidRangeException, InvalidValueException, NullPointerException{ - System.out.println("From prDwpt:"); - System.out.println(" rmix = " + rmix.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - Amount prDwpt = null; - checkNullOrInvalidValue( rmix ); - checkNullOrInvalidValue( pres ); - rmix = checkAndConvertInputAmountToExpectedUnits( rmix, Unit.ONE ); - pres = checkAndConvertInputAmountToExpectedUnits( pres, NcUnits.MILLIBAR ); - double mixingRatioValue = rmix.doubleValue() ; - double pressureValue = pres.doubleValue(); - if ( mixingRatioValue <= 0 ) - throw new InvalidRangeException("From prDwpt() - mixing ratio must be greater than 0"); - - if ( pressureValue <= 0 ) - throw new InvalidRangeException("From prDwpt() - pres must be greater than 0"); - - /*Convert gram/kilogram to gram/gram*/ - double ratio = mixingRatioValue / 1000; - - /*Calculate vapor pressure from mixing ratio and pressure*/ - double vaporPressure = ( pressureValue * ratio ) / ( 0.62197 + ratio ); - - /*Correct vapor pressure*/ - vaporPressure = vaporPressure / ( 1.001 + ( ( pressureValue - 100.0 ) / 900) * .0034 ) ; - - /*Calculate dewpoint*/ - double dewPointValue = ( double ) ( Math.log ( vaporPressure / 6.112 ) * 243.5 / ( 17.67 - Math.log( vaporPressure / 6.112 ) ) ) ; - prDwpt = new Amount ( dewPointValue, SI.CELSIUS); - return prDwpt; - } - - /*** - * Computes the Fosberg index from the temperature, relative humidity and wind speed - * at the surface. - * @param tmpc - Temperature in Celsius - * @param relh - Relative humidity in percent - * @param sped - Wind speed in meters/second - * @return the Fosberg index - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prFosb( Amount tmpc, Amount relh, Amount sped) throws InvalidValueException, NullPointerException{ - System.out.println("From prFosb:"); - System.out.println("Temperature ( in K ) is: " + tmpc.doubleValue()); - System.out.println("Relative Humidity is: " + relh.doubleValue()); - System.out.println("Wind Speed is: " + sped.doubleValue()); - checkNullOrInvalidValue( tmpc ); - - checkNullOrInvalidValue( relh ); - checkNullOrInvalidValue( sped ); - - // tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc, SI.CELSIUS ); - tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc, NonSI.RANKINE); - relh = checkAndConvertInputAmountToExpectedUnits( relh, NonSI.PERCENT ); - sped = checkAndConvertInputAmountToExpectedUnits( sped, SI.METERS_PER_SECOND ); - - /*Change temperature to degrees Fahrenheit*/ - // double tf = tmpc.getUnit().getConverterTo(NonSI.FAHRENHEIT).convert(tmpc.doubleValue()); - Unit unit = tmpc.getUnit(); - // UnitConverter unitConvert = unit.getConverterTo(NonSI.FAHRENHEIT); - UnitConverter unitConvert = unit.getConverterTo(NonSI.RANKINE); - double tf = unit.getConverterTo(NonSI.FAHRENHEIT).convert(tmpc.doubleValue()); - - /*Convert wind speed from meters/second to knots*/ - double smph = sped.getUnit().getConverterTo( NonSI.MILES_PER_HOUR ).convert( sped.doubleValue() ); - - - double A = 0.03229; - double B = 0.281073; - double C = 0.000578; - double D = 2.22749; - double E = 0.160107; - double F = 0.014784; - double G = 21.0606; - double H = 0.005565; - double P = 0.00035; - double Q = 0.483199; - double R = 0.3002; - // float T = 9.0f/5.0f; - // float U = 1.9425f; - // float V = 0.868976f; - double fw = GempakConstants.RMISSD; - double relhVal = relh.doubleValue(); - if ( relhVal <= 10 ) { - fw = A + B * relhVal - C * relhVal * tf; - } - else if ( relhVal <= 50 ) { - fw = D + E * relhVal - F * tf; - } - else{ - fw = G + H *relhVal*relhVal - P * relhVal * tf - Q * relhVal; - } - - double sss = ( double ) ( Math.sqrt ( 1. + ( smph * smph ) )); - double fwd = fw / 30; - double fwd2 = fwd * fwd; - double fwd3 = fwd2 * fwd; - double fire = 1 - 2 * fwd + 1.5f * fwd2 - 0.5f * fwd3; - - /*Find the Fosberg Index*/ - - double prfosb = ( fire * sss ) / R; - - return ( new Amount ( prfosb , Unit.ONE ) ); - } - - /** - *
-	 * Computes the Southern Region/CPC Rothfusz heat index.
-	 * 
-	 * The Rothfusz regression is optimal for TMPF > ~80 and RELH > ~40%.   
-	 * This code applies a simple heat index formula and then resorts to   
-	 * the Rothfusz regression only if the simple heat index exceeds 80,   
-	 * implying temperatures near, but slightly below 80.  To make the    
-	 * simple calculation continuous with the values obtained from the   
-	 * Rothfusz regression, the simple result is averaged with TMPF in    
-	 * computing the simple heat index value.                               
-	 * Source:  NWS Southern Region SSD Technical Attachment SR 90-23  7/1/90.  
-	 * Heat Index was originally known as the apparent temperature index 
-	 * (Steadman, JAM, July, 1979).                                                                  
-	 * This code includes adjustments made by the CPC for low RELH at high  
-	 * TMPF and high RELH for TMPF in the mid 80's.
-	 * 
-	 * 
-	 * @param tmpf  - the input air temperature
-	 * @param relh   - the relative humidity 
-	 * @return the heat index (in deg Farenheit) if both 
-	 * the input air temperature and relative humidity
-	 * are valid values 
-	 * 
- * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prHeat( Amount tmpf, Amount relh ) throws InvalidValueException, NullPointerException{ - System.out.println("From prHeat:"); - System.out.println(" tmpf = " + tmpf.doubleValue()); - System.out.println(" relh = " + relh.doubleValue()); - - double prheat = GempakConstants.RMISSD; - checkNullOrInvalidValue( tmpf ); - checkNullOrInvalidValue( relh ); - tmpf = checkAndConvertInputAmountToExpectedUnits( tmpf, NonSI.FAHRENHEIT ); - relh = checkAndConvertInputAmountToExpectedUnits( relh, NonSI.PERCENT ); - double tmpfVal = tmpf.doubleValue(); - double relhVal = relh.doubleValue(); - /*If the temperature is less than 40 degrees, set the heat index to the temperature*/ - if ( tmpfVal <= 40 ) - prheat = tmpfVal; - else{ - /* - * Compute a simple heat index. If the value is less than 80 deg F - * use it - */ - prheat = ( float ) ( 61 + ( tmpfVal - 68 ) * 1.2 + relhVal * 0.094); - prheat = ( float ) ( ( tmpfVal + prheat ) * 0.5); - /*Else compute the full regression value*/ - if ( prheat >= 80.0 ){ - double t2 = tmpfVal * tmpfVal; - double r2 = relhVal * relhVal; - prheat = ( float ) ( -42.379 - + 2.04901523 * tmpfVal - + 10.14333127 * relhVal - - 0.22475541 * tmpfVal * relhVal - - 0.00683783 * t2 - - 0.05481717 * r2 - + 0.00122874 * t2 * relhVal - + 0.00085282 * tmpfVal *r2 - - 0.00000199 * t2 * r2 ); - /* - * Adjust for high regression at low relative humidity for temperatures above 80 degrees F. - */ - if ( ( relhVal <= 13.0 ) && ( ( tmpfVal >= 80.0 ) &&( tmpfVal <= 112.0 ) ) ) { - float adj1 = ( float) ( ( 13. - relhVal ) / 4 ); - float adj2 = ( float ) ( Math.sqrt ( ( 17 - Math.abs (tmpfVal - 95) ) / 17 ) ); - float adj = adj1 * adj2; - prheat -= adj; - } - /* - * Adjust for low regression at high relative humidity and temperatures in the mid-80s - */ - else if ( ( relhVal > 85 ) && ( ( tmpfVal >= 80.0 ) &&( tmpfVal <= 87.0 ) ) ){ - float adj1 = ( float) ( ( relhVal - 85.0 ) / 10.0 ); - float adj2 = ( float ) ( ( 87.0 - tmpfVal ) / 5); - float adj = adj1 * adj2; - prheat += adj; - } - } - } - return ( new Amount ( prheat,NonSI.FAHRENHEIT ) ); - } - - /** - * Computes the humiture index from the air temperature and the dew point - * temperature using the equation: PR_HMTR = TMPF + ( PR_VAPR ( DWPC ) - 21 ) - * @param tmpf - the air temperature (in Farenheit) - * @param dwpf - the dew point (in Farenheit) - * @return the humiture index if both the air temperature and the dewpoint temperature are - * valid values - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prHmtr( Amount tmpf, Amount dwpf) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prHmtr:"); - System.out.println(" tmpf = " + tmpf.doubleValue()); - System.out.println(" dwpf = " + dwpf.doubleValue()); - - double prhmtr = GempakConstants.RMISSD; - checkNullOrInvalidValue(dwpf); - checkNullOrInvalidValue(tmpf); - tmpf = checkAndConvertInputAmountToExpectedUnits( tmpf, NonSI.FAHRENHEIT ); - dwpf = checkAndConvertInputAmountToExpectedUnits( dwpf, NonSI.FAHRENHEIT ); - - Amount dwpc = checkAndConvertInputAmountToExpectedUnits(dwpf, SI.CELSIUS); - prhmtr = tmpf.doubleValue() + ( prVapr( dwpc ).doubleValue() - 21 ); - - return ( new Amount ( prhmtr, Unit.ONE)); - } - - /** - * Computes the rate of ice accretion/growth of ice - * on a vessel in salt water, in units of inches per 3 hours (the WMO standard) - * The formula used is - * IGRO = ( A*pr + B*pr*pr + C*pr*pr*pr ) * CVFAC - * where - * A = 2.73 * 10e-2 - * B = 2.91 * 10e-4 - * C = 1.84 * 10e-6 - * pr = ( sped * ( -1.7 - tmpc ) ) / ( 1 + 0.4 * ( sstc + 1.7 ) ) - * (priesendorfer regression) - * and - * CVFAC = 1.1811, to convert cm/hr to in/3hr. - * - * @param tmpc - the observed surface air temperature in Celsius - * @param sstc - the observed surface sea temperature in Celsius - * @param sped - the observed wind speed - * @return the rate of ice growth if all the input values are valid and lie between specific limits - * and if the rate of ice growth that is computed is greater than or equal to 0, - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prIgro ( Amount tmpc, Amount sstc, Amount sped) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prIgro:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" sstc = " + sstc.doubleValue()); - System.out.println(" sped = " + sped.doubleValue()); - - double prigro = GempakConstants.RMISSD; - checkNullOrInvalidValue( tmpc ) ; - checkNullOrInvalidValue( sstc ) ; - checkNullOrInvalidValue( sped ) ; - checkAndConvertInputAmountToExpectedUnits( tmpc, SI.CELSIUS ); - checkAndConvertInputAmountToExpectedUnits( sstc, SI.CELSIUS ); - - //TODO: verify that wind speed can have any unit - double tmpcVal = tmpc.doubleValue(); - double sstcVal = sstc.doubleValue(); - double spedVal = sped.doubleValue(); - - /* Check that these values are within the valid range */ - - if ( spedVal < 0 || spedVal > 50) - throw new InvalidRangeException("The wind speed must lie between 0 and 50. Both limits inclusive"); - - if ( tmpcVal < -20 || tmpcVal > 0 ) - throw new InvalidRangeException("The observed surface air temperature must lie between -20 and 0. Both limits inclusive"); - - if ( sstcVal < -1.7f || sstcVal > 12 ) - throw new InvalidRangeException("The observed surface sea temperature must lie between -1.7 and 12. Both limits inclusive"); - - double A = 0.0273f; - double B = 0.000291f; - double C = 0.00000184f; - double cvfac = 1.1811f; // to convert cm/hr to in per 3 hours - double pr = ( ( spedVal * ( -1.7 - tmpcVal ) ) / ( 1 + 0.4 * ( sstcVal + 1.7 ) ) ); // Compute the Priesendorfer regression - double pr2 = pr * pr; - prigro = ( A * pr + B * pr2 + C * pr * pr2 ) * cvfac; - if ( prigro < 0 ) - throw new InvalidRangeException("The rate of ice growth must be greater than or equal to 0"); - return ( new Amount ( prigro, NcUnits.INCHES_PER_THREE_HOURS ) ); - } - - /** - * Computes the latent heat of vaporization at constant pressure - * from the input temperature (in Celsius) using the equation: - * LHVP = ( 2.500 - .00237 * TMPC ) * 10E6 - * LHVP is in J/kg. - * @param tmpc - the input temperature (in Celsius) - * @return the latent heat of vaporization at constant pressure if - * the input temperature is valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prLhvp( Amount tmpc) throws InvalidValueException, NullPointerException{ - - System.out.println("From prLhvp:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - - checkNullOrInvalidValue(tmpc); - tmpc = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS); - double latentHeatOfVapr = ( float) ( (2.500 - 0.00237 * tmpc.doubleValue()) * 1000000); - return ( new Amount ( latentHeatOfVapr, NcUnits.JOULES_PER_KILOGRAM ) ); - } - - /** - * Computes the temperature of a parcel lifted (or sunk) - * adiabatically to a given pressure. - * @param thta - Potential temperature in Kelvin - * @param thte - Equivalent potential temp in Kelvin - * @param pres - Lifted pressure in millibar - * @return the lifted temperature in Celsius, if all the input parameters are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prLtmp ( Amount thta, Amount thte, Amount pres ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prLtmp:"); - System.out.println(" thta = " + thta.doubleValue()); - System.out.println(" thte = " + thte.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - - double prltmp = GempakConstants.RMISSD; - checkNullOrInvalidValue(thta); - checkNullOrInvalidValue(thte); - checkNullOrInvalidValue(pres); - thta = checkAndConvertInputAmountToExpectedUnits(thta, SI.KELVIN); - thte = checkAndConvertInputAmountToExpectedUnits(thte, SI.KELVIN); - - if ( pres.doubleValue() <= 0 ) - pres = new Amount ( 500, NcUnits.MILLIBAR ); - - /*Compute parcel temperatures on moist and dry adiabats*/ - Amount tmpe = prTmst ( thte, pres, new Amount (0, SI.KELVIN )); - Amount tmpd = prTmpk ( pres, thta); - checkNullOrInvalidValue(tmpe); - checkNullOrInvalidValue(tmpd); - /* - * ( Non-Javadoc ) - * The correct parcel temperature is the warmer of the - * temperature on the dry adiabat and the temperature on the - * moist adiabat. - */ - - double tmpeVal = tmpe.doubleValue(); - double tmpdVal = tmpd.doubleValue(); - if ( tmpeVal > tmpdVal ){ - prltmp = SI.KELVIN.getConverterTo(SI.CELSIUS).convert( tmpeVal ); - }else{ - prltmp = SI.KELVIN.getConverterTo(SI.CELSIUS).convert( tmpdVal ); - } - - return ( new Amount ( prltmp, SI.CELSIUS )); - } - - /** - * Computes the mountain obscuration threshold met indicator - * @param cmsl - Ceiling converted to MSL in 100's of ft - * @param otval - Mountain obscuration threshold in 100's of ft - * @return The mountain obscuration threshold met indicator if - * the input values are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prMobs ( Amount cmsl, Amount otval) throws InvalidValueException, NullPointerException{ - System.out.println("From prMobs:"); - System.out.println(" cmsl = " + cmsl.doubleValue()); - System.out.println(" otval = " + otval.doubleValue()); - - checkNullOrInvalidValue( cmsl ); - checkNullOrInvalidValue( otval ); - cmsl = checkAndConvertInputAmountToExpectedUnits( cmsl, NcUnits.HUNDREDS_OF_FEET ); - otval = checkAndConvertInputAmountToExpectedUnits( otval, NcUnits.HUNDREDS_OF_FEET ); - return ( cmsl.doubleValue() < otval.doubleValue() ? new Amount ( 1, Unit.ONE) : new Amount ( 1, Unit.ONE) ); - } - - /** - * Computes the mixing ratio in grams/kilograms from the dewpoint ( in Celsius ) - * and the pressure ( in mb) using the equation: - * MIXR = .62197 * ( e / ( PRES - e ) ) * 1000. - * where - * e = VAPR * corr - * corr = (1.001 + ( ( PRES - 100. ) / 900. ) * .0034) - * ( University of Wisconsin green sheet ). - * This method can also be used for the folloiwng computations: - * MIXS from TMPC and PRES - * SMXR from DWPC and PALT - * SMXS from TMPC and PALT - * - * @param dwpc - the dewpoint ( in Celsius ) - * @param pres - the pressure ( in mb) - * @return the missing ratio ( in grams / kilograms ) if both the input - * parameters are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prMixr ( Amount dwpc, Amount pres ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prMixr:"); - System.out.println(" dwpc = " + dwpc.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - - Amount prmixr = new Amount ( -9999.0, Unit.ONE); - checkNullOrInvalidValue(pres); - checkNullOrInvalidValue(dwpc); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - dwpc = checkAndConvertInputAmountToExpectedUnits(dwpc, SI.CELSIUS); - - /*Calculate vapor pressure*/ - Amount vapr = prVapr ( dwpc ); - - checkNullOrInvalidValue(vapr); - vapr = checkAndConvertInputAmountToExpectedUnits(vapr, NcUnits.MILLIBAR); - double pressureValue = pres.doubleValue(); - double vaporPressureValue = vapr.doubleValue(); - /* - * (Non-Javadoc) - * corr is a correction to the vapor pressure since the atmosphere is not an ideal gas. - */ - double corr = ( double ) (1.001 + ( ( pressureValue - 100 ) / 900 ) * 0.0034 ); - double e = corr * vaporPressureValue; - - /* - * Test for unphysical case of large E at low PRES - */ - if ( e <= ( 0.5 * pressureValue ) ){ - /*Calculate mixing ratio */ - prmixr = new Amount ( ( double ) ( 0.62197 * ( e / ( pressureValue - e ) ) * 1000 ) , NcUnits.GRAMS_PER_KILOGRAM ); - } - return prmixr; - } - - /** - * Extracts the pressure change ( in millibars ) from - * the pressure tendency information - * @param p03d - Pressure tendency information - * @return the pressure change ( in mb ) - * @throws NullPointerException - * @throws InvalidValueException - */ - //TODO : remove it to make it a part of display options or let it stay? - public static final Amount prP03c( Amount p03d) throws InvalidValueException, NullPointerException{ - System.out.println("From prP03c:"); - System.out.println(" p03d = " + p03d.doubleValue()); - - - double prp03c = GempakConstants.RMISSD; - checkNullOrInvalidValue( p03d ); - double p03dVal = p03d.doubleValue(); - float[] psign = {1, 1, 1, 1, 0, -1, -1, -1, -1}; - int itendc = ( int ) ( p03dVal / 1000); - float ptend = ( float ) ( ( ( int ) p03dVal ) % 1000 ) / 10f; - // TODO: compare tests with legacy - if ( itendc < psign.length ) - prp03c = psign[itendc] * ptend; - - return ( new Amount ( prp03c , NcUnits.MILLIBAR ) ); - } - - - /** - * Computes station pressure from altimeter and station elevation using - * the equation - * PALT = ALTM * ( 1 - ( SELK * GAMUSD / To ) ) ** expo - * where - * SELK = SELV / 1000 - * To = US Std. Atmos. sea level temp in Kelvin - * = TMCK + 15 - * expo = GRAVTY / ( GAMUSD * RDGAS ) * 1000 - * Wallace and Hobbs. - * - * @param altm - Altimeter in millibars - * @param selv - Station elevation in meters - * @return the pressure in millibars if none of the input values are missing - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prPalt ( Amount altm, Amount selv) throws InvalidValueException, NullPointerException{ - System.out.println("From prPalt:"); - System.out.println(" altm = " + altm.doubleValue()); - System.out.println(" selv = " + selv.doubleValue()); - - checkNullOrInvalidValue( altm ); - checkNullOrInvalidValue( selv ); - altm = checkAndConvertInputAmountToExpectedUnits( altm, NcUnits.MILLIBAR ); - selv = checkAndConvertInputAmountToExpectedUnits( selv, SI.METER ); - double hgtk = selv.getUnit().getConverterTo( SI.KILOMETER ).convert( selv.doubleValue() ); - - /*Calculate the exponent*/ - double expo = ( GempakConstants.GRAVTY / ( GempakConstants.GAMUSD * GempakConstants.RDGAS ) * 1000.0f); - - /*Calculate pressure*/ - double prpalt = ( altm.doubleValue() * Math.pow( ( 1 - ( hgtk * GempakConstants.GAMUSD/ ( GempakConstants.TMCK + 15 ) ) ) , expo ) ); - - return ( new Amount ( prpalt, NcUnits.MILLIBAR ) ); - } - - /** - * Computes the lifted condensation level pressure ( in mb ) for a parcel of air - * from TMPC, PRES, and TLCL. TLCL may be computed using PR_TLCL. The equation - * used is a modified Poisson equation: - * PLCL = PRES * ( TLCL / TMPK ) ** ( 1 / RKAPPA ) - * @param tmpc - Temperature ( in Celsius ) before lifting the air parcel - * @param pres - Pressure ( in mb ) before lifting the air parcel - * @param tlcl - Temperature ( in Kelvin ) at the lifted condensation level - * @return the pressure at the lifted condensation level, if all the inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prPlcl ( Amount tmpc, Amount pres, Amount tlcl) throws InvalidValueException, NullPointerException{ - double prplcl = GempakConstants.RMISSD; - System.out.println("From prPlcl:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" tlcl = " + tlcl.doubleValue()); - - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(pres); - checkNullOrInvalidValue(tlcl); - tmpc = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - tlcl = checkAndConvertInputAmountToExpectedUnits(tlcl, SI.KELVIN); - Amount tmpk = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.KELVIN) ; - double tclValue = tlcl.doubleValue(); - double tmpkValue = tmpk.doubleValue(); - double presValue = pres.doubleValue(); - prplcl = ( double ) ( presValue * Math.pow( ( tclValue / tmpkValue ) , ( 1 / GempakConstants.RKAPPA ) ) ); - return new Amount ( prplcl, NcUnits.MILLIBAR ); - } - - /** - *
-	 *  Computes the mean sea level pressure ( in mb ) from the station pressure ( in mb ),
-	 *  the temperature ( in deg Celsius), the dewpoint ( in deg Celsius ) and 
-	 *  the station elevation ( in meters ) using the equation:
-	 *  	PMSL = PRES * EXP ( ( GRAVTY * SELV ) / ( RDGAS * TVAVE ) ) 
-	 *     where
-	 *     		 TVAVE = avg virtual temp between station and sea level 
-	 *     		        = TVRK + ( DELTV / 2 )
-	 *     		 DELTV = GAMUSD * SELV / 1000
-	 *  Wallace and Hobbs.
-	 * @param pres - the station pressure ( in mb )
-	 * @param tmpc - the temperature ( in deg Celsius)
-	 * @param dwpc - the dewpoint ( in deg Celsius )
-	 * @param selv - the station elevation ( in meters )
-	 * @return the mean sea level pressure ( in mb ) if all the inputs are valid
-	 * 
- * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prPmsl ( Amount pres, Amount tmpc, Amount dwpc, Amount selv ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prPmsl:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" dwpc = " + dwpc.doubleValue()); - System.out.println(" selv = " + selv.doubleValue()); - checkNullOrInvalidValue( pres ); - checkNullOrInvalidValue( tmpc ); - checkNullOrInvalidValue( dwpc ); - checkNullOrInvalidValue( selv ); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - tmpc = checkAndConvertInputAmountToExpectedUnits(pres, SI.CELSIUS); - dwpc = checkAndConvertInputAmountToExpectedUnits(pres, SI.CELSIUS); - selv = checkAndConvertInputAmountToExpectedUnits(pres, SI.METER); - - /*Calculate virtual temperature*/ - Amount tv = prTvrk ( tmpc, dwpc, pres); - - /*deltaV and tVave*/ - double selvVal = selv.doubleValue(); - double deltaV = selvVal * GempakConstants.GAMUSD / 1000; - double tVave = tv.doubleValue() + ( deltaV / 2); - double mathFormula = ( GempakConstants.GRAVTY * selvVal ) / ( GempakConstants.RDGAS * tVave ); - double prpmsl = ( pres.doubleValue() * Math.exp(mathFormula)); - - return ( new Amount ( prpmsl, NcUnits.MILLIBAR ) ); - } - - /** - * Computes the maximum precipitation amount for upto 4 preciptiation values in inches - * @param p01 - First precipitation amount - * @param p02 - Second precipitation amount - * @param p03 - Third precipitation amount - * @param p04 - Fourth precipitation amount - * @return the maximum precipitation - * @throws NullPointerException - * @throws InvalidValueException - */ - - public static final Amount prPr6x ( Amount p01, Amount p02, Amount p03, Amount p04 ) throws InvalidValueException, NullPointerException{ - System.out.println("From prPr6x:"); - System.out.println(" p01 = " + p01.doubleValue()); - System.out.println(" p02 = " + p02.doubleValue()); - System.out.println(" p03 = " + p03.doubleValue()); - System.out.println(" p04 = " + p04.doubleValue()); - Amount[] tempArray = {p01, p02, p03, p04 }; - int index = 0; - double[] tempDblArray = new double[ 4 ]; - for ( Amount thisAmount : tempArray){ - checkNullOrInvalidValue(thisAmount); - - if ( thisAmount.getUnit() != NonSI.INCH ) { - thisAmount = checkAndConvertInputAmountToExpectedUnits(thisAmount, NonSI.INCH); - tempArray[index] = thisAmount; - } - tempDblArray[ index ] = thisAmount.doubleValue(); - index++; - } - - Arrays.sort(tempDblArray); - return ( new Amount ( tempDblArray[ 3 ], NonSI.INCH ) ); - } - - /** - * Computes PR24, the 24-hour precipitation calculated by - * summing four 6-hour precipitation values - * @param p01 - First 6-hour precipitation amount - * @param p02 - Second 6-hour precipitation amount - * @param p03 - Third 6-hour precipitation amount - * @param p04 - Fourth 6-hour precipitation amount - * @return the total 24-hour precipitation amount - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prPr24 ( Amount p01, Amount p02, Amount p03, Amount p04 ) throws InvalidRangeException, InvalidValueException, NullPointerException{ - System.out.println("From prPr24:"); - System.out.println(" p01 = " + p01.doubleValue()); - System.out.println(" p02 = " + p02.doubleValue()); - System.out.println(" p03 = " + p03.doubleValue()); - System.out.println(" p04 = " + p04.doubleValue()); - - checkNullOrInvalidValue( p01 ); - checkNullOrInvalidValue( p02 ); - checkNullOrInvalidValue( p03 ); - checkNullOrInvalidValue( p04 ); - - Amount[] tempArray = {p01, p02, p03, p04 }; - Arrays.sort(tempArray); - - Amount p24 = tempArray[3]; - double p01Val = p01.doubleValue(); - double p02Val = p02.doubleValue(); - double p03Val = p03.doubleValue(); - double p04Val = p04.doubleValue(); - double p24Val = p24.doubleValue(); - - if ( p24Val > 0 ){ - p24Val = 0; - if ( p01Val > 0 ) - p24Val += p01Val; - - if ( p02Val > 0 ) - p24Val += p01Val; - - if ( p03Val > 0 ) - p24Val += p01Val; - - if ( p04Val > 0 ) - p24Val += p01Val; - - } - - if ( p24Val < 0 ) - throw new InvalidRangeException("From prPr24: the total 24 hour precipitation amount cannot be less than 0 inches"); - - return ( new Amount ( p24Val, NonSI.INCH ) ); - } - - /** - * Computes the station pressure ( in mb ) from the temperature ( in deg Celsius ) - * and the potential temperature ( in Kelvin ) using Poisson's equation: - * PRES = 1000. * ( PR_TMCK (TMPC) / THTA ) ** (1 / RKAPPA) - * @param tmpc - temperature (in deg Celsius) - * @param thta - potential temperature ( in Kelvin ) - * @return the station pressure ( in mb ) if both the inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prPres ( Amount tmpc, Amount thta ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prPres:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" thta = " + thta.doubleValue()); - - - checkNullOrInvalidValue( tmpc ); - checkNullOrInvalidValue( thta ); - tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc, SI.CELSIUS ); - thta = checkAndConvertInputAmountToExpectedUnits( thta, SI.KELVIN ); - double tmpcVal = tmpc.doubleValue(); - double thtaVal = thta.doubleValue(); - if ( tmpcVal <= -GempakConstants.TMCK ) - throw new InvalidRangeException("From prPres: the temperature must be greater than -273.15"); - if ( thtaVal <= 0 ) - throw new InvalidRangeException("From prPres: the potential temperature must be greater than 0"); - - double tmpkVal = tmpc.getUnit().getConverterTo( SI.KELVIN ).convert( tmpcVal ); - double prpres = ( float ) ( 1000 * Math.pow(tmpkVal / thtaVal, 1 / GempakConstants.RKAPPA ) ); - - return ( new Amount ( prpres , NcUnits.MILLIBAR ) ); - } - - - /** - * Extracts the symbol code from the pressure tendency information. - * The code number is returned follow by 999 so that the output is a 4-digit number. - * @param p03d - the pressure tendency information - * @return the pressure tendency symbol code if the input is valid - * @throws NullPointerException - * @throws InvalidValueException - */ - //TODO add it to the Met Parameters or remove it and make it part of the display options instead? - public static final Amount prPtsy ( Amount p03d ) throws InvalidValueException, NullPointerException{ - System.out.println("From prPtsy:"); - System.out.println(" p03d = " + p03d.doubleValue()); - - checkNullOrInvalidValue( p03d ); - double p03dVal = p03d.doubleValue(); - int prptsy = -9999; - if ( !( p03dVal < 0 ) & !( p03dVal >= 9000 ) ) { - prptsy = ( ( int ) ( p03dVal / 1000 ) ) * 1000 + 999 ; - } - return ( new Amount ( prptsy, Unit.ONE ) ); - } - - /** - * Computes the relative humidity ( in percent ) from the input temperature and dewpoint using - * the equation: - * RELH = VAPR / VAPS * 100 - * where - * VAPR = vapor pressure - * = PR_VAPR ( DWPC ) - * VAPS = saturation vapor pressure - * = PR_VAPR ( TMPC ) - * - * @param tmpc - temperature ( in Celsius ) - * @param dwpc - dewpoint ( in Celsius) - * @return the relative humidity ( in percent ) if both inputs are valid and RMISSD ( -9999.0 ) otherwise - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prRelh ( Amount tmpc, Amount dwpc ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prRelh:"); - System.out.println(" input tmpc = " + tmpc.doubleValue()); - System.out.println(" input dwpc = " + dwpc.doubleValue()); - - if(dwpc.doubleValue() == -9999.0) { - int i = 100; - System.out.println("====, find a value of -9999.0!"); - i++; - } - double prrelh = GempakConstants.RMISSD; - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(dwpc); - tmpc = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS); - System.out.println(" after calling checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS), tmpc = " + tmpc.doubleValue()); - dwpc = checkAndConvertInputAmountToExpectedUnits(dwpc, SI.CELSIUS); - System.out.println(" after calling checkAndConvertInputAmountToExpectedUnits(dwpc, SI.CELSIUS) dwpc = " + dwpc.doubleValue()); - - /* Find the vapor pressure */ - Amount e = prVapr ( dwpc ); - System.out.println(" after calling Amount e = prVapr ( dwpc ) e = " + e.doubleValue()); - - /*Find the saturated vapor pressure*/ - Amount es = prVapr ( tmpc ); - System.out.println(" after calling Amount e = prVapr ( tmpc ) es = " + es.doubleValue()); - - /*Calculate humidity*/ - prrelh = ( e.doubleValue()/es.doubleValue()) * 100; - - System.out.println("From prRelh:, before return, e.doubleValue()="+ e.doubleValue()); - System.out.println("From prRelh:, before return, es.doubleValue()="+ es.doubleValue()); - System.out.println("From prRelh:, before return, prrelh="+ prrelh); - - return new Amount(prrelh,NonSI.PERCENT); - } - - /** - * Computes the dewpoint (in Celsius) from the temperature ( in Celsius ) - * and the relative humidity ( in percent ). - * @param tmpc - the temperature ( in deg Celsius ) - * @param relh - the relative humidity ( in percent ) - * @return the dewpoint in ( deg Celsius), if both inputs are valid and the value of the vapor - * pressure computed is greater than ( 1* e^(-30)) - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prRhdp ( Amount tmpc, Amount relh) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prRhdp:"); - System.out.println(" imput tmpc =" + tmpc.doubleValue()); - System.out.println(" imput relh = " + relh.doubleValue()); - - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(relh); - tmpc = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS); - relh = checkAndConvertInputAmountToExpectedUnits(relh, NonSI.PERCENT); - - /*Calculate saturation vapor pressure; test for existence*/ - Amount vaps = prVapr ( tmpc); - - /*Calculate vapor pressure*/ - double relativeHumidity = relh.doubleValue(); - double saturationVaporPressure = vaps.doubleValue(); - double vapr = relativeHumidity * saturationVaporPressure / 100; - - /*Calculate dewpoint. The VAPR test prevents LOG blowups*/ - double prrhdp = -191; - Amount dewpointAmount = null; - if ( vapr >= ( Math.pow(Math.E, -30) ) ){//legacy checks for 1.E-30 - prrhdp = ( double) ( 243.5 * ( Math.log(6.112) - Math.log(vapr) ) / ( Math.log(vapr) - Math.log(6.112) - 17.67 ) ); - - /* If the dew-point is less than -190 degrees C, it is treated as missing data - * Note: Legacy documents it but does not implement it. - * However, in CAVE, it was decided to implement it. - * */ - - if ( prrhdp < -190 ) - return dewpointAmount; - } - dewpointAmount = new Amount(prrhdp, SI.CELSIUS); - return dewpointAmount; - } - - - public static class RZLL{ - private static RZLL rzll; - - /**Station latitude in degrees*/ - Amount stltdg = null; - - /**Station longitude in degrees*/ - Amount stlndg = null; - - /**Range in kilometers*/ - Amount range = null; - - /**Geographic azimuth in radians*/ - Amount azim = null; - - /**Height above the ground in kilometers*/ - Amount hght = null; - - /**Latitude in degrees*/ - Amount xlat = null; - - /**Longitude in degrees*/ - Amount xlon = null; - - /** - * @return the xlat - */ - public Amount getXlat() { - return xlat; - } - /** - * @return the xlon - */ - public Amount getXlon() { - return xlon; - } - - - - private static RZLL getInstance(){ - if (rzll == null) - {rzll = new RZLL();} - return rzll; - } - - /** - * Computes the actual latitude/longitude given the station latitude/longitude, elevation - * and azimuth. - * It uses equations developed for use in the AOIPS radar. - * @param instltdg - Station latitude in degrees - * @param instlndg - Station longitude in degrees - * @param inrange - Range in kilometers - * @param inazim - Geographic azimuth in radians - * @param inhght - Height above ground in km - * @throws NullPointerException - * @throws InvalidValueException - */ - public void prRzll ( Amount instltdg,Amount instlndg,Amount inrange,Amount inazim,Amount inhght) throws InvalidValueException, NullPointerException{ - System.out.println("From prRzll:"); - System.out.println(" instltdg = " + instltdg.doubleValue()); - System.out.println(" instlndg = " + instlndg.doubleValue()); - System.out.println(" inrange = " + inrange.doubleValue()); - System.out.println(" inazim = " + inazim.doubleValue()); - System.out.println(" inhght = " + inhght.doubleValue()); - - checkNullOrInvalidValue( instltdg ); - checkNullOrInvalidValue( instlndg ); - checkNullOrInvalidValue(inrange); - checkNullOrInvalidValue(inazim); - checkNullOrInvalidValue(inhght); - instltdg = checkAndConvertInputAmountToExpectedUnits( instltdg, NonSI.DEGREE_ANGLE ); - instlndg = checkAndConvertInputAmountToExpectedUnits( instlndg, NonSI.DEGREE_ANGLE ); - inrange = checkAndConvertInputAmountToExpectedUnits(inrange, SI.KILOMETER ); - inazim = checkAndConvertInputAmountToExpectedUnits(inazim, SI.RADIAN ); - inhght = checkAndConvertInputAmountToExpectedUnits(inhght, SI.KILOMETER ); - - this.stltdg = new Amount ( instltdg.doubleValue(), NonSI.DEGREE_ANGLE ); - this.stlndg = new Amount ( instlndg.doubleValue(), NonSI.DEGREE_ANGLE ); - this.range = new Amount ( inrange.doubleValue(), SI.KILOMETER ); - this.azim = new Amount ( inazim.doubleValue(), SI.RADIAN ); - this.hght = new Amount ( inhght.doubleValue(), SI.KILOMETER ); - - double hdr = GempakConstants.RMISSD; - double elev = GempakConstants.RMISSD; - double rad = GempakConstants.RMISSD; - double radp= GempakConstants.RMISSD; - - /*Convert the station lat/lon to radians*/ - Amount stlat = checkAndConvertInputAmountToExpectedUnits( stltdg, NonSI.DEGREE_ANGLE ); - Amount stlon = checkAndConvertInputAmountToExpectedUnits( stlndg, NonSI.DEGREE_ANGLE ); - - - /*Get the elevation angle*/ - hdr = ( range.doubleValue() == 0.0f ? 0.0f : hght.doubleValue() / range.doubleValue() ); - // elev = (float) ( Math.abs(hdr) < 1.0f ? Math.asin(hdr) : 0.0f ); - elev = ( Math.abs(hdr) <= 1.0f ? Math.asin(hdr) : 0.0f ); - - double temp = (Math.pow( Math.sin(stlat.doubleValue()), 2 ) ) ; - - /*Get the earth's corrected radius*/ - rad = (6378.4 / Math.sqrt( 1 + ( 0.00677 * temp ) )); - radp = 4* ( rad / 3 ); - - double dist = GempakConstants.RMISSD; - double cx = GempakConstants.RMISSD; - double cy = GempakConstants.RMISSD; - double mathFormula1 = GempakConstants.RMISSD; - double mathFormula2 = GempakConstants.RMISSD; - - /*Calculate the distance*/ - double rangeVal = range.doubleValue(); - if ( elev > 0.2618f ) - dist = ( double ) ( rangeVal * Math.cos( elev )); - else{ - mathFormula1 = ( double ) ( (1 - ( Math.pow( elev, 2 ) / 2 ) ) - rangeVal * elev / radp); - dist = rangeVal * mathFormula1; - } - - /*Calculate the latitude and longitude*/ - double azimVal = azim.doubleValue(); - cx = ( double ) ( dist * Math.sin( azimVal ) ); - cy = ( double ) ( dist * Math.cos( azimVal ) ); - - // mathFormula2 = ( float ) ( ( ( 2 * Math.pow( rad, 2 ) ) * Math.tan( stlat ) )); - // xlat = ( float ) ( stlat + ( cy / rad ) - ( Math.pow(cx, 2) / mathFormula2 ) ); - double stlatVal = stlat.doubleValue(); - mathFormula2 = (double) ( ( Math.pow(cx, 2) / ( 2 * Math.pow( rad, 2 ) ) * Math.tan( stlatVal ) )); - double xlatVal = ( double ) ( stlatVal + ( cy / rad ) - mathFormula2 ); - double xlonVal = ( double ) ( stlon.doubleValue() + ( cx / ( rad * Math.cos( xlat.doubleValue() ) ) ) ) ; - - /*Change lat/lon to degrees*/ - xlatVal = SI.RADIAN.getConverterTo(NonSI.DEGREE_ANGLE).convert( xlatVal ); - xlonVal = SI.RADIAN.getConverterTo(NonSI.DEGREE_ANGLE).convert( xlonVal ); - - this.xlat = new Amount ( xlatVal, NonSI.DEGREE_ANGLE ); - this.xlon = new Amount ( xlonVal, NonSI.DEGREE_ANGLE ); - } - } - - - /** - * Computes the wind speed from the 'U' and 'V' components of - * the wind velocity. The formula is the square root of ( u^2 + v^2 ) - * - * @param uWnd - U component of velocity - * @param vWnd - V component of velocity - * @return the computed windspeed if both inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prSped ( Amount uWnd, Amount vWnd) throws InvalidValueException, NullPointerException{ - System.out.println("From prSped:"); - System.out.println(" uWnd = " +uWnd.doubleValue()); - System.out.println(" vWnd = " + vWnd.doubleValue()); - - checkNullOrInvalidValue( uWnd ); - checkNullOrInvalidValue( vWnd ); - Unit uWndUnits = uWnd.getUnit(); - Unit vWndUnits = vWnd.getUnit(); - if ( uWndUnits != vWndUnits && uWndUnits.isCompatible(vWndUnits)){ - double vWndVal = vWndUnits.getConverterTo( uWndUnits ).convert( vWnd.doubleValue() ); - vWnd = new Amount ( vWndVal, uWndUnits ); - } - double prsped = ( Math.sqrt( ( Math.pow(uWnd.doubleValue(), 2) + Math.pow(vWnd.doubleValue(), 2) ) ) ); - return new Amount ( prsped, uWndUnits ); - } - - /** - * Computes the potential temperature ( in Kelvin ) from the - * temperature (in Celsius ) and the pressure ( in mb ). - * @param tmpc - The temperature ( in Celsius ) - * @param pres - The pressure ( in mb ) - * @return the potential temperature ( in Kelvin ), if both inputs are valid - * . - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static Amount prThta ( Amount tmpc, Amount pres) throws InvalidRangeException, InvalidValueException, NullPointerException{ - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(pres); - tmpc = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.CELSIUS); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - double pressureValue = pres.doubleValue(); - if ( pressureValue <= 0 ) - throw new InvalidRangeException("From prThta( ) - pressure must be > 0 "); - - /*Change temperature in degrees Celsius to Kelvin.*/ - double temperatureInKelvin = (double) tmpc.getUnit().getConverterTo(SI.KELVIN).convert(tmpc.doubleValue() ); - - /*Calculate theta using Poisson's equation*/ - double prthta = ( double ) ( temperatureInKelvin * Math.pow( ( 1000 / pres.doubleValue()) , GempakConstants.RKAPPA) ); - return new Amount ( prthta , SI.KELVIN ); - } - - - /** - * Computes the equivalent potential temperature ( in Kelvin ) from - * the pressure ( in mb ), the temperature ( in Celsius ) and the dewpoint ( in Celsius ) - * using the equation: - * THTE = THTAM * EXP [ ( 3.376/TLCL - .00254 ) * - * ( MIXR * ( 1 + .81*.001*MIXR ) ) ] - * where - * THTAM = potential temperature of moist air - * = TMPK * (1000 / PRES) ** E - * E = RKAPPA * ( 1 - ( .28 * .001 * MIXR ) ) - * Bolton. - * - * @param pres - the pressure ( in mb ) - * @param tmpc - the temperature ( in Celsius ) - * @param dwpc - the dewpoint ( in Celsius ) - * @return the the equivalent potential temperature ( in Kelvin ), if all the input values - * are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prThte ( Amount pres, Amount tmpc, Amount dwpc ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prThte:"); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" dwpc = " + dwpc.doubleValue()); - - checkNullOrInvalidValue(pres); - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(dwpc); - if ( pres.doubleValue() <= 0) - throw new InvalidRangeException("From prThte() - Input pressure must be greater than 0 "); - - pres = checkAndConvertInputAmountToExpectedUnits( pres, NcUnits.MILLIBAR ); - dwpc = checkAndConvertInputAmountToExpectedUnits( dwpc, SI.CELSIUS ); - tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc, SI.CELSIUS ); - - /*Find mixing ratio*/ - Amount rmix = prMixr ( dwpc, pres); - checkNullOrInvalidValue(rmix); - - /*Change degrees Celsius to Kelvin*/ - Amount tmpk = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.KELVIN); - - - /*Calculate theta for moist air (thtam) */ - double mixingRatioVal = rmix.doubleValue(); - double pressureVal = pres.doubleValue(); - double tempVal = tmpk.doubleValue(); - - double e = ( double) ( GempakConstants.RKAPPA * (1 - (0.28 * 0.001 * mixingRatioVal) )); - double thtam = ( double ) ( tempVal * Math.pow(1000 / pressureVal, e)); - - /*Find the temperature at the lifted condensation level */ - Amount tlcl = prTlcl ( tmpc, dwpc ); - checkNullOrInvalidValue(tlcl); - double lclTemp = tlcl.doubleValue(); - e = ( ( 3.376f / lclTemp ) - 0.00254f ) * ( mixingRatioVal * ( 1 + 0.81f * 0.001f * mixingRatioVal )); - double prthte = ( double ) ( thtam * Math.exp(e)); - Amount equivPotentialTempAmount = new Amount(prthte, SI.KELVIN); - return equivPotentialTempAmount; - } - - /** - * Computes wet bulb potential temperature ( in Celsius ) from the - * pressure, temperature and dewpoint. The result is obtained by first - * computing the equivalent potential temperature (thte) of the the air parcel at level - * pres. Then the air parcel is brought to 1000 mb moist adiabatically to get the - * wet bulb potential temperature. - * @param pres - Pressure ( in millibars ) - * @param tmpc - Temperature ( in Celsius ) - * @param dwpc - Dewpoint ( in Celsius ) - * @return The wet bulb potential temperature ( in Celsius ) if all inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prThwc ( Amount pres, Amount tmpc, Amount dwpc) throws InvalidValueException, NullPointerException, InvalidRangeException { - System.out.println("From prThwc:"); - System.out.println(" press = " + pres.doubleValue()); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" dwpc = " + dwpc.doubleValue()); - - /*Check for missing and invalid data*/ - checkNullOrInvalidValue( pres ); - checkNullOrInvalidValue( tmpc ); - checkNullOrInvalidValue( dwpc ); - pres = checkAndConvertInputAmountToExpectedUnits( pres , NcUnits.MILLIBAR ); - tmpc = checkAndConvertInputAmountToExpectedUnits( tmpc , SI.CELSIUS ); - dwpc = checkAndConvertInputAmountToExpectedUnits( dwpc , SI.CELSIUS ); - double presVal = pres.doubleValue(); - if ( presVal <= 0 ) - throw new InvalidRangeException("From prThwc: Pressure must be greater than 0 mb"); - - /*Compute the thte*/ - Amount thte = prThte(pres, tmpc, dwpc); - - /*Check for missing 'thte' and compute wet bulb temperature.*/ - checkNullOrInvalidValue( thte ); - - /*Compute the parcel temperature (in Kelvin)*/ - - Amount prthwc = prTmst ( thte, - new Amount ( 1000, NcUnits.MILLIBAR ), - new Amount ( 0, SI.KELVIN ) ); - checkNullOrInvalidValue( prthwc ); - - /*Convert the parcel temperature to Celsius*/ - prthwc = checkAndConvertInputAmountToExpectedUnits(prthwc, SI.CELSIUS); - - return prthwc; - } - - - /** - * Computes the temperature at the lifted condensation level for a parcel of air - * given the temperature ( in Celsius ) and the dewpoint (in Celsius) using the - * equation: - * TLCL = [ 1 / ( 1 / (DWPK-56) + ALOG (TMPK/DWPK) / 800 ) ] + 56 - * Bolton. - * @param tmpc - the temperature ( in Celsius ) - * @param dwpc - the dewpoint ( in Celsius ) - * @return the lifted condensation level temperature In Kelvin, if both input values are valid - * - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prTlcl ( Amount tmpc, Amount dwpc ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prTlcl:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" dwpc = " + dwpc.doubleValue()); - - - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(dwpc); - if ( tmpc.doubleValue() < -GempakConstants.TMCK || dwpc.doubleValue() < -GempakConstants.TMCK){ - throw new InvalidRangeException("From prTlcl: Input temperature and dewpoint cannot be less than -273.15"); - } - Amount tmpk = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.KELVIN); - Amount dwpk = checkAndConvertInputAmountToExpectedUnits(dwpc, SI.KELVIN); - double tempVal = tmpk.doubleValue(); - double dewpointVal = dwpk.doubleValue(); - double lclTemp = ( double ) ( ( 800 * ( dewpointVal - 56 ) / ( 800 + ( dewpointVal - 56 ) * Math.log ( tempVal / dewpointVal ) ) ) + 56 ); - Amount prtlcl = new Amount ( lclTemp, SI.KELVIN ); - - return prtlcl; - } - - /** - * Computes the temperature ( in Kelvin ) from the pressure ( in mb ) and - * the potential temperature ( in Kelvin ) using the Poisson equation: - * TMPK = THTA * ( PRES / 1000 ) ** RKAPPA - * - * @param pres - the pressure ( in mb ) - * @param thta - the potential temperature ( in Kelvin ) - * @return the temperature ( in Kelvin ) - * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prTmpk ( Amount pres, Amount thta ) throws InvalidRangeException, InvalidValueException, NullPointerException{ - System.out.println("From prTmpk:"); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println("thta = " + thta.doubleValue()); - - Amount prtmpk = new Amount ( GempakConstants.RMISSD, Unit.ONE ); - - checkNullOrInvalidValue(pres); - checkNullOrInvalidValue(thta); - pres = checkAndConvertInputAmountToExpectedUnits(pres, NcUnits.MILLIBAR); - thta = checkAndConvertInputAmountToExpectedUnits(thta, SI.KELVIN); - double pressureValue = pres.doubleValue(); - double thtaValue = thta.doubleValue(); - if ( pressureValue >= 0){ - double temperature = ( double ) ( thtaValue * ( Math.pow( pressureValue / 1000f, GempakConstants.RKAPPA ) ) ); - prtmpk = new Amount ( temperature , SI.KELVIN ); - return prtmpk; - } - else{ - throw new InvalidRangeException("From prTmpk() - pressure cannot be less than 0 mb"); - } - } - - /** - *
-	 * Computes the parcel temperature ( in Kelvin ) from the equivalent potential temp ( in Kelvin ),
-	 * pressure ( in millibars ) and the first guess temperature ( in Kelvin ). 
-	 * The parcel temperature at level pres on a specified moist adiabat ( thte ). 
-	 * The computation is an iterative Newton-Raphson technique of the form:
-	 * 
-	 * x = x(guess) + [ f( x ) - f( x(guess) ) ] / f'( x(guess) )
-	 * f' is approximated with finite differences
-	 * f' = [ f( x(guess) + 1 ) - f( x(guess) ) ] / 1
-	 * 
-	 * If tguess is 0, a reasonable first guess will be made.
-	 * Convergence is not guaranteed for extreme input values.  If the
-	 * computation does not converge after 100 iterations, the missing 
-	 * data value will be returned. 
-	 * @param thte      - Equivalent potential temp ( in Kelvin )
-	 * @param pres      - Pressure ( in millibars )
-	 * @param tguess   - First guess temperature ( in Kelvin )
-	 * @return the Parcel temperature in Kelvin if all the input values are valid 
-	 * (without being extreme) and if a convergence is obtained within 100 iterations 
-	 * 
- * @throws InvalidRangeException - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prTmst ( Amount thte, Amount pres, Amount tguess) throws InvalidRangeException, InvalidValueException, NullPointerException{ - double prtmst = GempakConstants.RMISSD; - System.out.println("From prTmst:"); - System.out.println(" thte = " + thte.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - System.out.println(" tguess = " + tguess.doubleValue()); - - checkNullOrInvalidValue( thte ); - checkNullOrInvalidValue( pres ); - checkNullOrInvalidValue( tguess ); - thte = checkAndConvertInputAmountToExpectedUnits( thte, SI.KELVIN ); - pres = checkAndConvertInputAmountToExpectedUnits( pres, NcUnits.MILLIBAR ); - tguess = checkAndConvertInputAmountToExpectedUnits( tguess, SI.KELVIN ); - double thteVal = thte.doubleValue(); - double presVal = pres.doubleValue(); - double tguessVal = tguess.doubleValue(); - - if ( thteVal <= 0 ) - throw new InvalidRangeException(" From prTmst(): Potential temperature must be greater than 0"); - - else if ( presVal <= 0 ) - throw new InvalidRangeException(" From prTmst(): Pressure must be greater than 0"); - else if ( tguessVal < 0 ) - throw new InvalidRangeException(" From prTmst(): First guess temperature must be greater than 0"); - double tg = tguess.doubleValue(); - /* - * If tguess is passed as 0. it is computed from an MIT scheme - */ - if ( tg == 0 ){ - double diffVar = thte.doubleValue() - 270; - double mathFormula1 = (double) ( diffVar > 0 ? diffVar : 0.0 ); - tg = (double) ( ( thte.doubleValue() - 5.0f * ( Math.pow ( mathFormula1, 1.05f) ) ) * ( Math.pow ( pres.doubleValue() / 1000.0f, 0.2f ) ) ); - } - - /*Set convergence and initial guess in degrees Celsius*/ - double epsi = 0.01f; - double tgnu = SI.KELVIN.getConverterTo(SI.CELSIUS).convert(tg) ; - - /* - * Set a limit of 100 iterations. Compute tenu,tenup, the - * thte's at one degree above the guess temperature. - */ - int index = 0; - while( index < 100 ){ - double tgnup = tgnu + 1; - Amount tgnuAmount = new Amount ( tgnu, SI.CELSIUS ); - Amount tgnupAmount = new Amount ( tgnup, SI.CELSIUS ); - Amount tenu = prThte ( pres, tgnuAmount, tgnuAmount ); - Amount tenup = prThte ( pres, tgnupAmount, tgnupAmount ); - /*Check that the THTE's exist.*/ - checkNullOrInvalidValue(tenu); - checkNullOrInvalidValue(tenup); - - /*Compute the correction*/ - double tenuVal = tenu.doubleValue(); - double tenupVal = tenup.doubleValue(); - double cor = ( thteVal - tenuVal ) / ( tenupVal - tenuVal ); - tgnu += cor; - - if ( ( cor < epsi ) && (-cor < epsi) ){ - - /*return on convergence*/ - prtmst = tgnuAmount.getUnit().getConverterTo(SI.KELVIN).convert(tgnu); - break; - } - - index++; - } - return new Amount ( prtmst, SI.KELVIN); - } - - /** - *
-	 * Computes wet bulb temperature from the temperature, mixing ratio, and pressure.
-	 * The result is obtained by solving for the temperature at which saturation occurs,
-	 *  when the latent heat required to vaporize the water is provided by a cooling of the air.
-	 *  The equation representing the process is:
-	 *   ( tmpk - tmwb ) * cp - ( Rsat (tmwb) - rmix ) * lvap = 0  
-	 *  This implicit equation is solved by Newton's method, since the 
-	 *  saturation mixing ratio Rsat is a transcendental function of tmwb.
-	 *  The expressions for the heat of vaporization (LVAP) and saturation 
-	 *   vapor pressure are equations (2) and (10) from Bolton (MWR, 1980).
-	 *   
- * @param tmpk - Temperature (K) - * @param rmix - Mixing ratio (g/kg) - * @param pres - Pressure (mb) - * @return Wet bulb temperature (K) if all inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prTmwb ( Amount tmpk, Amount rmix, Amount pres) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prTmwb:"); - System.out.println(" tmpk = " + tmpk.doubleValue()); - System.out.println(" rmix = " + rmix.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - - Amount prtmwb = null; - /*Check for missing and invalid data*/ - checkNullOrInvalidValue( tmpk ); - checkNullOrInvalidValue( rmix ); - checkNullOrInvalidValue( pres ); - tmpk = checkAndConvertInputAmountToExpectedUnits( tmpk, SI.KELVIN ); - rmix = checkAndConvertInputAmountToExpectedUnits( rmix , NcUnits.GRAMS_PER_KILOGRAM ); - pres = checkAndConvertInputAmountToExpectedUnits( pres , NcUnits.MILLIBAR ); - double presVal = pres.doubleValue(); - if ( presVal <= 0 ) - throw new InvalidRangeException("From prTmwb - pressure value must be greater than 0 "); - /*Change temperature to degrees Celsius.*/ - Amount tmp = checkAndConvertInputAmountToExpectedUnits(tmpk, SI.CELSIUS); - - /*Compute the latent heat of vaporization.*/ - Amount lvap = prLhvp ( tmp ); - - /*Compute the specific heat of moist air*/ - double rmixVal = rmix.doubleValue()/1000; - double cp = ( 1005.7 * ( 1.0 + 0.887 * rmixVal ) ); - - double rlocp = lvap.doubleValue() / cp; - - /*Do Newton iteration*/ - int iter = 0; - double twb = tmp.doubleValue(); - boolean isConvrg = false; - - double A = 6.112; - double B = 17.67; - double C = 243.5; - double EPSI = 0.622; - double G = B * C; - double ERRMAX = 0.001; - double tmpVal = tmp.doubleValue(); - while ( iter <= 50 && !isConvrg ){ - iter++; - double bt = B * twb; - double tpc = twb + C; - double d = ( ( presVal / A ) * Math.exp( ( -bt ) / tpc ) ); - double dm1 = d - 1; - double f = (tmpVal - twb ) - rlocp * ( EPSI / dm1 - rmixVal ); - double df = (-G) / ( tpc * tpc ); - df = d * df * rlocp * EPSI / ( dm1 * dm1 ) - 1; - double cor = f / df; - twb = twb - cor; - if ( Math.abs ( cor ) <= ERRMAX ) - isConvrg = true; - } - - if ( isConvrg ){ - Amount twk = new Amount ( twb , SI.KELVIN ); - if ( twk.doubleValue() > tmpk.doubleValue() ) - twk = new Amount ( tmpk.doubleValue(), SI.KELVIN ) ; - - prtmwb = twk; - } - // } - return prtmwb; - } - - - /** - * Computes the virtual temperature ( in Kelvin ) from the temperature ( in Celsius ), - * dewpoint ( in Celsius ) and pressure ( in mb ) where DWPC and PRES are used to compute - * MIXR. The following equation is used: - * TVRK = TMPK * (1 + .001 * MIXR / .62197) / (1 + .001 * MIXR) - * If DWPC is missing, dry air is assumed and TMPK is returned. - * - * @param tmpc - Temperature ( in Celsius ) - * @param dwpc - Dewpoint ( in Celsius ) - * @param pres - Pressure ( in mb ) - * @return the virtual temperature ( in Kelvin ) - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prTvrk( Amount tmpc, Amount dwpc, Amount pres ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prTvrk:"); - System.out.println(" tmpc = " + tmpc.doubleValue()); - System.out.println(" dwpc = " + dwpc.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - - Amount prtvrk = null; - checkNullOrInvalidValue(tmpc); - checkNullOrInvalidValue(pres); - /*If dewpoint is missing, return temperature*/ - - if ( dwpc == null || dwpc.doubleValue() == GempakConstants.RMISSD) - return checkAndConvertInputAmountToExpectedUnits(tmpc, SI.KELVIN); - - else { - /*Change temperature to Kelvin.*/ - Amount tmpk = checkAndConvertInputAmountToExpectedUnits(tmpc, SI.KELVIN); - - /* Find mixing ratio in g/kg; if missing, return temperature */ - Amount rmix = prMixr ( dwpc, pres ); - - double virtualTemp; - if (rmix.doubleValue() == GempakConstants.RMISSD ) - virtualTemp = (double) tmpc.getUnit().getConverterTo(SI.KELVIN).convert(tmpc.doubleValue()); - else{ - double mixingRatioVal = rmix.doubleValue(); - double temp = tmpk.doubleValue(); - virtualTemp =( double ) ( temp * ( 1 + 0.001 * mixingRatioVal / 0.62197 ) / ( 1 + 0.001 * mixingRatioVal ) ); - - } - prtvrk = new Amount (virtualTemp, SI.KELVIN); - } - return prtvrk; - } - - /** - * Computes the 'U' component of the wind from its speed and direction - * @param sped - wind speed - * @param drct - wind direction - * @return The 'U' component of the wind if both inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prUwnd ( Amount sped, Amount drct) throws InvalidValueException, NullPointerException { - System.out.println("From prUwnd:"); - System.out.println(" sped = " + sped.doubleValue()); - System.out.println(" drct = " + drct.doubleValue()); - checkNullOrInvalidValue( drct ); - checkNullOrInvalidValue( sped ); - drct = checkAndConvertInputAmountToExpectedUnits(drct, NonSI.DEGREE_ANGLE ); - double pruwnd = ( ( -Math.sin( drct.doubleValue() * GempakConstants.DTR ) ) * sped.doubleValue() ); - return new Amount ( pruwnd, sped.getUnit() ); //TODO :verify the units - } - - /** - * Computes the 'V' component of the wind from its speed and direction - * @param sped - wind speed - * @param drct - wind direction - * @return The 'V' component of the wind if both inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prVwnd ( Amount sped, Amount drct) throws InvalidValueException, NullPointerException { - System.out.println("From prVwnd:"); - System.out.println(" sped = " + sped.doubleValue()); - System.out.println(" drct = " + drct.doubleValue()); - checkNullOrInvalidValue( drct ); - checkNullOrInvalidValue( sped ); - drct = checkAndConvertInputAmountToExpectedUnits(drct, NonSI.DEGREE_ANGLE ); - double prvwnd = ( ( -Math.cos( drct.doubleValue() * GempakConstants.DTR ) ) * sped.doubleValue() ); - return new Amount ( prvwnd, sped.getUnit() ); //TODO :verify the units - } - - - /** - * Computes the vapor pressure ( in mb) from the input - * dewpoint temperature in Celsius using the equation: - * VAPR = 6.112 * EXP [ (17.67 * dewpointValue) / (dewpointValue + 243.5) ] - * @param dwpc - the dewpoint temperature ( in Celsius ) - * @return the vapor pressure ( in mb) from the dewpoint temperature if it is valid - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prVapr ( Amount dwpc) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prVapr:"); - System.out.println(" dwpc = " + dwpc.doubleValue()); - - checkNullOrInvalidValue(dwpc); - dwpc = checkAndConvertInputAmountToExpectedUnits(dwpc, SI.CELSIUS); - double dewpointValue = dwpc.doubleValue(); - if ( dewpointValue >= -240.0f ) - return ( new Amount ( ( 6.112 * ( Math.exp ( ( 17.67 * dewpointValue ) / ( dewpointValue + 243.5) ) ) ) , - NcUnits.MILLIBAR ) ); - else{ - throw new InvalidRangeException("Exception from prVapr() - dewpoint cannot be less than -240 "); - } - } - - /** - * Computes the visibility ( in nautical miles ) from the input visibility ( in kilometers ) - * @param vsbk - visibility ( in kilometers ) - * @return visibility ( in nautical miles ) if the input is valid - * @throws NullPointerException - * @throws InvalidValueException - */ - //TODO: remove this - since the getValueAs(Unit) offers the same facility? - public static final Amount prVskn ( Amount vsbk) throws InvalidValueException, NullPointerException { - System.out.println("From prVskn:"); - System.out.println(" vsbk = " + vsbk.doubleValue()); - - checkNullOrInvalidValue( vsbk ); - vsbk = checkAndConvertInputAmountToExpectedUnits( vsbk, SI.KILOMETER ); - return ( checkAndConvertInputAmountToExpectedUnits(vsbk, NonSI.NAUTICAL_MILE ) ); - } - - /** - * Computes the wind chill equivalent temperature ( the temperature with calm winds that produces the same - * cooling effect as the given temperature with the given wind speed) - * @param tmpf - Air temperature ( in Farenheit ) - * @param sknt - Wind speed ( in knots ) - * @return the wind chill equivalent temperature ( in Farenheit ), - * if the inputs are valid - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prWceq ( Amount tmpf, Amount sknt ) throws InvalidValueException, NullPointerException{ - System.out.println("From prWceq:"); - System.out.println(" tmpf = " + tmpf.doubleValue()); - System.out.println(" sknt = " + sknt.doubleValue()); - - double prwceq = GempakConstants.RMISSD; - checkNullOrInvalidValue( tmpf ); - checkNullOrInvalidValue( sknt ); - - /*Convert input variables to Celsius and meters/second.*/ - Amount tmpc = checkAndConvertInputAmountToExpectedUnits(tmpf, SI.CELSIUS); - Amount sped = checkAndConvertInputAmountToExpectedUnits(sknt, SI.METERS_PER_SECOND) ; - - - if ( sped.doubleValue() <= 1.34) - /*If the wind speed does not exceed 1.34 m/s ( not much wind to contribute to the wind chill), - * return the input temperature as the wind chill temperature*/ - prwceq = tmpc.getUnit().getConverterTo(NonSI.FAHRENHEIT).convert(tmpc.doubleValue()); - else{ - /* - * Compute the wind chill temp if the inputs are not missing and - * and the wind speed is greater than 1.34 m/s. - * Equations for wind chill computation - * from R. Falconer, "Windchill, A Useful Wintertime Weather Variable", Weatherwise, Dec 1968. - */ - if ( sped.getUnit() == SI.METERS_PER_SECOND ){ - float windChill = ( float ) ( 33.0 - ( ( 33.0 - tmpc.doubleValue() ) * wci( sped.doubleValue() ) / wci( 1.34f ) ) ); - prwceq = tmpc.getUnit().getConverterTo(NonSI.FAHRENHEIT).convert(windChill); - } - } - - return ( new Amount ( prwceq, NonSI.FAHRENHEIT)); - } - - - // /** - // * Computes the numeric total cloud cover for the worst case aviation flight condition, - // * based on the categorical identification of flight rules for prevailing and temporary / probability conditions. - // * @param xvfr - Prevailing categorical id of flight rules - // * @param txvf - Temporary / Probability categorical id of flight rules - // * @param cfrt - Prevailing numeric total cloud cover - // * @param tcfr - Temporary / Probability numeric total cloud cover - // * @return Worst case numeric total cloud cover or RMISSD (-9999) if the computation does not fall through - // * @throws NullPointerException - // * @throws InvalidValueException - // */ - // public static final Amount prWcfr ( Amount xvfr, Amount txvf, Amount cfrt, Amount tcfr) throws InvalidValueException, NullPointerException { - // double prwcfr = GempakConstants.RMISSD; - // checkNullOrInvalidValue( tcfr ); - // checkNullOrInvalidValue( cfrt ); - // double cfrtVal = cfrt.doubleValue(); - // double tcfrVal = tcfr.doubleValue(); - // if ( ( xvfr == null || xvfr.doubleValue() == GempakConstants.RMISSD ) - // || ( txvf == null || txvf.doubleValue() == GempakConstants.RMISSD )) - // prwcfr = ( cfrtVal > tcfrVal ? cfrtVal : tcfrVal ); - // - // else { - // double txvfVal = txvf.doubleValue(); - // double xvfrVal = xvfr.doubleValue(); - // if ( txvfVal < xvfrVal ) - // prwcfr = tcfrVal; - // else if ( txvfVal == xvfrVal) - // prwcfr = ( cfrtVal > tcfrVal ? cfrtVal : tcfrVal ); - // else - // prwcfr = cfrtVal; - // } - // return ( new Amount ( prwcfr ,Unit.ONE)); - // } - - - /** - * Computes the wind chill temperature from the air temperature and the wind speed - * @param tmpf - Air temperature ( in degree Farenheit ) - * @param sknt - Wind speed ( in knots ) - * @return the wind chill temperature ( in Farenheit ) if none of the inputs are missing - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prWcht ( Amount tmpf, Amount sknt) throws InvalidValueException, NullPointerException{ - System.out.println("From prWcht:"); - System.out.println(" tmpf = " + tmpf.doubleValue()); - System.out.println(" sknt = " + sknt.doubleValue()); - double prwrcht = GempakConstants.RMISSD; - checkNullOrInvalidValue(sknt); - checkNullOrInvalidValue(tmpf); - - /*Convert the speed to miles per hour*/ - Amount smph = checkAndConvertInputAmountToExpectedUnits(sknt, NonSI.MILES_PER_HOUR); - - /*If the inputs are not missing , check if the wind speed is <= 3 miles per hour*/ - - double smphVal = smph.doubleValue(); - double tmpfVal = tmpf.doubleValue(); - if( smphVal <= 3 ) - prwrcht = tmpfVal ; - else{ - /*Compute the wind-chill temperature for wind speeds that exceed 3 miles per hour*/ - float wcht = ( float ) ( 35.74 + 0.6215 * tmpfVal -35.75 * Math.pow(smphVal, 0.16) - + 0.4275 * tmpfVal * Math.pow(smphVal, 0.16) ); - prwrcht = ( wcht > tmpfVal ? tmpfVal : wcht); - } - return ( new Amount ( prwrcht , NonSI.FAHRENHEIT ) ); - } - - - /** - * Computes the wind component towards a specific direction from the - * wind direction, wind speed and direction of desired component. - * @param drct - the wind direction in degrees - * @param sped - the wind speed in m/s - * @param dcmp - the direction of the desired component - * @return the component of the wind (in m/s) if none of the input parameters are missing - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prWcmp ( Amount drct, Amount sped, Amount dcmp ) throws InvalidValueException, NullPointerException{ - System.out.println("From prWcmp:"); - System.out.println(" sped = " + sped.doubleValue()); - System.out.println(" drct = " + drct.doubleValue()); - System.out.println(" dcmp = " + dcmp.doubleValue()); - /*Check for missing input parameters*/ - checkNullOrInvalidValue( drct ); - checkNullOrInvalidValue( sped ); - checkNullOrInvalidValue( dcmp ); - drct = checkAndConvertInputAmountToExpectedUnits( drct , NonSI.DEGREE_ANGLE ); - dcmp = checkAndConvertInputAmountToExpectedUnits( dcmp , NonSI.DEGREE_ANGLE ); - sped = checkAndConvertInputAmountToExpectedUnits( sped , SI.METERS_PER_SECOND ); - - /*Calculate wind speed toward specified direction*/ - double prwcmp = sped.doubleValue() * ( -Math.cos( ( drct.doubleValue() - dcmp.doubleValue()) *GempakConstants.DTR ) ) ; - - return new Amount ( prwcmp , SI.METERS_PER_SECOND); - } - - /** - * Computes the wind component toward a direction 90 degrees counterclockwise of a specified direction. - * If no direction is specified, the component toward north is returned. - * @param drct - wind direction ( in degrees ) - * @param sped - wind speed ( in knots or m/s ) - * @param dcmp - specified wind direction ( in degrees ) - * @return a component of the wind in m/s if the input wind speed and direction are valid and if - * the specified wind direction is between 0 degrees and 360 degrees. - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prWnml ( Amount drct, Amount sped, Amount dcmp) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prWnml:"); - System.out.println(" sped = " + sped.doubleValue()); - System.out.println(" drct = " + drct.doubleValue()); - System.out.println(" dcmp = " + dcmp.doubleValue()); - checkNullOrInvalidValue(sped); - checkNullOrInvalidValue(drct); - checkNullOrInvalidValue(dcmp); - drct = checkAndConvertInputAmountToExpectedUnits( drct , NonSI.DEGREE_ANGLE ); - dcmp = checkAndConvertInputAmountToExpectedUnits( dcmp , NonSI.DEGREE_ANGLE ); - sped = checkAndConvertInputAmountToExpectedUnits( sped , SI.METERS_PER_SECOND ); - if ( ( dcmp.doubleValue() < 0 ) && ( dcmp.doubleValue() > 360 ) ){ - throw new InvalidRangeException("From prWnml - the wind direction 'dcmp' mus be greater than or equal to 0 and less than or equal to 360"); - } - /* - * Calculate wind speed 90 degrees to left of given direction. - */ - double prwnml = ( float ) ( sped.doubleValue() * ( -Math.cos( ( drct.doubleValue() - dcmp.doubleValue() - 90 ) * GempakConstants.DTR ) ) ); - return ( new Amount ( prwnml , SI.METERS_PER_SECOND ) ); - } - - // /** - // * Computes the packed wind speed and direction from the input wind speed and wind direction - // * @param drct - wind direction ( in degrees ) - // * @param sped - wind speed ( in knots or m/s ) - // * @return the packed speed and direction - // */ - // public static final Amount prWind ( Amount drct, Amount sped ){ - // float prwind = GempakConstants.RMISSD; - //// if ( !MissingValueTester.isDataValueMissing(drct) - //// && !MissingValueTester.isDataValueMissing(sped)){ - // /* - // * (Non-Javadoc) - // * The packed wind speed and direction are of the form: - // * SSSDDD, where SSS - wind speed ( in knots or m/s ) and - // * DDD - wind direction in degrees - // * - // */ - // int jdrct = (int ) Math.round( drct.doubleValue() ); - // int jsped = (int) Math.round( sped.doubleValue() ); - // prwind = jdrct + jsped * 1000; - //// } - // return prwind; - // } - - /** - * Computes the worst case categorical identification of flight rules for prevailing - * and temporary / probability conditions. - * @param xvfr - Prevailing categorical id of flight rules - * @param txvf - Temporary / probability categorical id of flight rules - * @return The worst case categorical id of flight rules - * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prWxvf ( Amount xvfr, Amount txvf ) throws InvalidValueException, NullPointerException{ - System.out.println("From prWxvf:"); - System.out.println(" xvfr = " + xvfr.doubleValue()); - System.out.println(" txvf = " + txvf.doubleValue()); - - double prwxvf = GempakConstants.RMISSD; - if ( txvf != null && xvfr != null ){ - - double xvfrVal = xvfr.doubleValue(); - double txvfVal = txvf.doubleValue(); - - if ( txvfVal != GempakConstants.RMISSD && xvfrVal != GempakConstants.RMISSD ) - prwxvf = ( xvfrVal < txvfVal ? xvfrVal : txvfVal ); - - else if (xvfrVal == GempakConstants.RMISSD && txvfVal != GempakConstants.RMISSD ) - prwxvf = xvfrVal; - - else if ( txvfVal != GempakConstants.RMISSD && xvfrVal != GempakConstants.RMISSD ) - prwxvf = txvfVal; - } - - return ( new Amount ( prwxvf , Unit.ONE ) ); - } - - - /** - *
-	 * Computes LIFR/IFR/MVFR/VFR flight conditions based on ceiling and visibility.
-	 * @param ceil - Ceiling in hundreds of feet
-	 * @param vsby - Visibility in statute miles
-	 * @return Flight conditions index value: 
-	 *     0 - LIFR
-	 *     1 - IFR
-	 *     2 - MVFR
-	 *     3 - VFR 
-	 *  
- * @throws NullPointerException - * @throws InvalidValueException - */ - public static final Amount prXvfr ( Amount ceil, Amount vsby ) throws InvalidValueException, NullPointerException{ - System.out.println("From prXvfr:"); - System.out.println(" ceil = " + ceil.doubleValue()); - System.out.println(" vsby = " + vsby.doubleValue()); - - - double prxvfr = GempakConstants.RMISSD; - double vc = GempakConstants.RMISSD; - double vs = GempakConstants.RMISSD; - if ( vsby == null ) - return null; - checkNullOrInvalidValue( ceil ); - ceil = checkAndConvertInputAmountToExpectedUnits( ceil, NcUnits.HUNDREDS_OF_FEET ); - vsby = checkAndConvertInputAmountToExpectedUnits(vsby, NonSI.MILE ); - /*Compute categorical flight rules*/ - - //Check the ceiling value - - double ceilVal = ceil.doubleValue(); - - double vsbyVal = vsby.doubleValue(); - - if ( ceilVal < 0){ - //no-op. So vc retains its RMISSD value - } - else if ( ceilVal < 5 ) - vc = 0; - else if ( ceilVal < 10 ) - vc = 1; - else if ( ceilVal <= 30 ) - vc = 2; - else if ( ( vsbyVal > 5 ) - || ( vsbyVal < 0 ) - || ( vsbyVal == GempakConstants.RMISSD ) ){ - prxvfr = 3; - } - - /*Check the visibility value.*/ - if ( vsbyVal != GempakConstants.RMISSD ){ - if ( vsbyVal < 0 ){ - //no-op. So vs retains it RMISSD value - } - else if ( vsbyVal < 1 ) - vs = 0; - else if ( vsbyVal < 3) - vs = 1; - else if ( vsbyVal <= 5) - vs = 2; - else - vs = 3; - } - - /*Determine the more restrictive of the two values.*/ - if ( vc == GempakConstants.RMISSD ) - prxvfr = vs; - else if ( vs == GempakConstants.RMISSD ) - prxvfr = vc; - else - prxvfr = ( vc < vs ? vc : vs ); - - return ( new Amount ( prxvfr , Unit.ONE ) ) ; - - } - - /** - * Computes station elevation from altimeter and station pressure. - * It is also used to estimate height at various pressure levels from the altimeter in millibars. - * The PC library computes zmsl, Z000, Z950, Z850, Z800 by calling this function with pres - * equal to PMSL, 1000, 950, 850 and 800 respectively. - * @param altm - Altimeter in millibars - * @param pres - Pressure in millibars - * @return the height ( in meters ) if neither input value is missing and both input values - * are greater than zero. - * @throws NullPointerException - * @throws InvalidValueException - * @throws InvalidRangeException - */ - public static final Amount prZalt ( Amount altm, Amount pres ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - System.out.println("From prZalt:"); - System.out.println(" altm = " + altm.doubleValue()); - System.out.println(" pres = " + pres.doubleValue()); - - checkNullOrInvalidValue( pres ); - checkNullOrInvalidValue( altm ); - pres = checkAndConvertInputAmountToExpectedUnits( pres, NcUnits.MILLIBAR ); - altm = checkAndConvertInputAmountToExpectedUnits( altm, NcUnits.MILLIBAR ); - if ( altm.doubleValue() <= 0 ) - throw new InvalidRangeException("From prZalt: altm must be greater than 0 mb"); - - if ( pres.doubleValue() <= 0 ) - throw new InvalidRangeException("From prZalt: pres must be greater than 0 mb"); - - double to = GempakConstants.TMCK + 15; - double gamma = GempakConstants.GAMUSD / 1000 ; - - /*Calculate the exponent and pressure ratio.*/ - double expo = ( gamma * GempakConstants.RDGAS ) / GempakConstants.GRAVTY; - double prat = pres.doubleValue() / altm.doubleValue() ; - double przalt = ( to * ( 1 - Math.pow ( prat, expo) ) ) / gamma ; - - return ( new Amount ( przalt , SI.METER) ) ; - } - - - - /** - * Computes the windchill from the wind velocity ( part of the Falconer equation - refer method prWceq) - * @param d - wind velocity ( in meters per second ) - * @return the windchill temperature - */ - private static double wci ( double d){ - - /* from R. Falconer, "Windchill, A Useful Wintertime Weather Variable", Weatherwise, Dec 1968.*/ - return ( ( double ) (10 * Math.sqrt(d) + 10.45 - d )); - - - } - - private static final Amount checkAndConvertInputAmountToExpectedUnits(Amount amountIn, Unit expectedUnit){ - Amount amountOut = null; - if ( ! amountIn.getUnit().equals(expectedUnit) - && amountIn.getUnit().isCompatible(expectedUnit)){ - double newValue = amountIn.getUnit().getConverterTo(expectedUnit).convert(amountIn.doubleValue()); - amountOut = new Amount(newValue,expectedUnit); - }else - // throw new ConversionException("Unable to convert " + amountIn.getUnit().toString() + " to " + expectedUnit.toString() ); - amountOut = amountIn; - - return amountOut; - } - - private static final void checkNullOrInvalidValue( Amount amountToCheck ) throws InvalidValueException, NullPointerException{ - if (amountToCheck == null ) - throw new NullPointerException(); - else { - double amountValue = amountToCheck.doubleValue(); - if ( amountValue == GempakConstants.RMISSD){ - throw new InvalidValueException( new String ("Input amount cannot be -9999")); - } - else if ( Double.isNaN(amountValue)) - throw new InvalidValueException( new String ("Input amount cannot be NaN" )); - } - } - - - public static final class InvalidRangeException extends VizException { - public InvalidRangeException( String msg) { - super( msg ); - } - } - - public static final class InvalidValueException extends VizException { - public InvalidValueException( String msg) { - super( msg ); - } - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithHeight.java deleted file mode 100644 index 688d7135a8..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithHeight.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metParameters.quantity; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; - -import javax.measure.quantity.Quantity; -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - - public interface RateOfChangeInTemperatureWithHeight extends javax.measure.quantity.Quantity { - public final static Unit UNIT = NcUnits.CELSIUS_PER_KILOMETER; - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithPressure.java deleted file mode 100644 index 62649b9cee..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metParameters/quantity/RateOfChangeInTemperatureWithPressure.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metParameters.quantity; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; - -import javax.measure.quantity.Quantity; -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - - public interface RateOfChangeInTemperatureWithPressure extends javax.measure.quantity.Quantity { - public final static Unit UNIT = NcUnits.KELVIN_PER_MILLIBAR; - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AbstractMetParameter.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AbstractMetParameter.java deleted file mode 100644 index 3a09384945..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AbstractMetParameter.java +++ /dev/null @@ -1,437 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.NotDerivableException; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Formatter; -import java.util.List; - -import javax.measure.converter.ConversionException; -import javax.measure.quantity.Quantity; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.common.time.DataTime.FLAG; - -/** - * An abstract class for all metParameters. This will hold the value of the parameter and - * its units. - * - * TODO : add support for the Level/Layer at which the value applies. The level could be a PressureLevel, - * a Height or 'Surface' or other defined layer. This would allow the derive methods to remove the PressureLevel - * derive() arguements and do a compatibility check on the other arguements to make sure they are all from the same - * level. - * Could also add support for the time or duration for which the value applies. - * - * - * TODO : make this a generic for a Quantity? ... AbstractMetParameter - * - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 05/05/2011              Greg Hull    Initial creation
- * 06/05/2011              Greg Hull    Added check for infinite recursion in derive method.
- * 10/05/2011              Greg Hull    add dataTime 
- * 
- * 
- * - * @author ghull - * @version 1.0 - */ -public abstract class AbstractMetParameter extends Amount implements Quantity { - - private boolean useStringValue = false; // override to true for String parameters. - - private Unit standardUnit; - - public Unit getStandardUnit() { - return standardUnit; - } - - // only one of these may be set at a time. In order to hold a string value - // the Quantity of the parameter must be Dimensionless - protected String valueString; // "" is MISSING, null for non-string values - - // if this list is set then derive() will first look for a derive method using - // just these parameters. - protected ArrayList preferedDeriveParameters; - - protected DataTime dataTime; - - protected AbstractMetParameter( Unit u ) { - super( u ); - valueString = null; - standardUnit = u; - } - - protected AbstractMetParameter( Unit u, DataTime dt ) { - super( u ); - valueString = null; - standardUnit = u; - dataTime = dt; - } - - // Override for real Description information - public String getParameterDescription( ) { - return getMetParamName(); - } - - protected void setValueIsString() { - useStringValue = true; - } - - public boolean isUnitCompatible( Unit u ) { - return standardUnit.isCompatible( u ); - } - - public Boolean hasStringValue() { - return useStringValue; - } - - public String getStringValue() { - return (valueString == null ? "" : valueString); - - } - - public Boolean hasValidTime( ) { - return ( dataTime != null ); - } - - public DataTime getValidTime() { - return dataTime; - } - - public Boolean isValidAtTime( DataTime dt ) { - if( dataTime == null ) { - return null; - } - - if( dataTime.getUtilityFlags().contains( FLAG.PERIOD_USED ) ) { - return dataTime.getValidPeriod().contains( dt.getValidTime().getTime() ); - } - else { - return dataTime.compareTo( dt ) == 0; - } - } - - public void setValidTime( DataTime dt ) { - dataTime = dt; - } - - @Override - public boolean hasValidValue() { - if( useStringValue ) { - return (valueString == null ? false : true ); - } - else { - return super.hasValidValue(); - } - } - - // ?throw exceptions for invalid value or for incompatible units? - public Number getValueAs( Unit unitNeeded ) { - if( !hasValidValue() ) { - return null; - } - else if( !isUnitCompatible( unitNeeded ) ) { - System.out.println("getValueAs() : asking for incompatible units. "+ - unit.toString() +", "+ unitNeeded.toString() ); - return null; - } - - if( useStringValue ) { - return getMissingValueSentinel(); - } - else { - return super.getValueAs( unitNeeded ); - } - } - - // this will work off of the current units so if we need to - // format at string using different units the value must be - // changed before calling this method. - // the formatStr can be a 'printf' style string or a - // parameter-specific tag for abbreviating, triming or - // converting the parameter value. In the latter case this - // method must be overridden. - // - public String getFormattedString( String formatStr ) { - - String formattedValueStr = null; - - if( hasStringValue() ) { - formattedValueStr = valueString; - } - else { - formattedValueStr = value.toString(); - } - - if( formatStr == null ) { - return formattedValueStr; - } - else if( formatStr.startsWith("%") ) { -// double formattedValue = valueAs.doubleValue(); - StringBuilder sb = new StringBuilder(); - Formatter fmtr = new Formatter( sb ); - fmtr.format( formatStr, value ); // formattedValue - - formattedValueStr = sb.toString(); - -// sValue = sValue.substring( trim ); - - return formattedValueStr; - } - else { - System.out.println("Sanity Check: Unrecognized format string ("+ formatStr + - ") for metParameter "+ getMetParamName() ); - return formattedValueStr; - } - } - - // if this - public void setStringValue( String sv ) throws ConversionException { - // the units must be dimensionless -// if( isUnitCompatible( Unit.ONE ) ) { -// throw new ConversionException("Incompatible unit in setStringValue the Quantity " -// +" for this parameter must be Dimensionless." ); -// } - setValueToMissing(); - - valueString = sv; - } - - @Override - public void setValueToMissing( ) { - if( useStringValue ) { - valueString = null; - } - - super.setValueToMissing(); - } - - public Boolean derivable( ArrayList checkedParams, - Collection inputParams ) { - - return (getDeriveMethod( checkedParams, inputParams) != null); - } - - public Method getDeriveMethod( Collection inputParams ) { - - ArrayList checkedParams = new ArrayList(); - - // if the preferredDeriveParameters list is set then only use these - // parameters. - if( preferedDeriveParameters != null ) { - ArrayList inputParamsList = new ArrayList(); - for( AbstractMetParameter prm : inputParams ) { - if( preferedDeriveParameters.contains( prm.getMetParamName() ) ) { - inputParamsList.add( prm ); - } - } - return getDeriveMethod( checkedParams, inputParamsList ); - } - else { - return getDeriveMethod( checkedParams, inputParams ); - } - } - - // check each of the methods named 'derive' and check to see if the - // given inputParams are sufficient to derive this ncParameter. - // - public Method getDeriveMethod( ArrayList checkedParams, - Collection inputParams ) { - - Method[] deriveMthds = this.getClass().getDeclaredMethods(); - ArrayList foundDeriveMthds = new ArrayList(); - - // check each derive method to see if its arguments are in the inputParams - for( Method m : deriveMthds ) { - boolean derivable = true; - - if( m.getAnnotation( DeriveMethod.class ) != null ) { - - Class rtype = m.getReturnType(); -// if( rtype.getSimpleName().compareTo(AbstractMetParameter.class.getName()) != 0 ) { // sanity check -// continue; -// } - Class[] deriveMthdArgs = m.getParameterTypes(); - - // loop thru the list of args for this derive() method and check - // if it is in the inputParams list. - for( Class argClass : deriveMthdArgs ) { - boolean prmFound = false; - boolean prmIsDerivable = false; - - for( AbstractMetParameter inputPrm : inputParams ) { - - // if we have this input parameter or we can - // derive this input parameter - if( inputPrm.getClass() == argClass ) { - prmFound = true; - break; - } - } - - // if not in the list and if we have already checked this parameter - // then see if it is derivable - // - if( !prmFound && - !checkedParams.contains( this.getMetParamName() ) ) { - - AbstractMetParameter argParam; - try { - argParam = (AbstractMetParameter) - argClass.getConstructor( ).newInstance(); - - checkedParams.add( argParam.getMetParamName() ); - - prmIsDerivable = argParam.derivable( checkedParams, inputParams); - - checkedParams.remove( argParam.getMetParamName() ); - - } catch (Exception e) { - System.out.println("error getting newInstance for metParam " + argClass.getSimpleName() ); - } - } - - if( !prmFound && !prmIsDerivable ) { - derivable = false; -// break; - } - } // end loop thru derive() args - - if( derivable ) { - //return m; - foundDeriveMthds.add( m ); - } - } - } - - // - if( foundDeriveMthds.isEmpty() ) { - return null; - } - else if( foundDeriveMthds.size() > 1 ) { - // If this happens then the caller should set the preferredDeriveParameters - // list to tell this method which arguements to use. - System.out.println("Sanity Check: metParameter "+ - getMetParamName() + " has multiple derive() methods for " + - "the given input parameters."); - return null; - } - else { - return foundDeriveMthds.get( 0 ); - } - } - - public AbstractMetParameter derive( Collection inputParams ) - throws NotDerivableException { - - Method deriveMthd = getDeriveMethod( inputParams ); - - if( deriveMthd == null ) { - setValueToMissing(); - return this; - // throw new NotDerivableException("can't derive param from given parameters."); - } - String errMsg=""; - - try { - // check each derive method to see if its arguments are in the input - Class[] deriveMthdArgs = deriveMthd.getParameterTypes(); - - // a list of the parameter args (actual values) that will be passed to - // the derive() method. - List mthdArgs = new ArrayList(0); - - for( Class argClass : deriveMthdArgs ) { - boolean prmFound = false; - - for( AbstractMetParameter inputPrm : inputParams ) { - // if we don't have this input parameter, derive it - // - if( inputPrm.getClass() == argClass ) { - - if( !inputPrm.hasValidValue() ) { - setValueToMissing(); - return this; - } - else { - mthdArgs.add( inputPrm ); - prmFound = true; - break; - } - } - } - if( !prmFound ) { - // create an object for this parameter and then set/derive - // the value - Constructor constr = argClass.getConstructor(); - AbstractMetParameter derivedArgPrm = (AbstractMetParameter)constr.newInstance(); - derivedArgPrm = derivedArgPrm.derive( inputParams ); - mthdArgs.add( derivedArgPrm ); - } - } - - Class rtype = deriveMthd.getReturnType(); - Object derivedParam=null; - - switch( mthdArgs.size() ) { - case 1 : - derivedParam = deriveMthd.invoke(this, mthdArgs.get(0) ); - break; - case 2 : - derivedParam = deriveMthd.invoke(this, mthdArgs.get(0), mthdArgs.get(1) ); - break; - case 3 : - derivedParam = deriveMthd.invoke(this, mthdArgs.get(0), mthdArgs.get(1), - mthdArgs.get(2) ); - break; - case 4 : - derivedParam = deriveMthd.invoke(this, mthdArgs.get(0), mthdArgs.get(1), - mthdArgs.get(2), mthdArgs.get(3) ); - break; - } - - return (AbstractMetParameter) derivedParam; - - } catch (IllegalArgumentException e) { - errMsg = e.getMessage(); - } catch (IllegalAccessException e) { - errMsg = e.getMessage(); - } catch (InvocationTargetException e) { - errMsg = e.getMessage(); - } catch (SecurityException e) { - errMsg = e.getMessage(); - } catch (NoSuchMethodException e) { - errMsg = e.getMessage(); - } catch (InstantiationException e) { - errMsg = e.getMessage(); - } - - throw new NotDerivableException( errMsg == null ? "" : errMsg ); - } - - public String getMetParamName() { - return this.getClass().getSimpleName(); - } - - public ArrayList getPreferedDeriveParameters() { - return preferedDeriveParameters; - } - - // Assume that the caller has already called isValidMetParameterName() to - // validate the names in the list. - public void setPreferedDeriveParameters( ArrayList preferedDeriveParameters ) { - this.preferedDeriveParameters = preferedDeriveParameters; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Activator.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Activator.java deleted file mode 100644 index 246d96fb35..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Activator.java +++ /dev/null @@ -1,50 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class Activator extends AbstractUIPlugin { - - // The plug-in ID - public static final String PLUGIN_ID = "gov.noaa.nws.ncep.metParameters"; //$NON-NLS-1$ - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirParcelTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirParcelTemp.java deleted file mode 100644 index 8671f41206..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirParcelTemp.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class AirParcelTemp extends AbstractMetParameter implements javax.measure.quantity.Temperature { - public AirParcelTemp() { - super( UNIT ); - } - - @DeriveMethod - public AirParcelTemp derive(EquivPotentialTemp et, PressureLevel p, AirTemperature t ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( et.hasValidValue() && p.hasValidValue() && t.hasValidValue() ){ - Amount val = PRLibrary.prTmst(et, p, t); - setValue(val); - } - else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirTemperature.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirTemperature.java deleted file mode 100644 index 8de1a48280..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AirTemperature.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - -public class AirTemperature extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public AirTemperature( ) { - super( UNIT ); - } - - @DeriveMethod - public AirTemperature derive( PressureLevel p, PotentialTemp pt) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( p.hasValidValue() && pt.hasValidValue() ){ - Amount tempAmount = PRLibrary.prTmpk(p, pt); - setValue(tempAmount); - } - else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftReportType.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftReportType.java deleted file mode 100644 index 7b01ad7201..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftReportType.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class AircraftReportType extends AbstractMetParameter implements Dimensionless { - - public AircraftReportType() { - super(UNIT); -// setValueIsString(); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftType.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftType.java deleted file mode 100644 index f4bb168265..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/AircraftType.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class AircraftType extends AbstractMetParameter implements Dimensionless { - - public AircraftType() { - super(UNIT); - setValueIsString(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Amount.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Amount.java deleted file mode 100644 index df0630d2d3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Amount.java +++ /dev/null @@ -1,150 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; -/** - * Class used to hold a value and its units. - * - *
- * SOFTWARE HISTORY
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- *  06/16/2011   #441       G Hull    Initial creation.
- * 
- * 
- * - * @author ghull - * @version 1.0 - */ - -public class Amount { - - // TODO : add capability to let user set their own missing data value. - private Number missing_data_value = new Double( -9999 ); - - protected Number value = missing_data_value; - - protected Unit unit; - - // To simplify the - public Amount( Number val, Unit unit) { - this.value = val; - this.unit = unit; - - setMissingDataSentinel(); - } - - public Amount( Unit u ) { - value = missing_data_value; - unit = u; - } - - // TODO Should we allow access to the value without the units? Or - // can we let the user assume the stored units for convienience? - public Number getValue() { - return value; - } - - // call hasValidValue before calling this method. - // - public Number getValueAs( Unit unitNeeded ) { - if( unitNeeded != unit && unitNeeded.isCompatible( unit ) ) { - double newValue = unit.getConverterTo(unitNeeded).convert( value.doubleValue() ); - return newValue; - } - else { - return value; - } - } - - public Unit getUnit() { - return unit; - } - - public void setValue( Amount v ) { - setValue( v.value, v.unit ); - } - - public void setValue( Number n ) { - setValue( n, unit ); - } - - public void setValue( Number n, Unit u ) { - value = n; - unit = u; - } - - // make sure the missing data sentinal and the stored value are of the - // same type so that the comparisons will work. - // - // TODO : create a method to let the user set the missing data sentinal to - // whatever they want.... - // - public void setMissingDataSentinel( ) { // Number mds ) { - // limit the number of - if( value instanceof Double ) { - missing_data_value = new Double( -9999 ); - } - else if( value instanceof Float ) { - missing_data_value = new Float( -9999 ); - } - else if( value instanceof Integer ) { - missing_data_value = new Integer( -9999 ); - } - else if( value instanceof Long ) { - missing_data_value = new Long( -9999 ); - } - else { - System.out.println("Error: Number object in Amount is not one of the supported types: "+ - "Double, Float, Integer or Long " ); - } - } - - public void setMissingDataSentinel( Number mds ) { - missing_data_value = mds; - } - - public Number getMissingValueSentinel() { - return missing_data_value; - } - - // convenience method used by PRLibrary. - // TODO : replace calls with getValue().doubleValue - public double doubleValue() { - return value.doubleValue(); - } - - public boolean hasValidValue() { - if( (value == null || value.equals( missing_data_value ) - || value.doubleValue() == missing_data_value.doubleValue()) ) { - return false; - } - return true; - } - - public void setValueToMissing( ) { - value = missing_data_value; - } - - public void setUnit( Unit u ) { - if( hasValidValue() ) { - value = getValueAs( u ); - } - - unit = u; - } - - // // convert the current value to - // public void setUnits( Unit u ) { - // if( value != MISSING_DATA_VALUE ) { - // unit = u; - // } - // else { - // - // } - // } - // TODO : Do we need to worry about rounding errors here? - // public Boolean isMissingValue( ) { - // return value.doubleValue() == MISSING_DATA_VALUE; - // } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Avg3HrShipSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Avg3HrShipSpeed.java deleted file mode 100644 index 318a6f294b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Avg3HrShipSpeed.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Avg3HrShipSpeed extends AbstractMetParameter implements Velocity{ - - public Avg3HrShipSpeed(){ - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "Average Ship Speed for the last 3 Hours"; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfIcing.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfIcing.java deleted file mode 100644 index 0f67236c84..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfIcing.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class BaseOfIcing extends AbstractMetParameter - implements Length { - - public BaseOfIcing() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfTurbulence.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfTurbulence.java deleted file mode 100644 index 5df1a48313..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfTurbulence.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - - public class BaseOfTurbulence extends AbstractMetParameter implements Length { - - public BaseOfTurbulence() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfWeather.java deleted file mode 100644 index 08dbe2410d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BaseOfWeather.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class BaseOfWeather extends AbstractMetParameter implements Length { - - public BaseOfWeather() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreq.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreq.java deleted file mode 100644 index 19af600440..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreq.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Frequency; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class BruntVaisalaFreq extends AbstractMetParameter implements Frequency { - - public BruntVaisalaFreq(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreqSquared.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreqSquared.java deleted file mode 100644 index 0e5fb1414f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaFreqSquared.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; - -import javax.measure.quantity.Frequency; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class BruntVaisalaFreqSquared extends AbstractMetParameter implements Frequency { - - public BruntVaisalaFreqSquared(){ - super( UNIT ); - } - -// @Override -// protected AbstractMetParameter create() { -// BruntVaisalaFrequencySquared b = new BruntVaisalaFrequencySquared(); -// return b; -// } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaPeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaPeriod.java deleted file mode 100644 index 4d4e6fc41b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/BruntVaisalaPeriod.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; - -public class BruntVaisalaPeriod extends AbstractMetParameter implements Duration { - - public BruntVaisalaPeriod(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstCeilingHeightCond.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstCeilingHeightCond.java deleted file mode 100644 index 268b90e2d8..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstCeilingHeightCond.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CatFcstCeilingHeightCond extends AbstractMetParameter implements Dimensionless { - - public CatFcstCeilingHeightCond() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstObstructionsVision.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstObstructionsVision.java deleted file mode 100644 index 407e2a138b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstObstructionsVision.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CatFcstObstructionsVision extends AbstractMetParameter implements Dimensionless { - - public CatFcstObstructionsVision() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstPrecipitation.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstPrecipitation.java deleted file mode 100644 index 7f441a5601..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstPrecipitation.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CatFcstPrecipitation extends AbstractMetParameter implements Dimensionless { - - public CatFcstPrecipitation() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstSnowAmountFalling24hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstSnowAmountFalling24hr.java deleted file mode 100644 index cc5fb3e84b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstSnowAmountFalling24hr.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CatFcstSnowAmountFalling24hr extends AbstractMetParameter implements Dimensionless { - - public CatFcstSnowAmountFalling24hr() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstVisibilityCond.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstVisibilityCond.java deleted file mode 100644 index a0f42615a6..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CatFcstVisibilityCond.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CatFcstVisibilityCond extends AbstractMetParameter implements Dimensionless { - - public CatFcstVisibilityCond() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevel.java deleted file mode 100644 index 12bf3ab196..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevel.java +++ /dev/null @@ -1,30 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; - - public class CeilingFromSeaLevel extends AbstractMetParameter implements Length { - - public CeilingFromSeaLevel() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "The Ceiling as measured from sea level."; - } - - @DeriveMethod //TODO cross check the validity of this equation - AbstractMetParameter derive ( CeilingFromSurface c, StationElevation se) throws InvalidValueException, NullPointerException{ - if ( c.hasValidValue() && se.hasValidValue() ){ - Amount val = PRLibrary.prCmsl( c, se ); - setValue( val ); - }else - setValueToMissing(); - - return this; - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevelWorstCase.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevelWorstCase.java deleted file mode 100644 index 74648b5146..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSeaLevelWorstCase.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -public class CeilingFromSeaLevelWorstCase extends AbstractMetParameter implements Length { - - public CeilingFromSeaLevelWorstCase(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( CeilingFromSeaLevel cmsl, TemporaryCeilingAsMeanSeaLevel tcms ){ - if ( cmsl.hasValidValue() ){ - Amount val = ( !tcms.hasValidValue() ? cmsl : tcms ); //prWcms - setValue( val ); - } - else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSurface.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSurface.java deleted file mode 100644 index 0a3e9b33da..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CeilingFromSurface.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; - -/** - * @author archana - * - */ -public class CeilingFromSurface extends AbstractMetParameter implements Length { - - public CeilingFromSurface() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "The Ceiling as measured from the station or surface."; - } - - // This was not in the PRLibrary but adding it here since it makes sense. - // (TODO : not tested.) - @DeriveMethod - AbstractMetParameter derive( CeilingFromSeaLevel csl, StationElevation se) throws InvalidValueException, NullPointerException{ - if( csl.hasValidValue() && se.hasValidValue() ) { - // subtract the surface elevation from the ceiling from sealevel. - Double ceil = csl.getValueAs( getUnit() ).doubleValue() - - se.getValueAs( getUnit() ).doubleValue(); - - setValue( ceil, getUnit() ); - } - else { - setValueToMissing(); - } - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim12HrPOP.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim12HrPOP.java deleted file mode 100644 index c9f05e9d6e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim12HrPOP.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; -/** - * @author archana - * - */ - public class Clim12HrPOP extends AbstractMetParameter implements - Dimensionless { - - public Clim12HrPOP() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "Climatological 12 Hour Probability of Precipitation."; - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim24HrPOP.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim24HrPOP.java deleted file mode 100644 index 3e94dd91ac..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Clim24HrPOP.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class Clim24HrPOP extends AbstractMetParameter implements - Dimensionless { - - public Clim24HrPOP() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "Climatological 24 Hour Probability of Precipitation."; - } - - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimDayTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimDayTemp.java deleted file mode 100644 index 09f0a47c40..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimDayTemp.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import java.util.Calendar; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccess; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccessManager; - -import javax.measure.quantity.Temperature; -import javax.measure.unit.NonSI; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.time.DataTime; - - /** - * @author archana - * - */ - public class ClimDayTemp extends AbstractMetParameter implements - Temperature { - - private static Calendar calendar = Calendar.getInstance(); - - public ClimDayTemp() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "Climatological Day-time temperature."; - } - - @DeriveMethod - public ClimDayTemp derive( StationID stnid ) throws InvalidValueException, NullPointerException { - - DataTime dt = stnid.getValidTime(); - - if( dt == null ) { - throw new InvalidValueException("StationID doesn't have a valid time needed"); - } - - calendar.setTime( dt.getRefTime() ); - Integer month = calendar.get(Calendar.MONTH) + 1; - Integer dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); - - double climateTDYFInF = getClimateTDYF(stnid.valueString, - month.toString(), dayOfMonth.toString() ); -// System.out.println("=======, climateTDYFInF= "+climateTDYFInF); - - setValue( new Amount(climateTDYFInF, NonSI.FAHRENHEIT) ); - - // TODO : if station is not in the db then set the value to missing; - //setValueToMissing(); - - return this; - } - - private double getClimateTDYF(String stationId, String month, String day) { - ClimateDataDbAccess climateDataDbAccess = ClimateDataDbAccessManager.getInstance().getClimateDataDbAccess(); - double tdyfClimateValue = climateDataDbAccess.getTDYF(stationId, month, day); - return tdyfClimateValue; - } - - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimNightTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimNightTemp.java deleted file mode 100644 index 612c6189e7..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ClimNightTemp.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - - /** - * @author archana - * - */ - public class ClimNightTemp extends AbstractMetParameter implements Temperature { - - public ClimNightTemp() { - super( UNIT ); - } - - @Override - public String getParameterDescription( ) { - return "Climatological Night-time temperature."; - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase1.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase1.java deleted file mode 100644 index fd67b5b7d5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase1.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; - - public class CloudBase1 extends AbstractMetParameter - implements Length { - - public CloudBase1() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase2.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase2.java deleted file mode 100644 index d580e3422a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudBase2.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - - public class CloudBase2 extends AbstractMetParameter - implements Length { - - public CloudBase2() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudCover.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudCover.java deleted file mode 100644 index 8f81e6e897..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudCover.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -// The cloud coverage at a given height. Values are strings representing -// metar observations FEW, OVC, -// -// A list of CloudCovers is used to determine the skyCoverage. -// - public class CloudCover extends AbstractMetParameter implements Dimensionless { - - public CloudCover() { - super( UNIT ); - } - - @Override - public Boolean hasStringValue() { - return true; - }; - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop1.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop1.java deleted file mode 100644 index 51607f010d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop1.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class CloudTop1 extends AbstractMetParameter - implements Length { - - public CloudTop1() { - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop2.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop2.java deleted file mode 100644 index c5adc04f8e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CloudTop2.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; - - public class CloudTop2 extends AbstractMetParameter - implements Length { - - public CloudTop2() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondFcstPrecip12HrType.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondFcstPrecip12HrType.java deleted file mode 100644 index 1fce18f66a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondFcstPrecip12HrType.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CondFcstPrecip12HrType extends AbstractMetParameter implements -Dimensionless { - - public CondFcstPrecip12HrType() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrFreezingPrecip.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrFreezingPrecip.java deleted file mode 100644 index c8be836d47..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrFreezingPrecip.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class CondProbOf12HrFreezingPrecip extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf12HrFreezingPrecip() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrMixedLiquidOrFrozenSolid.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrMixedLiquidOrFrozenSolid.java deleted file mode 100644 index 05d47821f0..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrMixedLiquidOrFrozenSolid.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class CondProbOf12HrMixedLiquidOrFrozenSolid extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf12HrMixedLiquidOrFrozenSolid() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrRain.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrRain.java deleted file mode 100644 index 69fdd244da..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrRain.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CondProbOf12HrRain extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf12HrRain() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSevereWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSevereWeather.java deleted file mode 100644 index 2d2b52ada6..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSevereWeather.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class CondProbOf12HrSevereWeather extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf12HrSevereWeather() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSnow.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSnow.java deleted file mode 100644 index 606f71350c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf12HrSnow.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class CondProbOf12HrSnow extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf12HrSnow() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf24HrSevereWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf24HrSevereWeather.java deleted file mode 100644 index 356eb32f75..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf24HrSevereWeather.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class CondProbOf24HrSevereWeather extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf24HrSevereWeather() { - super( UNIT ); - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf6HrSevereWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf6HrSevereWeather.java deleted file mode 100644 index 226863236b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOf6HrSevereWeather.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ - public class CondProbOf6HrSevereWeather extends AbstractMetParameter implements - Dimensionless { - - public CondProbOf6HrSevereWeather() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfFreezingPrecip.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfFreezingPrecip.java deleted file mode 100644 index 82d72167e7..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfFreezingPrecip.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class CondProbOfFreezingPrecip extends AbstractMetParameter implements - Dimensionless { - - public CondProbOfFreezingPrecip() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfSnow.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfSnow.java deleted file mode 100644 index 2dbbaea232..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/CondProbOfSnow.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - - /** - * @author archana - * - */ - public class CondProbOfSnow extends AbstractMetParameter implements - Dimensionless { - - public CondProbOfSnow() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DPRN.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DPRN.java deleted file mode 100644 index aea1a3da35..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DPRN.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - -public class DPRN extends AbstractMetParameter implements javax.measure.quantity.Length { - - public DPRN() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive( Precip24Hr pt, MaxPrecipPR6X mp){ - if ( pt.hasValidValue() && mp.hasValidValue() ){ - setValue( pt.doubleValue() > mp.doubleValue() ? - pt : mp ); - }else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempAnomaly.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempAnomaly.java deleted file mode 100644 index 2f7da3777c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempAnomaly.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import java.util.Calendar; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccess; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccessManager; - -import javax.measure.quantity.Temperature; -import javax.measure.unit.NonSI; - -import com.raytheon.uf.common.time.DataTime; - -/** - * @author archana - * - */ - public class DayTempAnomaly extends AbstractMetParameter implements - Temperature { - - public DayTempAnomaly() { - super( UNIT ); - } - - @DeriveMethod - public DayTempAnomaly derive( Max24HrTemp max24HrTemp, ClimDayTemp climDayTemp ) throws InvalidValueException, NullPointerException, InvalidRangeException { - - if ( max24HrTemp.hasValidValue() && climDayTemp.hasValidValue() ){ - -// if( max24HrTemp.hasValidTime() && climDayTemp.hasValidTime() ) { -// -// } - double climateTDYFInF = climDayTemp.getValueAs( NonSI.FAHRENHEIT ).doubleValue(); - double max24HrTempInF = max24HrTemp.getValueAs(NonSI.FAHRENHEIT).doubleValue(); - double finalTDYFInF = max24HrTempInF - climateTDYFInF; -// System.out.println("=======, max24HrTempInF= "+max24HrTempInF); -// System.out.println("=======, climateTDYFInF= "+climateTDYFInF); -// System.out.println("=======, finalTDYFInF= "+finalTDYFInF); - /* - * tdaf: Day Temp anomaly in F - */ - Amount tdafAmount = new Amount(finalTDYFInF, NonSI.FAHRENHEIT); - setValue(tdafAmount); - setValidTime( max24HrTemp.getValidTime() ); - }else - setValueToMissing(); - return this; - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempFcst.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempFcst.java deleted file mode 100644 index b8c06fec8f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DayTempFcst.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class DayTempFcst extends AbstractMetParameter implements - Temperature { - - public DayTempFcst() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointDepression.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointDepression.java deleted file mode 100644 index 0aa480f2ab..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointDepression.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.SI; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class DewPointDepression extends AbstractMetParameter implements javax.measure.quantity.Temperature { - public DewPointDepression() { - super( UNIT ); - } - - @DeriveMethod - public DewPointDepression derive( AirTemperature t, DewPointTemp d) throws InvalidValueException, NullPointerException { - if ( t.hasValidValue() && d.hasValidValue() ){ - Amount dwdpAmount = PRLibrary.prDdep( t, d ); - this.setValue( dwdpAmount); - } - else - setValueToMissing(); - return this; - } - - // TODO : could change this to pass along the threshhold instead of hardcoding 30. - @Override - public String getFormattedString( String formatStr ) { - - if( formatStr == null || formatStr.isEmpty() || - formatStr.startsWith("%" ) ) { - return super.getFormattedString( formatStr ); - } - else if ( ( formatStr.compareToIgnoreCase("DPDX") == 0 ) ){ - if( getValueAs( SI.CELSIUS ).doubleValue() >= 30.0 ) { - return "X"; - } - else { - return super.getFormattedString( "%3.0f" ); - } - } - else { - return getValue().toString(); - } - } -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointTemp.java deleted file mode 100644 index ca1cd73810..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DewPointTemp.java +++ /dev/null @@ -1,72 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class DewPointTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public DewPointTemp() { - super( UNIT ); - } - - @DeriveMethod - public DewPointTemp derive( MixingRatio m, PressureLevel p ) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( m.hasValidValue() && p.hasValidValue() ){ - Amount theDewpointTemperatureAmount = PRLibrary.prDwpt(m , p ); - this.setValue(theDewpointTemperatureAmount); - }else - setValueToMissing(); - return this; - } - - @DeriveMethod - public DewPointTemp derive( SurfaceMixingRatio m, SurfacePressure p ) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( m.hasValidValue() && p.hasValidValue() ){ - Amount theDewpointTemperatureAmount = PRLibrary.prDwpt(m , p ); - this.setValue(theDewpointTemperatureAmount); - }else - setValueToMissing(); - return this; - } - - @DeriveMethod - public DewPointTemp derive ( AirTemperature t, DewPointDepression dp) throws InvalidValueException, NullPointerException{ - if ( t.hasValidValue() && dp.hasValidValue() ){ - Amount theDewpointTemperatureAmount = PRLibrary.prDwdp(t, dp); - this.setValue(theDewpointTemperatureAmount); - }else - setValueToMissing(); - - return this; - } - - @DeriveMethod - public DewPointTemp derive ( AirTemperature t, RelativeHumidity rh) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( t.hasValidValue() && rh.hasValidValue() ){ - Amount dewpointAmount = PRLibrary.prRhdp(t, rh); - this.setValue(dewpointAmount); - }else - setValueToMissing(); - return this; - } -} - - - - - - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryAirDensity.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryAirDensity.java deleted file mode 100644 index eec80c5d32..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryAirDensity.java +++ /dev/null @@ -1,33 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - -public class DryAirDensity extends AbstractMetParameter implements javax.measure.quantity.VolumetricDensity { - - public DryAirDensity() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive(PressureLevel p, AirTemperature t) throws InvalidRangeException, InvalidValueException, NullPointerException{ - Amount val = PRLibrary.prDden( p, t ) ; - setValue(val); - return this; - } -} - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryHydrostaticHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryHydrostaticHeight.java deleted file mode 100644 index 101dddf6f1..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/DryHydrostaticHeight.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class DryHydrostaticHeight extends AbstractMetParameter - implements Length { - - public DryHydrostaticHeight(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivPotentialTemp.java deleted file mode 100644 index 937d87131f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivPotentialTemp.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class EquivPotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public EquivPotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public EquivPotentialTemp derive( PressureLevel p, AirTemperature t, DewPointTemp dpt ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( p.hasValidValue() && t.hasValidValue() && dpt.hasValidValue() ){ - Amount theEquivPotTempAmount = PRLibrary.prThte(p, t, dpt); - setValue(theEquivPotTempAmount); - }else - setValueToMissing(); - return this; - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed10min.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed10min.java deleted file mode 100644 index eb1458314a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed10min.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - -/** - * @author archana - * - */ - public class EquivWindSpeed10min extends AbstractMetParameter implements Velocity { - - public EquivWindSpeed10min() { - super(UNIT); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed20min.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed20min.java deleted file mode 100644 index 42b56c1e58..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EquivWindSpeed20min.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - -/** - * @author archana - * - */ - public class EquivWindSpeed20min extends AbstractMetParameter implements Velocity { - - public EquivWindSpeed20min() { - super(UNIT); - } - - } - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionUComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionUComp.java deleted file mode 100644 index 062e40fe81..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionUComp.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class EstStormDirectionUComp extends AbstractMetParameter implements javax.measure.quantity.Velocity{ - - EstStormDirectionUComp(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionVComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionVComp.java deleted file mode 100644 index 09425de081..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/EstStormDirectionVComp.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class EstStormDirectionVComp extends AbstractMetParameter implements javax.measure.quantity.Velocity{ - - public EstStormDirectionVComp(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FZRainWatchThresh.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FZRainWatchThresh.java deleted file mode 100644 index 8e198a04ba..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FZRainWatchThresh.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ -public class FZRainWatchThresh extends AbstractMetParameter - implements Length { - - public FZRainWatchThresh(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationIn12Hours.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationIn12Hours.java deleted file mode 100644 index cd94117978..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationIn12Hours.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ -public class FcstFZRainAccumulationIn12Hours extends AbstractMetParameter - implements Length { - - public FcstFZRainAccumulationIn12Hours(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationToWatchThresh.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationToWatchThresh.java deleted file mode 100644 index 7bdcc93c7b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstFZRainAccumulationToWatchThresh.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ -public class FcstFZRainAccumulationToWatchThresh extends AbstractMetParameter - implements Dimensionless { - - public FcstFZRainAccumulationToWatchThresh(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( FcstFZRainAccumulationIn12Hours fz12, FZRainWatchThresh fzrt){ - if ( fz12.hasValidValue() && fzrt.hasValidValue() ){ - Amount val = new Amount ( fz12.doubleValue() / fzrt.doubleValue() , Unit.ONE ); - setValue( val ); - }else - setValueToMissing(); - return this; - } -} - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumToWatchThresh.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumToWatchThresh.java deleted file mode 100644 index e30d8623b3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumToWatchThresh.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ -public class FcstSnowIcePelletAccumToWatchThresh extends AbstractMetParameter - implements Dimensionless { - - public FcstSnowIcePelletAccumToWatchThresh(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( FcstSnowIcePelletAccumulation12Hrs si12, SnowIcePelletWatchThresh snip){ - if ( si12.hasValidValue() && snip.hasValidValue() ){ - Amount val = new Amount ( si12.doubleValue() / snip.doubleValue() , Unit.ONE ); - setValue( val ); - }else - setValueToMissing(); - return this; - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumulation12Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumulation12Hrs.java deleted file mode 100644 index 5fc9c7a53b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FcstSnowIcePelletAccumulation12Hrs.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ - public class FcstSnowIcePelletAccumulation12Hrs extends AbstractMetParameter - implements Length { - - public FcstSnowIcePelletAccumulation12Hrs(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FiveSecPeakWindDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FiveSecPeakWindDir.java deleted file mode 100644 index 1cb8d54086..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FiveSecPeakWindDir.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class FiveSecPeakWindDir extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public FiveSecPeakWindDir() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid01Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid01Hr.java deleted file mode 100644 index d9ce8de57e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid01Hr.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class FlashFloodGuid01Hr extends AbstractMetParameter - implements Length { - - public FlashFloodGuid01Hr(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid03Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid03Hr.java deleted file mode 100644 index b82e0023b3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid03Hr.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class FlashFloodGuid03Hr extends AbstractMetParameter - implements Length { - - public FlashFloodGuid03Hr(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid06Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid06Hr.java deleted file mode 100644 index c3d5035044..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid06Hr.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class FlashFloodGuid06Hr extends AbstractMetParameter - implements Length { - - public FlashFloodGuid06Hr(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid12Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid12Hr.java deleted file mode 100644 index d08d22352e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid12Hr.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class FlashFloodGuid12Hr extends AbstractMetParameter - implements Length { - - public FlashFloodGuid12Hr(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid24Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid24Hr.java deleted file mode 100644 index 3c68a2b5be..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlashFloodGuid24Hr.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class FlashFloodGuid24Hr extends AbstractMetParameter - implements Length { - - public FlashFloodGuid24Hr(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightLevel.java deleted file mode 100644 index 1c2222fcdd..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightLevel.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; - - - public class FlightLevel extends AbstractMetParameter implements Length { - - public FlightLevel() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesID.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesID.java deleted file mode 100644 index 2a8d5ee2fb..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesID.java +++ /dev/null @@ -1,56 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - - public class FlightRulesID extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - private FlightRuleCategory flightRuleCategory; - - public enum FlightRuleCategory{ - LIFR( 0 ), IFR( 1 ), MVFR( 2 ), VFR( 3 ), UNKNOWN( -9999 ); - private int code; - private FlightRuleCategory ( int i){ - code = i; - } - - public int getCode(){ - return code; - } - } - - public FlightRulesID() { - super( UNIT ); - flightRuleCategory = FlightRuleCategory.UNKNOWN; - } - - @DeriveMethod - AbstractMetParameter derive( CeilingFromSurface c, Visibility v) throws InvalidValueException, NullPointerException{ - if ( c.hasValidValue() && v.hasValidValue() ){ - Amount val = PRLibrary.prXvfr( c, v); - }else - setValueToMissing(); - return this; - } - - /** - * @return the flightRuleCategory - */ - public final FlightRuleCategory getFlightRuleCategory() { - return flightRuleCategory; - } - - - } - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesIdWorstCase.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesIdWorstCase.java deleted file mode 100644 index e975a6ca65..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FlightRulesIdWorstCase.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - - -public class FlightRulesIdWorstCase extends AbstractMetParameter - implements Dimensionless { - - public FlightRulesIdWorstCase() { - super( UNIT ); - } - -// AbstractMetParameter derive ( FlightRulesID xvfr, TemporaryOrProbabilityFlightRuleIdentifier txvf){ -// -// return this; -// } - -} - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FosbergFireWxIndex.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FosbergFireWxIndex.java deleted file mode 100644 index ba3f737f94..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/FosbergFireWxIndex.java +++ /dev/null @@ -1,37 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import javax.measure.quantity.Dimensionless; - - public class FosbergFireWxIndex extends AbstractMetParameter implements Dimensionless { - - public FosbergFireWxIndex(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( AirTemperature t, RelativeHumidity r, WindSpeed w) throws InvalidValueException, NullPointerException{ - if ( t.hasValidValue() && r.hasValidValue() && w.hasValidValue() ) { - Amount val = PRLibrary.prFosb( t, r, w ); - setValue( val ); - } - else{ - setValueToMissing(); - } - return this; - } - } - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/GenericDimensionlessParameter.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/GenericDimensionlessParameter.java deleted file mode 100644 index 31b0d21433..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/GenericDimensionlessParameter.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class GenericDimensionlessParameter extends AbstractMetParameter implements - Dimensionless { - - public GenericDimensionlessParameter() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HailSize.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HailSize.java deleted file mode 100644 index 4cdbb41762..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HailSize.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class HailSize extends AbstractMetParameter implements Length { - - public HailSize(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeatIndex.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeatIndex.java deleted file mode 100644 index e8997e5ada..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeatIndex.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class HeatIndex extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public HeatIndex( ) { - super( UNIT ); - } - - @DeriveMethod - public HeatIndex derive( AirTemperature t, RelativeHumidity rh ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() && rh.hasValidValue() ){ - Amount theRelhAmount = PRLibrary.prHeat(t, rh); - this.setValue(theRelhAmount); - } - else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeightAboveSeaLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeightAboveSeaLevel.java deleted file mode 100644 index 2524add952..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HeightAboveSeaLevel.java +++ /dev/null @@ -1,71 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.SI; - -/** - *
- * 
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * 09/29/2011              qzhou       Added STDZ format
- * 
- * 
- * - * @author - * @version 1.0 - */ -// TODO : HET -public class HeightAboveSeaLevel extends AbstractMetParameter - implements Length { - - @Override - public String getFormattedString( String formatStr ) { - if( formatStr == null || formatStr.isEmpty() || - formatStr.startsWith("%" ) ) { - return super.getFormattedString( formatStr ); - } - else if( !formatStr.equals("STDZ") ) { - return super.getFormattedString( formatStr ); - } - - Number valInMeters = getValueAs( SI.METER ); - - // TODO : add code to create the abbreviated string. - - String valueStr = ""; - int value = valInMeters.intValue(); - - if (!hasValidValue()) { - valueStr = ""; - } - else if (value < 10) { - valueStr = "00" + Integer.toString(value); - } - else if (value < 100) { - valueStr = "0" + formatStr; - } - else if (value < 1000) { - valueStr = Integer.toString(value); - } - else if (value < 10000) { - if (value %10 < 5) - valueStr = Integer.toString((int) (value/10)); - else - valueStr = Integer.toString((int) (value/10 +1)); - } - else if (value >= 10000) { - valueStr = Integer.toString(value); - valueStr = valueStr.substring(1, 4); - } - - return valueStr; - } - - public HeightAboveSeaLevel() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HighResWaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HighResWaveHeight.java deleted file mode 100644 index cdad50751c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HighResWaveHeight.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; - -/** - * @author archana - * - */ - public class HighResWaveHeight extends AbstractMetParameter implements Length { - public HighResWaveHeight(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Highest1MinMeanWindSpeedInPastHour.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Highest1MinMeanWindSpeedInPastHour.java deleted file mode 100644 index 0ac8992c6e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Highest1MinMeanWindSpeedInPastHour.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Highest1MinMeanWindSpeedInPastHour extends AbstractMetParameter - implements Velocity { - - public Highest1MinMeanWindSpeedInPastHour() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HumitureIndex.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HumitureIndex.java deleted file mode 100644 index 3a6b233ba2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/HumitureIndex.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class HumitureIndex extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - public HumitureIndex(){ - super( UNIT ); - } - @DeriveMethod - public HumitureIndex derive( AirTemperature t, DewPointTemp dt ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() && dt.hasValidValue() ){ - Amount hmtrAmount = PRLibrary.prHmtr(t, dt); - setValue(hmtrAmount); - }else - setValueToMissing(); - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IceCode.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IceCode.java deleted file mode 100644 index 7c28ee598a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IceCode.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ - public class IceCode extends AbstractMetParameter implements Dimensionless { - public IceCode(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingIntensitySymbol.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingIntensitySymbol.java deleted file mode 100644 index 8afe2b04a2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingIntensitySymbol.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class IcingIntensitySymbol extends AbstractMetParameter implements - Dimensionless { - - public IcingIntensitySymbol() { - super(UNIT); - setValueIsString(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingTypeSymbol.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingTypeSymbol.java deleted file mode 100644 index 7d7ea07a37..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IcingTypeSymbol.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class IcingTypeSymbol extends AbstractMetParameter implements - Dimensionless { - - public IcingTypeSymbol() { - super(UNIT); - setValueIsString(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWaveHeight.java deleted file mode 100644 index 8183795775..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWaveHeight.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class InstrumentWaveHeight extends AbstractMetParameter implements Length { - - public InstrumentWaveHeight() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWavePeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWavePeriod.java deleted file mode 100644 index 80d23b438f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InstrumentWavePeriod.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class InstrumentWavePeriod extends AbstractMetParameter implements Duration { - - public InstrumentWavePeriod() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindDir.java deleted file mode 100644 index b4a2d1a617..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindDir.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; - -/** - * @author archana - * - */ -public class InterWindDir extends AbstractMetParameter implements Angle { - public InterWindDir ( ){ - super ( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindSpeed.java deleted file mode 100644 index 7350b0d98b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindSpeed.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - -/** - * @author archana - * - */ -public class InterWindSpeed extends AbstractMetParameter implements Velocity { - public InterWindSpeed ( ){ - super ( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindTime.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindTime.java deleted file mode 100644 index b193a24e44..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/InterWindTime.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; - -/** - * @author archana - * - */ -public class InterWindTime extends AbstractMetParameter implements Duration { - public InterWindTime () { - super ( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IsentropesVerticalSeparation.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IsentropesVerticalSeparation.java deleted file mode 100644 index 4b6bbddd1d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/IsentropesVerticalSeparation.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class IsentropesVerticalSeparation extends AbstractMetParameter implements -javax.measure.quantity.Pressure { - public IsentropesVerticalSeparation() { - super( UNIT ); - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelPressure.java deleted file mode 100644 index e94f42aa4e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelPressure.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class LCLParcelPressure extends AbstractMetParameter implements -javax.measure.quantity.Pressure{ - public LCLParcelPressure() { - super( UNIT ); - } - - @DeriveMethod - public LCLParcelPressure derive(AirTemperature t, PressureLevel p, LCLParcelTemperature parcelTemp ) throws InvalidValueException, NullPointerException { - if ( t.hasValidValue() && p.hasValidValue() && parcelTemp.hasValidValue() ){ - Amount val = PRLibrary.prPlcl(t, p, parcelTemp); - setValue(val); - }else - setValueToMissing(); - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelTemperature.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelTemperature.java deleted file mode 100644 index 3b24481616..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LCLParcelTemperature.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class LCLParcelTemperature extends AbstractMetParameter implements javax.measure.quantity.Temperature { - - public LCLParcelTemperature() { - super( UNIT ); - } - - @DeriveMethod - public LCLParcelTemperature derive(AirTemperature t, DewPointTemp d ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() && d.hasValidValue() ){ - Amount val = PRLibrary.prTlcl(t, d ); - setValue(val); - } - else - setValueToMissing(); - - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LatentHeatOfVapor.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LatentHeatOfVapor.java deleted file mode 100644 index b2c3af07a1..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LatentHeatOfVapor.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class LatentHeatOfVapor extends AbstractMetParameter implements javax.measure.quantity.Energy{ - public LatentHeatOfVapor() { - super( UNIT ); - } - - @DeriveMethod - public LatentHeatOfVapor derive( AirTemperature t ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() ){ - Amount val = PRLibrary.prLhvp( t ); - setValue(val); - }else - setValueToMissing(); - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedIndex.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedIndex.java deleted file mode 100644 index 6b65ffff29..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedIndex.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class LiftedIndex extends AbstractMetParameter implements - Dimensionless { - - public LiftedIndex(){ - super( UNIT ); - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedSurfaceAirTempAt500mb.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedSurfaceAirTempAt500mb.java deleted file mode 100644 index e703544b4b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/LiftedSurfaceAirTempAt500mb.java +++ /dev/null @@ -1,73 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class LiftedSurfaceAirTempAt500mb extends AbstractMetParameter implements javax.measure.quantity.Temperature { - - public LiftedSurfaceAirTempAt500mb() { - super( UNIT ); - } - - @DeriveMethod - public LiftedSurfaceAirTempAt500mb derive(SurfacePotentialTemp pt, SurfaceEquivPotentialTemp eqt ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if( pt.hasValidValue() && eqt.hasValidValue() ) { - Amount val = PRLibrary.prLtmp(pt, eqt, - new Amount( new Double(500.0), NcUnits.MILLIBAR ) ); // the pressureLevel - this.setValue(val); - } - else { - setValueToMissing(); - } - return this; - } - - /**** The methods below may apply for a generalized LiftedSurfaceAirTemp parameter - @DeriveMethod - public LiftedSurfaceAirTempAt500mb derive(SurfacePotentialTemperature pt, SurfaceEquivPotentialTemp eqt, PressureLevel p) throws InvalidValueException, NullPointerException, InvalidRangeException { - Amount val = PRLibrary.prLtmp(pt, eqt, p ); - this.setValue(val); - return this; - } - - @DeriveMethod - public LiftedSurfaceAirTempAt500mb derive(SurfacePotentialTemperature pt, SurfaceEquivPotentialTemp eqt, SurfacePressure p) throws InvalidValueException, NullPointerException, InvalidRangeException { - Amount val = PRLibrary.prLtmp(pt, eqt, p ); - this.setValue(val); - return this; - } - - @DeriveMethod - public LiftedSurfaceAirTempAt500mb derive(SurfacePotentialTemperature pt, SurfaceEquivPotentialTemp eqt, SeaLevelPressure p) throws InvalidValueException, NullPointerException, InvalidRangeException { - Amount val = PRLibrary.prLtmp(pt, eqt, p ); - this.setValue(val); - return this; - } - - @DeriveMethod - public LiftedSurfaceAirTempAt500mb derive(SurfacePotentialTemperature pt, SurfaceEquivPotentialTemp eqt, MeanSeaLevelPres p) throws InvalidValueException, NullPointerException, InvalidRangeException { - Amount val = PRLibrary.prLtmp(pt, eqt, p ); - this.setValue(val); - return this; - } - - @DeriveMethod - //TODO: is this the right kind of Pressure being used? - public LiftedSurfaceAirTempAt500mb derive( PotentialTemperature pt, EquivPotentialTemp eqt, PressureLevel p) throws InvalidValueException, NullPointerException, InvalidRangeException { - Amount val = PRLibrary.prLtmp(pt, eqt, p ); - this.setValue(val); - return this; - } - ******/ - } - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Lowest01MinAvgPressInPastHour.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Lowest01MinAvgPressInPastHour.java deleted file mode 100644 index ebf621779c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Lowest01MinAvgPressInPastHour.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Lowest01MinAvgPressInPastHour extends AbstractMetParameter implements -javax.measure.quantity.Pressure { - public Lowest01MinAvgPressInPastHour() { - super( UNIT ); - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max12HrPrecipFcst.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max12HrPrecipFcst.java deleted file mode 100644 index a3e81ad1ba..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max12HrPrecipFcst.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Max12HrPrecipFcst extends - AbstractMetParameter implements Length { - - public Max12HrPrecipFcst(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max24HrTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max24HrTemp.java deleted file mode 100644 index 1f67d438f2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max24HrTemp.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class Max24HrTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public Max24HrTemp(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max6HrTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max6HrTemp.java deleted file mode 100644 index 6128c02138..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Max6HrTemp.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class Max6HrTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public Max6HrTemp (){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxCloudCover.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxCloudCover.java deleted file mode 100644 index 087768a011..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxCloudCover.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class MaxCloudCover extends AbstractMetParameter implements Dimensionless { - - public MaxCloudCover() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDailyWeatherMapTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDailyWeatherMapTemp.java deleted file mode 100644 index 824657ec36..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDailyWeatherMapTemp.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -public class MaxDailyWeatherMapTemp extends AbstractMetParameter implements javax.measure.quantity.Temperature { - - public MaxDailyWeatherMapTemp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( Max6HrTemp t00x, Max6HrTemp t06x, MaxMidnightTemp tdxc ) throws InvalidValueException, NullPointerException{ - Amount val = PRLibrary.prDmax(t00x, t06x, tdxc); - setValue(val); - return this; - } - -} - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDayTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDayTemp.java deleted file mode 100644 index aee02b07fc..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxDayTemp.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class MaxDayTemp extends AbstractMetParameter implements - Temperature { - - public MaxDayTemp(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxEditedTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxEditedTemp.java deleted file mode 100644 index 3102ae7d38..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxEditedTemp.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class MaxEditedTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public MaxEditedTemp() { - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxMidnightTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxMidnightTemp.java deleted file mode 100644 index 32c08cedfd..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxMidnightTemp.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class MaxMidnightTemp extends AbstractMetParameter implements javax.measure.quantity.Temperature { - - public MaxMidnightTemp() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxOrMinTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxOrMinTemp.java deleted file mode 100644 index b1c3d2b0fd..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxOrMinTemp.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class MaxOrMinTemp extends AbstractMetParameter implements - Temperature { - - public MaxOrMinTemp(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxPrecipPR6X.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxPrecipPR6X.java deleted file mode 100644 index fed5a46b1f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxPrecipPR6X.java +++ /dev/null @@ -1,42 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import java.util.List; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - - public class MaxPrecipPR6X extends AbstractMetParameter implements Length { - - public MaxPrecipPR6X() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive( Precipitation p00z,Precipitation p06z,Precipitation p12z,Precipitation p18z ) throws InvalidValueException, NullPointerException{ - Amount val = PRLibrary.prPr6x( p00z, p06z, p12z, p18z ); - setValue(val); - return this; - - } - - - } - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxSustSurfWindSpeedFcst.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxSustSurfWindSpeedFcst.java deleted file mode 100644 index acafe7d1c3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxSustSurfWindSpeedFcst.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class MaxSustSurfWindSpeedFcst extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - /* - * This maps to legacy GFSXMOS parameter SK12, which is observed and not derived. - * On NMAP, SK12 is displayed as specific wind-speeds at specific stations. The categorical range - * values defined for this parameter, in sfparm.hl2 are not used in the GUI... - * TODO : Clarify whether or not these ranges need to be implemented at all... - */ - - public MaxSustSurfWindSpeedFcst(){ - super( UNIT ); - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxWindSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxWindSpeed.java deleted file mode 100644 index a35c739b58..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MaxWindSpeed.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -public class MaxWindSpeed extends AbstractMetParameter implements - Dimensionless { - - public MaxWindSpeed() { - super( UNIT ); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MeanSeaLevelPres.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MeanSeaLevelPres.java deleted file mode 100644 index fe64e68e16..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MeanSeaLevelPres.java +++ /dev/null @@ -1,92 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - -public class MeanSeaLevelPres extends AbstractMetParameter implements - javax.measure.quantity.Pressure { - public MeanSeaLevelPres() { - super( UNIT ); - } - - @DeriveMethod - public MeanSeaLevelPres derive( PressureLevel prs, AirTemperature t, - DewPointTemp dpt, HeightAboveSeaLevel hght ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if( prs.hasValidValue() && t.hasValidValue() && dpt.hasValidValue() && - hght.hasValidValue() ) { - Amount pmsl = PRLibrary.prPmsl ( prs, t, dpt, hght ); - if( pmsl.hasValidValue() ) { - setValue( pmsl ); - } - } - else { - setValueToMissing(); - } - - return this; - } - - @Override - public String getFormattedString( String formatStr ) { - if( formatStr == null || formatStr.isEmpty() || - formatStr.startsWith("%" ) ) { - return super.getFormattedString( formatStr ); - } - else if ( ( formatStr.compareToIgnoreCase("RMSL") == 0 ) - || (formatStr.compareToIgnoreCase("SMSL") == 0 )){ - double newPresValInMb = Double.NaN; - if ( ( this.getUnit().toString().compareTo("mb") != 0 ) ){ - double oldPresVal = this.value.doubleValue(); - newPresValInMb = this.getUnit() - .getConverterTo( NcUnits.MILLIBAR ) - .convert( oldPresVal ) ; - //setValue(new Amount ( newPresValInMb, NcUnits.MILLIBAR )); - } - double temp = newPresValInMb * 10; - double abbrevPressVal = temp % 1000; - abbrevPressVal = Math.abs(abbrevPressVal); - Integer abbrevpressValAsInt = new Integer ( ( int ) abbrevPressVal ); - String abbrevPressureString = abbrevpressValAsInt.toString(); - if ( abbrevPressureString.length() == 1 ){ - abbrevPressureString = new String ( "00" + abbrevPressureString); - } - if ( abbrevPressureString.length() == 2 ){ - abbrevPressureString = new String ( "0" + abbrevPressureString); - } - return abbrevPressureString; - - } - - else - return super.getFormattedString( formatStr ); -// String fmtValStr = super.getFormattedString( "%2.2f" ); -// -// return fmtValStr.substring( 1 ); - } - - - - - -// @DeriveMethod -// public MeanSeaLevelPres derive( StationPressure prs, Temperature t, -// DewPointTemp dpt, StationElevation selv ) { -// if( prs.hasValidValue() && t.hasValidValue() && dpt.hasValidValue() && -// selv.hasValidValue() ) { -//// Amount prPmsl ( Amount pres, Amount tmpc, Amount dwpc, Amount selv ); -// } -// else { -// setValueToMissing(); -// } -// -// return this; -// } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MetParameterFactory.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MetParameterFactory.java deleted file mode 100644 index 2c61de7eb1..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MetParameterFactory.java +++ /dev/null @@ -1,375 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.text.ParseException; -import java.text.ParsePosition; -import java.util.HashMap; -import javax.measure.unit.Unit; -import javax.measure.unit.UnitFormat; - -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.viz.core.exception.VizException; - -// TODO : this class can be enhanced to read AbstractNcParameter objects either from an extension point or to read -// jaxb files from a directory. Till then the AbstractNcParameter's are just created here. -// -public class MetParameterFactory { - - // map from the alias to the ncep parameter name. - private HashMap ncParamsAliasMap = new HashMap(); - - // - private HashMap ncParamsMap = - new HashMap(); - - private static MetParameterFactory instance=null; - - public static MetParameterFactory getInstance() { - if( instance == null ) { - instance = new MetParameterFactory(); - } - return instance; - } - - private MetParameterFactory() { - ncParamsMap.put( AircraftType.class.getSimpleName(), new AircraftType() ); - ncParamsMap.put( AircraftReportType.class.getSimpleName(), new AircraftReportType() ); - ncParamsMap.put( Avg3HrShipSpeed.class.getSimpleName(), new Avg3HrShipSpeed() ); - ncParamsMap.put( BaseOfIcing.class.getSimpleName(), new BaseOfIcing() ); - ncParamsMap.put( BaseOfTurbulence.class.getSimpleName(), new BaseOfTurbulence() ); - ncParamsMap.put( BaseOfWeather.class.getSimpleName(), new BaseOfWeather() ); - ncParamsMap.put( BruntVaisalaFreq.class.getSimpleName(), new BruntVaisalaFreq() ); - ncParamsMap.put( BruntVaisalaPeriod.class.getSimpleName(), new BruntVaisalaPeriod() ); -// ncParamsMap.put( BruntVaisalaFrequencySquared.class.getSimpleName(), new BruntVaisalaFrequencySquared() ); - ncParamsMap.put( CatFcstCeilingHeightCond.class.getSimpleName(), new CatFcstCeilingHeightCond() ); - ncParamsMap.put( CatFcstObstructionsVision.class.getSimpleName(), new CatFcstObstructionsVision() ); - ncParamsMap.put( CatFcstPrecipitation.class.getSimpleName(), new CatFcstPrecipitation() ); - ncParamsMap.put( CatFcstSnowAmountFalling24hr.class.getSimpleName(), new CatFcstSnowAmountFalling24hr() ); - ncParamsMap.put( CatFcstVisibilityCond.class.getSimpleName(), new CatFcstVisibilityCond() ); - ncParamsMap.put( CeilingFromSurface.class.getSimpleName(), new CeilingFromSurface() ); - ncParamsMap.put( CeilingFromSeaLevel.class.getSimpleName(), new CeilingFromSeaLevel() ); - ncParamsMap.put( CloudCover.class.getSimpleName(), new CloudCover() ); - ncParamsMap.put( ClimDayTemp.class.getSimpleName(), new ClimDayTemp() ); - ncParamsMap.put( ClimNightTemp.class.getSimpleName(), new ClimNightTemp() ); - ncParamsMap.put( Clim12HrPOP.class.getSimpleName(), new Clim12HrPOP() ); - ncParamsMap.put( Clim24HrPOP.class.getSimpleName(), new Clim24HrPOP() ); - ncParamsMap.put( CloudBase1.class.getSimpleName(), new CloudBase1() ); - ncParamsMap.put( CloudBase2.class.getSimpleName(), new CloudBase2() ); -// ncParamsMap.put( CloudFractionInLayer.class.getSimpleName(), new CloudFractionInLayer() ); -// ncParamsMap.put( CloudWater.class.getSimpleName(), new CloudWater() ); - ncParamsMap.put( CloudTop1.class.getSimpleName(), new CloudTop1() ); - ncParamsMap.put( CloudTop2.class.getSimpleName(), new CloudTop2() ); - ncParamsMap.put( CondProbOf6HrSevereWeather.class.getSimpleName(), new CondProbOf6HrSevereWeather() ); - ncParamsMap.put( CondProbOf12HrSevereWeather.class.getSimpleName(), new CondProbOf12HrSevereWeather() ); - ncParamsMap.put( CondProbOf12HrFreezingPrecip.class.getSimpleName(), new CondProbOf12HrFreezingPrecip() ); - ncParamsMap.put( CondProbOf12HrRain.class.getSimpleName(), new CondProbOf12HrRain() ); - ncParamsMap.put( CondFcstPrecip12HrType.class.getSimpleName(), new CondFcstPrecip12HrType() ); - ncParamsMap.put( CondProbOf12HrSnow.class.getSimpleName(), new CondProbOf12HrSnow() ); - ncParamsMap.put( CondProbOf24HrSevereWeather.class.getSimpleName(), new CondProbOf24HrSevereWeather() ); - ncParamsMap.put( CondProbOfFreezingPrecip.class.getSimpleName(), new CondProbOfFreezingPrecip() ); - ncParamsMap.put( CondProbOfSnow.class.getSimpleName(), new CondProbOfSnow() ); - ncParamsMap.put( ShipCourse.class.getSimpleName(), new ShipCourse() ); - ncParamsMap.put( DayTempAnomaly.class.getSimpleName(), new DayTempAnomaly() ); - ncParamsMap.put( DayTempFcst.class.getSimpleName(), new DayTempFcst() ); - ncParamsMap.put( DewPointDepression.class.getSimpleName(), new DewPointDepression() ); - ncParamsMap.put( DewPointTemp.class.getSimpleName(), new DewPointTemp() ); - ncParamsMap.put( FiveSecPeakWindDir.class.getSimpleName(), new FiveSecPeakWindDir() ); - ncParamsMap.put( PredomSwellWaveDir.class.getSimpleName(), new PredomSwellWaveDir() ); - ncParamsMap.put( SecondarySwellWaveDir.class.getSimpleName(), new SecondarySwellWaveDir() ); - ncParamsMap.put( DPRN.class.getSimpleName(), new DPRN() ); - ncParamsMap.put( DryAirDensity.class.getSimpleName(), new DryAirDensity() ); - ncParamsMap.put( DryHydrostaticHeight.class.getSimpleName(), new DryHydrostaticHeight() ); - ncParamsMap.put( TimeOf5SecPeakWindInHrs.class.getSimpleName(), new TimeOf5SecPeakWindInHrs() ); - ncParamsMap.put( TimeOf5SecPeakWindInMins.class.getSimpleName(), new TimeOf5SecPeakWindInMins() ); - ncParamsMap.put( EquivPotentialTemp.class.getSimpleName(), new EquivPotentialTemp() ); - ncParamsMap.put( EquivWindSpeed10min.class.getSimpleName(), new EquivWindSpeed10min() ); - ncParamsMap.put( EquivWindSpeed20min.class.getSimpleName(), new EquivWindSpeed20min() ); - ncParamsMap.put( FcstFZRainAccumulationIn12Hours.class.getSimpleName(), new FcstFZRainAccumulationIn12Hours() ); - ncParamsMap.put( FcstFZRainAccumulationToWatchThresh.class.getSimpleName(), new FcstFZRainAccumulationToWatchThresh() ); - ncParamsMap.put( FcstSnowIcePelletAccumulation12Hrs.class.getSimpleName(), new FcstSnowIcePelletAccumulation12Hrs() ); - ncParamsMap.put( FcstSnowIcePelletAccumToWatchThresh.class.getSimpleName(), new FcstSnowIcePelletAccumToWatchThresh() ); - ncParamsMap.put( FlashFloodGuid01Hr.class.getSimpleName(), new FlashFloodGuid01Hr() ); - ncParamsMap.put( FlashFloodGuid03Hr.class.getSimpleName(), new FlashFloodGuid03Hr() ); - ncParamsMap.put( FlashFloodGuid06Hr.class.getSimpleName(), new FlashFloodGuid06Hr() ); - ncParamsMap.put( FlashFloodGuid12Hr.class.getSimpleName(), new FlashFloodGuid12Hr() ); - ncParamsMap.put( FlashFloodGuid24Hr.class.getSimpleName(), new FlashFloodGuid24Hr() ); - ncParamsMap.put( FlightRulesID.class.getSimpleName(), new FlightRulesID() ); - ncParamsMap.put( FlightLevel.class.getSimpleName(), new FlightLevel() ); - ncParamsMap.put( FosbergFireWxIndex.class.getSimpleName(), new FosbergFireWxIndex() ); - ncParamsMap.put( FZRainWatchThresh.class.getSimpleName(), new FZRainWatchThresh() ); -// ncParamsMap.put( GenericDimensionlessParameter.class.getSimpleName(), new GenericDimensionlessParameter() ); -// ncParamsMap.put( GustBarb.class.getSimpleName(), new GustBarb() ); - ncParamsMap.put( HailSize.class.getSimpleName(), new HailSize() ); - ncParamsMap.put( HeatIndex.class.getSimpleName(), new HeatIndex() ); - ncParamsMap.put( HeightAboveSeaLevel.class.getSimpleName(), new HeightAboveSeaLevel() ); - ncParamsMap.put( InstrumentWaveHeight.class.getSimpleName(), new InstrumentWaveHeight() ); - ncParamsMap.put( PredomSwellWaveHeight.class.getSimpleName(), new PredomSwellWaveHeight() ); - ncParamsMap.put( SecondarySwellWaveHeight.class.getSimpleName(), new SecondarySwellWaveHeight() ); - ncParamsMap.put( WaveHeight.class.getSimpleName(), new WaveHeight() ); - ncParamsMap.put( WindWaveHeight.class.getSimpleName(), new WindWaveHeight() ); - ncParamsMap.put( Highest1MinMeanWindSpeedInPastHour.class.getSimpleName(), new Highest1MinMeanWindSpeedInPastHour() ); - ncParamsMap.put( HighResWaveHeight.class.getSimpleName(), new HighResWaveHeight() ); - ncParamsMap.put( HumitureIndex.class.getSimpleName(), new HumitureIndex() ); - ncParamsMap.put( IceCode.class.getSimpleName(), new IceCode() ); - ncParamsMap.put( IcingIntensitySymbol.class.getSimpleName(), new IcingIntensitySymbol() ); - ncParamsMap.put( IcingTypeSymbol.class.getSimpleName(), new IcingTypeSymbol() ); - ncParamsMap.put( InterWindDir.class.getSimpleName(), new InterWindDir() ); - ncParamsMap.put( InterWindSpeed.class.getSimpleName(), new InterWindSpeed() ); - ncParamsMap.put( InterWindTime.class.getSimpleName(), new InterWindTime() ); - ncParamsMap.put( LatentHeatOfVapor.class.getSimpleName(), new LatentHeatOfVapor() ); - ncParamsMap.put( LCLParcelPressure.class.getSimpleName(), new LCLParcelPressure() ); - ncParamsMap.put( LCLParcelTemperature.class.getSimpleName(), new LCLParcelTemperature() ); - ncParamsMap.put( LiftedIndex.class.getSimpleName(), new LiftedIndex() ); - ncParamsMap.put( LiftedSurfaceAirTempAt500mb.class.getSimpleName(), new LiftedSurfaceAirTempAt500mb() ); - ncParamsMap.put( Lowest01MinAvgPressInPastHour.class.getSimpleName(), new Lowest01MinAvgPressInPastHour() ); - ncParamsMap.put( Max24HrTemp.class.getSimpleName(), new Max24HrTemp() ); - ncParamsMap.put( Max6HrTemp.class.getSimpleName(), new Max6HrTemp() ); - ncParamsMap.put( MaxDailyWeatherMapTemp.class.getSimpleName(), new MaxDailyWeatherMapTemp() ); - ncParamsMap.put( MaxDayTemp.class.getSimpleName(), new MaxDayTemp() ); - ncParamsMap.put( MaxEditedTemp.class.getSimpleName(), new MaxEditedTemp() ); - ncParamsMap.put( MaxCloudCover.class.getSimpleName(), new MaxCloudCover() ); - ncParamsMap.put( MaxPrecipPR6X.class.getSimpleName(), new MaxPrecipPR6X() ); //remove?? - ncParamsMap.put( MaxMidnightTemp.class.getSimpleName(), new MaxMidnightTemp() ); - ncParamsMap.put( MaxOrMinTemp.class.getSimpleName(), new MaxOrMinTemp() ); - ncParamsMap.put( Max12HrPrecipFcst.class.getSimpleName(), new Max12HrPrecipFcst() ); - ncParamsMap.put( MaxWindSpeed.class.getSimpleName(), new MaxWindSpeed() ); - ncParamsMap.put( MeanSeaLevelPres.class.getSimpleName(), new MeanSeaLevelPres() ); - ncParamsMap.put( Min24HrTemp.class.getSimpleName(), new Min24HrTemp() ); - ncParamsMap.put( Min6HrTemp.class.getSimpleName(), new Min6HrTemp() ); - ncParamsMap.put( MinDailyWeatherMapTemp.class.getSimpleName(), new MinDailyWeatherMapTemp() ); - ncParamsMap.put( MinNightTemp.class.getSimpleName(), new MinNightTemp() ); - ncParamsMap.put( MixingRatio.class.getSimpleName(), new MixingRatio() ); - ncParamsMap.put( MoistHydrostaticHeight.class.getSimpleName(), new MoistHydrostaticHeight() ); - ncParamsMap.put( MontgomeryStreamFnct.class.getSimpleName(), new MontgomeryStreamFnct() ); - ncParamsMap.put( MountainObscThreshMetIndicator.class.getSimpleName(), new MountainObscThreshMetIndicator() ); - ncParamsMap.put( MountainObscThresh.class.getSimpleName(), new MountainObscThresh() ); - ncParamsMap.put( NightTempAnomaly.class.getSimpleName(), new NightTempAnomaly() ); - ncParamsMap.put( NewSnowAmount.class.getSimpleName(), new NewSnowAmount() ); - ncParamsMap.put( NightTempFcst.class.getSimpleName(), new NightTempFcst() ); - ncParamsMap.put( NumInterWinds.class.getSimpleName(), new NumInterWinds() ); - ncParamsMap.put( AirParcelTemp.class.getSimpleName(), new AirParcelTemp() ); -// ncParamsMap.put( Omega.class.getSimpleName(), new Omega() ); - ncParamsMap.put( PeakWindDir.class.getSimpleName(), new PeakWindDir() ); - ncParamsMap.put( PeakWindSpeed.class.getSimpleName(), new PeakWindSpeed() ); - ncParamsMap.put( PeakWindSpeedTime.class.getSimpleName(), new PeakWindSpeedTime() ); - ncParamsMap.put( InstrumentWavePeriod.class.getSimpleName(), new InstrumentWavePeriod() ); - ncParamsMap.put( PredomSwellWavePeriod.class.getSimpleName(), new PredomSwellWavePeriod() ); - ncParamsMap.put( SecondarySwellWavePeriod.class.getSimpleName(), new SecondarySwellWavePeriod() ); - ncParamsMap.put( WavePeriod.class.getSimpleName(), new WavePeriod() ); - ncParamsMap.put( WindWavePeriod.class.getSimpleName(), new WindWavePeriod() ); - ncParamsMap.put( PerpendicularWindComp.class.getSimpleName(), new PerpendicularWindComp() ); - ncParamsMap.put( PotentialTemp.class.getSimpleName(), new PotentialTemp() ); - ncParamsMap.put( PlatformTrueDirection.class.getSimpleName(), new PlatformTrueDirection() ); - ncParamsMap.put( PlatformTrueSpeed.class.getSimpleName(), new PlatformTrueSpeed() ); - ncParamsMap.put( PotentialTempLapseRate.class.getSimpleName(), new PotentialTempLapseRate() ); - ncParamsMap.put( PrecipitableWaterForEntireSounding.class.getSimpleName(), new PrecipitableWaterForEntireSounding() ); - ncParamsMap.put( PrecipitableWaterUptoSpecifiedLevel.class.getSimpleName(), new PrecipitableWaterUptoSpecifiedLevel() ); - ncParamsMap.put( Precipitation.class.getSimpleName(), new Precipitation() ); - ncParamsMap.put( Precip01Hr.class.getSimpleName(), new Precip01Hr() ); - ncParamsMap.put( Precip03Hr.class.getSimpleName(), new Precip03Hr() ); - ncParamsMap.put( Precip06Hr.class.getSimpleName(), new Precip06Hr() ); -// ncParamsMap.put( PrecipitationIn09Hours.class.getSimpleName(), new PrecipitationIn09Hours() ); - ncParamsMap.put( Precip12Hr.class.getSimpleName(), new Precip12Hr() ); - ncParamsMap.put( Precip18Hr.class.getSimpleName(), new Precip18Hr() ); - ncParamsMap.put( Precip24Hr.class.getSimpleName(), new Precip24Hr() ); - ncParamsMap.put( PresentWeather.class.getSimpleName(), new PresentWeather() ); - ncParamsMap.put( PressureLevel.class.getSimpleName(), new PressureLevel() ); - ncParamsMap.put( PressChange3Hr.class.getSimpleName(), new PressChange3Hr() ); - ncParamsMap.put( PressChange24Hr.class.getSimpleName(), new PressChange24Hr() ); - ncParamsMap.put( PressTendency.class.getSimpleName(), new PressTendency() ); - ncParamsMap.put( POPAnomalyIn12hrs.class.getSimpleName(), new POPAnomalyIn12hrs() ); - ncParamsMap.put( POPAnomalyIn24hrs.class.getSimpleName(), new POPAnomalyIn24hrs() ); - ncParamsMap.put( POPFcst06Hrs.class.getSimpleName(), new POPFcst06Hrs() ); - ncParamsMap.put( POPFcst12Hrs.class.getSimpleName(), new POPFcst12Hrs() ); - ncParamsMap.put( POPFcst24Hrs.class.getSimpleName(), new POPFcst24Hrs() ); - ncParamsMap.put( POP12Hrs.class.getSimpleName(), new POP12Hrs() ); - ncParamsMap.put( POP24Hrs.class.getSimpleName(), new POP24Hrs() ); - ncParamsMap.put( RateOfIceAccretionOnVesselInSaltWater.class.getSimpleName(), new RateOfIceAccretionOnVesselInSaltWater() ); - ncParamsMap.put( RelativeHumidity.class.getSimpleName(), new RelativeHumidity() ); - ncParamsMap.put( RichardsonNumber.class.getSimpleName(), new RichardsonNumber() ); - ncParamsMap.put( SatEquivPotentialTemp.class.getSimpleName(), new SatEquivPotentialTemp() ); - ncParamsMap.put( SatMixingRatio.class.getSimpleName(), new SatMixingRatio() ); - ncParamsMap.put( SatVaporPressure.class.getSimpleName(), new SatVaporPressure() ); - ncParamsMap.put( SeaIceDriftDist.class.getSimpleName(), new SeaIceDriftDist() ); - ncParamsMap.put( SeaLevelPressure.class.getSimpleName(), new SeaLevelPressure() ); - ncParamsMap.put( SeaSurfaceTemp.class.getSimpleName(), new SeaSurfaceTemp() ); - ncParamsMap.put( ShowalterIndex.class.getSimpleName(), new ShowalterIndex() ); - ncParamsMap.put( SkyCoverage.class.getSimpleName(), new SkyCoverage() ); - ncParamsMap.put( SnowDepth.class.getSimpleName(), new SnowDepth() ); - ncParamsMap.put( SnowIcePelletWatchThresh.class.getSimpleName(), new SnowIcePelletWatchThresh() ); - ncParamsMap.put( SpeedOf05SecPeakWind.class.getSimpleName(), new SpeedOf05SecPeakWind() ); - ncParamsMap.put( SpecificHumidity.class.getSimpleName(), new SpecificHumidity() ); - ncParamsMap.put( StabilityWithRespectToPressure.class.getSimpleName(), new StabilityWithRespectToPressure() ); - ncParamsMap.put( StationElevation.class.getSimpleName(), new StationElevation() ); - ncParamsMap.put( StationID.class.getSimpleName(), new StationID() ); - ncParamsMap.put( StationLatitude.class.getSimpleName(), new StationLatitude() ); - ncParamsMap.put( StationLongitude.class.getSimpleName(), new StationLongitude() ); - ncParamsMap.put( StationName.class.getSimpleName(), new StationName() ); - ncParamsMap.put( SurfacePressure.class.getSimpleName(), new SurfacePressure() ); - ncParamsMap.put( StormMotionSpeed.class.getSimpleName(), new StormMotionSpeed() ); -// ncParamsMap.put( StormMotionDirection.class.getSimpleName(), new StormMotionDirection() ); - // ncParamsMap.put( SumOfFour6HrPrecipitation.class.getSimpleName(), new SumOfFour6HrPrecipitation() ); - ncParamsMap.put( SunshineDuration.class.getSimpleName(), new SunshineDuration() ); - ncParamsMap.put( SurfaceEquivPotentialTemp.class.getSimpleName(), new SurfaceEquivPotentialTemp() ); - ncParamsMap.put( SurfaceMixingRatio.class.getSimpleName(), new SurfaceMixingRatio() ); - ncParamsMap.put( SurfacePotentialTemp.class.getSimpleName(), new SurfacePotentialTemp() ); - ncParamsMap.put( SurfacePressure.class.getSimpleName(), new SurfacePressure() ); - ncParamsMap.put( SurfaceSatEquivPotentialTemp.class.getSimpleName(), new SurfaceSatEquivPotentialTemp() ); - ncParamsMap.put( SurfaceSatMixingRatio.class.getSimpleName(), new SurfaceSatMixingRatio() ); - ncParamsMap.put( AirTemperature.class.getSimpleName(), new AirTemperature() ); - ncParamsMap.put( TempLapseRate.class.getSimpleName(), new TempLapseRate() ); - ncParamsMap.put( TemporaryOrProbabilityCeiling.class.getSimpleName(), new TemporaryOrProbabilityCeiling() ); - ncParamsMap.put( TemporaryCeilingAsMeanSeaLevel.class.getSimpleName(), new TemporaryCeilingAsMeanSeaLevel() ); - ncParamsMap.put( TemporaryOrProbabilityFlightRuleIdentifier.class.getSimpleName(), new TemporaryOrProbabilityFlightRuleIdentifier() ); - ncParamsMap.put( TemporaryOrProbabilityMountainObscThreshMetIndicator.class.getSimpleName(), new TemporaryOrProbabilityMountainObscThreshMetIndicator() ); - ncParamsMap.put( TemporaryOrProbabilityVisibility.class.getSimpleName(), new TemporaryOrProbabilityVisibility() ); - ncParamsMap.put( TemporaryOrProbabilityWindDirection.class.getSimpleName(), new TemporaryOrProbabilityWindDirection() ); - ncParamsMap.put( TemporaryOrProbabilityWindGust.class.getSimpleName(), new TemporaryOrProbabilityWindGust() ); - ncParamsMap.put( TemporaryOrProbabilityWindSpeed.class.getSimpleName(), new TemporaryOrProbabilityWindSpeed() ); -// ncParamsMap.put( ThunderstormOccurring2hr.class.getSimpleName(), new ThunderstormOccurring2hr() ); -// ncParamsMap.put( ThunderstormOccurring6hr.class.getSimpleName(), new ThunderstormOccurring6hr() ); -// ncParamsMap.put( ThunderstormOccurring12hr.class.getSimpleName(), new ThunderstormOccurring12hr() ); -// ncParamsMap.put( ThunderstormOccurring24hr.class.getSimpleName(), new ThunderstormOccurring24hr() ); - ncParamsMap.put( ShipIceThickness.class.getSimpleName(), new ShipIceThickness() ); - ncParamsMap.put( TopOfIcing.class.getSimpleName(), new TopOfIcing() ); - ncParamsMap.put( TopOfTurbulence.class.getSimpleName(), new TopOfTurbulence() ); - ncParamsMap.put( TopOfWeather.class.getSimpleName(), new TopOfWeather() ); - ncParamsMap.put( TurbulenceFrequencySymbol.class.getSimpleName(), new TurbulenceFrequencySymbol() ); - ncParamsMap.put( TurbulenceIntensitySymbol.class.getSimpleName(), new TurbulenceIntensitySymbol() ); -// ncParamsMap.put( TurbulentKineticEnergy.class.getSimpleName(), new TurbulentKineticEnergy() ); - ncParamsMap.put( EstStormDirectionUComp.class.getSimpleName(), new EstStormDirectionUComp() ); - ncParamsMap.put( UncondProbOfTstorms2hr.class.getSimpleName(), new UncondProbOfTstorms2hr() ); - ncParamsMap.put( UncondProbOfTstorms6hr.class.getSimpleName(), new UncondProbOfTstorms6hr() ); - ncParamsMap.put( UncondProbOfTstorms12hr.class.getSimpleName(), new UncondProbOfTstorms12hr() ); - ncParamsMap.put( UncondProbOfTstorms24hr.class.getSimpleName(), new UncondProbOfTstorms24hr() ); - ncParamsMap.put( WindDirectionUComp.class.getSimpleName(), new WindDirectionUComp() ); - ncParamsMap.put( VaporPressure.class.getSimpleName(), new VaporPressure() ); - ncParamsMap.put( EstStormDirectionVComp.class.getSimpleName(), new EstStormDirectionVComp() ); - ncParamsMap.put( IsentropesVerticalSeparation.class.getSimpleName(), new IsentropesVerticalSeparation() ); - ncParamsMap.put( VerticalVelocity.class.getSimpleName(), new VerticalVelocity() ); - ncParamsMap.put( VirtualPotentialTemp.class.getSimpleName(), new VirtualPotentialTemp() ); - ncParamsMap.put( VirtualTemp.class.getSimpleName(), new VirtualTemp() ); - ncParamsMap.put( Visibility.class.getSimpleName(), new Visibility() ); - ncParamsMap.put( WindDirectionVComp.class.getSimpleName(), new WindDirectionVComp() ); - ncParamsMap.put( WaterEquivOfNewSnow.class.getSimpleName(), new WaterEquivOfNewSnow() ); - ncParamsMap.put( WaveSteepness.class.getSimpleName(), new WaveSteepness() ); - ncParamsMap.put( WetBulbPotentialTemp.class.getSimpleName(), new WetBulbPotentialTemp() ); - ncParamsMap.put( WetBulbTemp.class.getSimpleName(), new WetBulbTemp() ); -// ncParamsMap.put( WindBarb.class.getSimpleName(), new WindBarb() ); - ncParamsMap.put( WindChillEquivalentTemp.class.getSimpleName(), new WindChillEquivalentTemp() ); - ncParamsMap.put( WindChillTemperature.class.getSimpleName(), new WindChillTemperature() ); - ncParamsMap.put( WindSpeedComp.class.getSimpleName(), new WindSpeedComp() ); - ncParamsMap.put( WindCompDirection.class.getSimpleName(), new WindCompDirection() ); - ncParamsMap.put( WindDirection.class.getSimpleName(), new WindDirection() ); - ncParamsMap.put( WindGust.class.getSimpleName(), new WindGust() ); - ncParamsMap.put( WindSpeed.class.getSimpleName(), new WindSpeed() ); - ncParamsMap.put( CeilingFromSeaLevelWorstCase.class.getSimpleName(), new CeilingFromSeaLevelWorstCase() ); - ncParamsMap.put( FlightRulesIdWorstCase.class.getSimpleName(), new FlightRulesIdWorstCase() ); - ncParamsMap.put( MountainObscThreshMetIndicatorWorstCase.class.getSimpleName(), new MountainObscThreshMetIndicatorWorstCase() ); - } - - public boolean isValidMetParameterName( String metPrmName ) { - return ncParamsMap.containsKey( metPrmName ); - } - - // get the default units - public AbstractMetParameter createParameter( String prmName ) { - String ncParamName; - if( ncParamsAliasMap.containsKey( prmName ) ) { - ncParamName = ncParamsAliasMap.get( prmName ); - } - else { - ncParamName = prmName; - } - - if( ncParamName == null || - !ncParamsMap.containsKey( ncParamName )) { - System.out.println("can't find ncParam for : "+prmName ); - return null; - } - - AbstractMetParameter ncParam = ncParamsMap.get( ncParamName ); - - try { - AbstractMetParameter newParam = (AbstractMetParameter) - ncParam.getClass().getConstructor().newInstance(); - return newParam; - } catch (Exception e) { - System.out.println("error getting newInstance for metParam " + - ncParam.getClass().getSimpleName() ); - } - - return null; - } - - // u is the expected units and must be compatible with the units for the implemented - // Quantity. - public AbstractMetParameter createParameter( String prmName, String unitName ) { - Unit units; - - if( unitName == null ) { - units = Unit.ONE; - } - else { - try { - units = UnitFormat.getUCUMInstance().parseProductUnit( - unitName, new ParsePosition(0) ); - } catch (ParseException e) { - System.out.println("unable to determine units for "+unitName); - return null; - } - } - - return createParameter(prmName, units); - } - - // create a parameter value with MISSING value. - // name may be an alias, or the name of the parameter - // - public AbstractMetParameter createParameter( String prmName, Unit u ) { - AbstractMetParameter newParam = createParameter( prmName ); - newParam.setUnit( u ); - return newParam; - } - - public AbstractMetParameter createParameter( String prmName, DataTime dt ) { - AbstractMetParameter newParam = createParameter( prmName ); - newParam.setValidTime( dt ); - return newParam; - } - - public AbstractMetParameter createParameter( String prmName, Unit u, DataTime dt ) { - AbstractMetParameter newParam = createParameter( prmName ); - newParam.setValidTime( dt ); - newParam.setUnit( u ); - return newParam; - } - - public boolean alias( String prmName, String alias ) { - - if( ncParamsAliasMap.containsKey( alias ) && - !ncParamsAliasMap.get( alias ).equals( prmName ) ) { - System.out.println("Error aliasing ncParam "+prmName+" : "+alias + - " is already aliased to "+ncParamsAliasMap.get( alias ) ); - // return false; - } - - ncParamsAliasMap.put( alias, prmName ); - - return true; - } - - public static class NotDerivableException extends VizException { - private static final long serialVersionUID = -5750539413381916413L; - - public NotDerivableException( String msg) { - super( msg ); - } - } - - public @Retention(RetentionPolicy.RUNTIME) @interface DeriveMethod { - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min24HrTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min24HrTemp.java deleted file mode 100644 index 1f08319e28..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min24HrTemp.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class Min24HrTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public Min24HrTemp() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min6HrTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min6HrTemp.java deleted file mode 100644 index 1c87e545c8..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Min6HrTemp.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class Min6HrTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public Min6HrTemp() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinDailyWeatherMapTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinDailyWeatherMapTemp.java deleted file mode 100644 index fa75d11e70..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinDailyWeatherMapTemp.java +++ /dev/null @@ -1,38 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -public class MinDailyWeatherMapTemp extends AbstractMetParameter implements javax.measure.quantity.Temperature { - - public MinDailyWeatherMapTemp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( Min6HrTemp t00x, Min6HrTemp t06x ) throws InvalidValueException, NullPointerException{ - if ( t00x.hasValidValue() && t06x.hasValidValue() ){ - Amount val = PRLibrary.prDmin(t00x, t06x); - setValue(val); - }else - setValueToMissing(); - - return this; - } - -} - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinNightTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinNightTemp.java deleted file mode 100644 index 7e3bb32d7e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MinNightTemp.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class MinNightTemp extends AbstractMetParameter implements - Temperature { - - public MinNightTemp(){ - super( UNIT ); - } - } - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MixingRatio.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MixingRatio.java deleted file mode 100644 index 5f469f0346..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MixingRatio.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -/** - * @author archana - * - */ -public final class MixingRatio extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - public MixingRatio(){ - super( UNIT ); - } - - @DeriveMethod - public MixingRatio derive ( DewPointTemp d , PressureLevel p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( d.hasValidValue() && p.hasValidValue() ){ - Amount mixingRatio = PRLibrary.prMixr( d, p ); - this.setValue(mixingRatio); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MoistHydrostaticHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MoistHydrostaticHeight.java deleted file mode 100644 index 3b2a6a262f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MoistHydrostaticHeight.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class MoistHydrostaticHeight extends AbstractMetParameter - implements Length { - - public MoistHydrostaticHeight(){ - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MontgomeryStreamFnct.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MontgomeryStreamFnct.java deleted file mode 100644 index c9ece42a74..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MontgomeryStreamFnct.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * - * @author archana - * - */ -public class MontgomeryStreamFnct extends AbstractMetParameter implements - Dimensionless { - - protected MontgomeryStreamFnct() { - super(UNIT); - } - - //TODO: add the derive method once the nature/order of the input parameters in known -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThresh.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThresh.java deleted file mode 100644 index 6cef5084b8..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThresh.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class MountainObscThresh extends AbstractMetParameter - implements Length { - - public MountainObscThresh() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicator.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicator.java deleted file mode 100644 index 724b6992d5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicator.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -public class MountainObscThreshMetIndicator extends - AbstractMetParameter implements Dimensionless { - - public MountainObscThreshMetIndicator() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( CeilingFromSeaLevel tcms, MountainObscThresh motv) throws InvalidValueException, NullPointerException{ - Amount val = PRLibrary.prMobs(tcms, motv ); - setValue ( val ); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicatorWorstCase.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicatorWorstCase.java deleted file mode 100644 index 049d44020c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/MountainObscThreshMetIndicatorWorstCase.java +++ /dev/null @@ -1,37 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -public class MountainObscThreshMetIndicatorWorstCase extends - AbstractMetParameter implements Dimensionless { - - public MountainObscThreshMetIndicatorWorstCase() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( CeilingFromSeaLevelWorstCase wcms, MountainObscThresh motv) throws InvalidValueException, NullPointerException{ - if ( wcms.hasValidValue() && motv.hasValidValue() ){ - Amount val = PRLibrary.prMobs(wcms, motv ); - setValue ( val ); - }else - setValueToMissing(); - - return this; - } -} - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NewSnowAmount.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NewSnowAmount.java deleted file mode 100644 index d55e9fbf26..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NewSnowAmount.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class NewSnowAmount extends AbstractMetParameter implements Length { - - public NewSnowAmount(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempAnomaly.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempAnomaly.java deleted file mode 100644 index 770471fe4e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempAnomaly.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccess; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccessManager; - -import javax.measure.quantity.Temperature; -import javax.measure.unit.NonSI; - -/** - * @author archana - * - */ - public class NightTempAnomaly extends AbstractMetParameter implements - Temperature { - - public NightTempAnomaly() { - super( UNIT ); - } - - @DeriveMethod - public NightTempAnomaly derive( Min24HrTemp min24HrTemp, StationID stationId ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( min24HrTemp.hasValidValue() && stationId.hasValidValue() ){ - - // See DayTempAnomaly - // String month = SelectedFrameTimeUtil.getFrameTimeMonthStringValue(); -// String dayOfMonth = SelectedFrameTimeUtil.getFrameTimeDayOfMonthStringValue(); -// double climateTNTFInF = getClimateTNTFInF(stationId.valueString, month, dayOfMonth); -// double min24HrTempInF = min24HrTemp.getValueAs(NonSI.FAHRENHEIT).doubleValue(); -// double finalTNAFInF = min24HrTempInF - climateTNTFInF; -// System.out.println("=======, min24HrTempInF= "+min24HrTempInF); -// System.out.println("=======, climateTNTFInF= "+climateTNTFInF); -// System.out.println("=======, finalTNAFInF= "+finalTNAFInF); - - /* - * tnaf: Night Temp anomaly in F - */ -// Amount tnafAmount = new Amount(finalTNAFInF, NonSI.FAHRENHEIT); -// setValue(tnafAmount); - }else - setValueToMissing(); - return this; - } - - private double getClimateTNTFInF(String stationId, String month, String day) { - ClimateDataDbAccess climateDataDbAccess = ClimateDataDbAccessManager.getInstance().getClimateDataDbAccess(); - double tntfClimateValue = climateDataDbAccess.getTNTF(stationId, month, day); - return tntfClimateValue; - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempFcst.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempFcst.java deleted file mode 100644 index a29a9052e9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NightTempFcst.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class NightTempFcst extends AbstractMetParameter implements - Temperature { - - public NightTempFcst() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NumInterWinds.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NumInterWinds.java deleted file mode 100644 index 675d2e8a10..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/NumInterWinds.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class NumInterWinds extends AbstractMetParameter implements - Dimensionless { - public NumInterWinds ( ){ - super ( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/OneMinPeakWindDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/OneMinPeakWindDir.java deleted file mode 100644 index 9d8e54917e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/OneMinPeakWindDir.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; -import javax.measure.unit.Unit; - - public class OneMinPeakWindDir extends AbstractMetParameter - implements Angle { - - public OneMinPeakWindDir (){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP12Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP12Hrs.java deleted file mode 100644 index 01509a18db..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP12Hrs.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class POP12Hrs extends AbstractMetParameter implements - Dimensionless { - - public POP12Hrs() { - super( UNIT ); - } - - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP24Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP24Hrs.java deleted file mode 100644 index 9fb1e499e9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POP24Hrs.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class POP24Hrs extends AbstractMetParameter implements - Dimensionless { - - public POP24Hrs() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn12hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn12hrs.java deleted file mode 100644 index 553211b42f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn12hrs.java +++ /dev/null @@ -1,45 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccess; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccessManager; - -import javax.measure.unit.NonSI; - -public class POPAnomalyIn12hrs extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - public POPAnomalyIn12hrs(){ - super( UNIT ); - } - - @DeriveMethod - public POPAnomalyIn12hrs derive( POPFcst12Hrs popFcst12Hrs, StationID stationId ) throws InvalidValueException, NullPointerException, InvalidRangeException { - // SEE ClimDayTemp -// if ( popFcst12Hrs.hasValidValue() && stationId.hasValidValue() ){ -// String month = SelectedFrameTimeUtil.getFrameTimeMonthStringValue(); -// String dayOfMonth = SelectedFrameTimeUtil.getFrameTimeDayOfMonthStringValue(); -// double climatePPNT = getClimatePPNT(stationId.valueString, month, dayOfMonth); -// double finalPP1A = popFcst12Hrs.doubleValue() - climatePPNT; -//// System.out.println("=======, popFcst12Hrs.doubleValue()= "+popFcst12Hrs.doubleValue()); -//// System.out.println("=======, climatePPNT= "+climatePPNT); -//// System.out.println("=======, finalPP1A= "+finalPP1A); -// -// /* -// * pp1a: Probability of precipitation anomaly in a 12-hr period in percentage -// * pp1a = pp12 - ppnt(climate) -// */ -// Amount pp1aAmount = new Amount(finalPP1A, NonSI.PERCENT); -// setValue(pp1aAmount); -// }else -// setValueToMissing(); - return this; - } - - private double getClimatePPNT(String stationId, String month, String day) { - ClimateDataDbAccess climateDataDbAccess = ClimateDataDbAccessManager.getInstance().getClimateDataDbAccess(); - double ppntClimateValue = climateDataDbAccess.getPPNT(stationId, month, day); - return ppntClimateValue; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn24hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn24hrs.java deleted file mode 100644 index 8a2d145b3d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPAnomalyIn24hrs.java +++ /dev/null @@ -1,50 +0,0 @@ -//package gov.noaa.nws.ncep.metparameters; -// -//public class POPAnomalyIn24hr { -// -//} -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccess; -import gov.noaa.nws.ncep.metparameters.dbquery.util.ClimateDataDbAccessManager; - -import javax.measure.unit.NonSI; - -public class POPAnomalyIn24hrs extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - public POPAnomalyIn24hrs(){ - super( UNIT ); - } - - @DeriveMethod - public POPAnomalyIn24hrs derive( POPFcst24Hrs popFcst24Hrs, StationID stationId ) throws InvalidValueException, NullPointerException, InvalidRangeException { -// See ClimDayTemp -// if ( popFcst24Hrs.hasValidValue() && stationId.hasValidValue() ){ -// String month = SelectedFrameTimeUtil.getFrameTimeMonthStringValue(); -// String dayOfMonth = SelectedFrameTimeUtil.getFrameTimeDayOfMonthStringValue(); -// double climatePP24 = getClimatePP24(stationId.valueString, month, dayOfMonth); -// double finalPP2A = popFcst24Hrs.doubleValue() - climatePP24; -//// System.out.println("=======, popFcst24Hrs.doubleValue()= "+popFcst24Hrs.doubleValue()); -//// System.out.println("=======, climatePP24= "+climatePP24); -//// System.out.println("=======, finalPP2A= "+finalPP2A); -// -// /* -// * pp2a: Probability of precipitation anomaly in a 24-hr period in percentage -// * pp2a = pp24 - pp24(climate) -// */ -// Amount pp2aAmount = new Amount(finalPP2A, NonSI.PERCENT); -// setValue(pp2aAmount); -// }else -// setValueToMissing(); - return this; - } - - private double getClimatePP24(String stationId, String month, String day) { - ClimateDataDbAccess climateDataDbAccess = ClimateDataDbAccessManager.getInstance().getClimateDataDbAccess(); - double pp24ClimateValue = climateDataDbAccess.getPP24(stationId, month, day); - return pp24ClimateValue; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst06Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst06Hrs.java deleted file mode 100644 index d0cea4c470..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst06Hrs.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class POPFcst06Hrs extends AbstractMetParameter implements - Dimensionless { - - public POPFcst06Hrs() { - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst12Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst12Hrs.java deleted file mode 100644 index 42a0ff8199..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst12Hrs.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class POPFcst12Hrs extends AbstractMetParameter implements - Dimensionless { - - public POPFcst12Hrs() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst24Hrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst24Hrs.java deleted file mode 100644 index e29d4affd3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/POPFcst24Hrs.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class POPFcst24Hrs extends AbstractMetParameter implements - Dimensionless { - - public POPFcst24Hrs() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindDir.java deleted file mode 100644 index cec232dd5f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindDir.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; - -/** - * @author archana - * - */ - public class PeakWindDir extends AbstractMetParameter implements Angle { - public PeakWindDir ( ){ - super ( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeed.java deleted file mode 100644 index cf19a580cc..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeed.java +++ /dev/null @@ -1,10 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - - public class PeakWindSpeed extends AbstractMetParameter implements Velocity { - public PeakWindSpeed ( ){ - super ( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeedTime.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeedTime.java deleted file mode 100644 index 6d74e701a9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PeakWindSpeedTime.java +++ /dev/null @@ -1,10 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; - - public class PeakWindSpeedTime extends AbstractMetParameter implements Duration { - public PeakWindSpeedTime(){ - super ( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PerpendicularWindComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PerpendicularWindComp.java deleted file mode 100644 index a065d349de..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PerpendicularWindComp.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class PerpendicularWindComp extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public PerpendicularWindComp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( WindDirection wd, WindSpeed ws,WindCompDirection d) throws InvalidValueException, NullPointerException, InvalidRangeException{ - Amount windDrct = PRLibrary.prWnml( wd , ws , d ); - this.setValue(windDrct); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueDirection.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueDirection.java deleted file mode 100644 index ac109baa5b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueDirection.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; - -/** - * @author archana - * - */ - public class PlatformTrueDirection extends AbstractMetParameter implements Angle { - public PlatformTrueDirection(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueSpeed.java deleted file mode 100644 index 55a7cd13a7..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PlatformTrueSpeed.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - -/** - * @author archana - * - */ - public class PlatformTrueSpeed extends AbstractMetParameter implements Velocity { - public PlatformTrueSpeed( ){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTemp.java deleted file mode 100644 index 5300c0a5c2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTemp.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -/** - * @author archana - * - */ - public final class PotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public PotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public PotentialTemp derive( AirTemperature t, PressureLevel p ) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( t.hasValidValue() && p.hasValidValue() ){ - Amount thePotentialTempAmount = PRLibrary.prThta(t, p); - this.setValue(thePotentialTempAmount); - }else - setValueToMissing(); - return this; - } - -//@DeriveMethod -// public PotentialTemp derive( AirTemperature t, SeaLevelPressure p ) throws InvalidRangeException, InvalidValueException, NullPointerException { -// if ( t.hasValidValue() && p.hasValidValue() ){ -// Amount thePotentialTempAmount = PRLibrary.prThta(t, p); -// this.setValue(thePotentialTempAmount); -// }else -// setValueToMissing(); -// return this; -// } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTempLapseRate.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTempLapseRate.java deleted file mode 100644 index 85a0937858..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PotentialTempLapseRate.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PotentialTempLapseRate extends AbstractMetParameter implements - gov.noaa.nws.ncep.metParameters.quantity.RateOfChangeInTemperatureWithHeight { - - public PotentialTempLapseRate(){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip01Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip01Hr.java deleted file mode 100644 index 4eacf615d3..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip01Hr.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Precip01Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip01Hr ( ){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip03Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip03Hr.java deleted file mode 100644 index ac492aa219..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip03Hr.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Precip03Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip03Hr ( ){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip06Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip06Hr.java deleted file mode 100644 index 058b6dbc37..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip06Hr.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Precip06Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip06Hr ( ){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip12Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip12Hr.java deleted file mode 100644 index 15636d4915..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip12Hr.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Precip12Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip12Hr ( ){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip18Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip18Hr.java deleted file mode 100644 index 9fa29f29be..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip18Hr.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -public class Precip18Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip18Hr() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip24Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip24Hr.java deleted file mode 100644 index 00a251fdf0..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precip24Hr.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - - public class Precip24Hr extends AbstractMetParameter implements javax.measure.quantity.Length{ - public Precip24Hr() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterForEntireSounding.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterForEntireSounding.java deleted file mode 100644 index 303ad5ec99..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterForEntireSounding.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PrecipitableWaterForEntireSounding extends AbstractMetParameter - implements Length { - - public PrecipitableWaterForEntireSounding(){ - super( UNIT ); - } - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterUptoSpecifiedLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterUptoSpecifiedLevel.java deleted file mode 100644 index e0b4205f6c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PrecipitableWaterUptoSpecifiedLevel.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PrecipitableWaterUptoSpecifiedLevel extends AbstractMetParameter - implements Length { - - public PrecipitableWaterUptoSpecifiedLevel(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precipitation.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precipitation.java deleted file mode 100644 index 4a922480d2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Precipitation.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; -import javax.measure.unit.NonSI; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class Precipitation extends AbstractMetParameter implements javax.measure.quantity.Length { - - public Precipitation() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveDir.java deleted file mode 100644 index 9895fc2ca9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveDir.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class PredomSwellWaveDir extends AbstractMetParameter - implements Angle { - - public PredomSwellWaveDir() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveHeight.java deleted file mode 100644 index 8f2a7b3a3f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWaveHeight.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class PredomSwellWaveHeight extends AbstractMetParameter implements Length { - - public PredomSwellWaveHeight() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWavePeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWavePeriod.java deleted file mode 100644 index 7b1977b69d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PredomSwellWavePeriod.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PredomSwellWavePeriod extends AbstractMetParameter implements Duration { - - public PredomSwellWavePeriod() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PresentWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PresentWeather.java deleted file mode 100644 index db94d2d77e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PresentWeather.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PresentWeather extends AbstractMetParameter implements Dimensionless { - - // The SkyCoverage enum value is stored as a String. -// @Override -// public Boolean hasStringValue() { -// return true; -// } -// - public PresentWeather() { - super( UNIT ); - setValueIsString(); - } - - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange24Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange24Hr.java deleted file mode 100644 index 6aa22c39fc..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange24Hr.java +++ /dev/null @@ -1,17 +0,0 @@ - package gov.noaa.nws.ncep.metparameters; - import javax.measure.unit.Unit; - import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; - import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PressChange24Hr extends AbstractMetParameter implements - javax.measure.quantity.Pressure { - public PressChange24Hr() { - super( UNIT ); - } - - } - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange3Hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange3Hr.java deleted file mode 100644 index 73f38d08f5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressChange3Hr.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - - import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; - import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class PressChange3Hr extends AbstractMetParameter implements - javax.measure.quantity.Pressure { - public PressChange3Hr() { - super( UNIT ); - } - - } - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressTendency.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressTendency.java deleted file mode 100644 index 3d7064ef68..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressTendency.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - - -/** - * @author archana - * - */ -public class PressTendency extends AbstractMetParameter implements - Dimensionless { - - public PressTendency() { - super( UNIT ); - setValueIsString(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressureLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressureLevel.java deleted file mode 100644 index eec645c85b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/PressureLevel.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -// This parameter is intended to be used as a Vertical Coordinate. -// - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class PressureLevel extends AbstractMetParameter implements -javax.measure.quantity.Pressure { - public PressureLevel() { - super( UNIT ); - } -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RateOfIceAccretionOnVesselInSaltWater.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RateOfIceAccretionOnVesselInSaltWater.java deleted file mode 100644 index c956d04083..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RateOfIceAccretionOnVesselInSaltWater.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -public class RateOfIceAccretionOnVesselInSaltWater extends AbstractMetParameter implements javax.measure.quantity.Velocity { - - public RateOfIceAccretionOnVesselInSaltWater() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive( AirTemperature airTemp, SeaSurfaceTemp seaTemp, WindSpeed ws ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( airTemp.hasValidValue() && seaTemp.hasValidValue() && ws.hasValidValue() ){ - Amount val = PRLibrary.prIgro(airTemp, seaTemp, ws ); - setValue(val); - }else - setValueToMissing(); - - return this; - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RelativeHumidity.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RelativeHumidity.java deleted file mode 100644 index 9e9cdbd16c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RelativeHumidity.java +++ /dev/null @@ -1,43 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.management.DescriptorKey; -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.NonSI; -import javax.measure.unit.Unit; - -// -public class RelativeHumidity extends AbstractMetParameter implements Dimensionless { - - public RelativeHumidity( ) { - super( UNIT ); - } - - protected AbstractMetParameter create( Amount val ) { - RelativeHumidity p = new RelativeHumidity(); - p.setValue( val ); - return p; - } - - @Override - public boolean isUnitCompatible( Unit u) { - return UNIT.isCompatible( u ); - } - - @DeriveMethod - public RelativeHumidity derive( AirTemperature t, DewPointTemp d ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() && d.hasValidValue() ){ - Amount theRelhAmount = PRLibrary.prRelh(t, d); - this.setValue(theRelhAmount); - } else - this.setValueToMissing(); - - return this; - } -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RichardsonNumber.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RichardsonNumber.java deleted file mode 100644 index 4333e1dee5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/RichardsonNumber.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class RichardsonNumber extends AbstractMetParameter implements - Dimensionless { - - public RichardsonNumber(){ - super( UNIT ); - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatEquivPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatEquivPotentialTemp.java deleted file mode 100644 index c64620116c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatEquivPotentialTemp.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class SatEquivPotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public SatEquivPotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public SatEquivPotentialTemp derive( PressureLevel p, AirTemperature t, AirTemperature t2 ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( p.hasValidValue() && t.hasValidValue() && t2.hasValidValue() ){ - Amount theEquivPotTempAmount = PRLibrary.prThte(p, t, t2); - setValue(theEquivPotTempAmount); - }else - setValueToMissing(); - return this; - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatMixingRatio.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatMixingRatio.java deleted file mode 100644 index 03c15cd069..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatMixingRatio.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - /** - * @author archana - * - */ -public final class SatMixingRatio extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - public SatMixingRatio(){ - super( UNIT ); - } - - @DeriveMethod - public SatMixingRatio derive ( DewPointTemp d , PressureLevel p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( d.hasValidValue() && p.hasValidValue() ){ - Amount mixingRatio = PRLibrary.prMixr( d, p ); - setValue(mixingRatio); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatVaporPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatVaporPressure.java deleted file mode 100644 index 24bc1cdf7d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SatVaporPressure.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class SatVaporPressure extends AbstractMetParameter implements -javax.measure.quantity.Pressure { - public SatVaporPressure() { - super( UNIT ); - } - - @DeriveMethod - public SatVaporPressure derive( AirTemperature t ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( t.hasValidValue() ){ - Amount vaporPresAmount = PRLibrary.prVapr( t ); - this.setValue(vaporPresAmount); - }else - setValueToMissing(); - return this; - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaIceDriftDist.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaIceDriftDist.java deleted file mode 100644 index c9f0778997..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaIceDriftDist.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class SeaIceDriftDist extends AbstractMetParameter - implements Length { - - public SeaIceDriftDist(){ - super( UNIT ); - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaLevelPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaLevelPressure.java deleted file mode 100644 index 80d6ddb7be..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaLevelPressure.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.NonSI; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.NcUnits; - - - public class SeaLevelPressure extends AbstractMetParameter implements - javax.measure.quantity.Pressure { - - public SeaLevelPressure() { - super( UNIT ); - } - - @Override - public String getFormattedString(String formatStr) { - - if( formatStr == null || formatStr.isEmpty() || - formatStr.startsWith("%" ) ) { - return super.getFormattedString( formatStr ); - } - - else if ( ( formatStr.compareToIgnoreCase("RSLT") == 0 ) - || (formatStr.compareToIgnoreCase("SALT") == 0 )){ - double newPresValInMb = Double.NaN; - if ( ( this.getUnit().toString().compareTo("mb") != 0 ) ){ - double oldPresVal = this.value.doubleValue(); - newPresValInMb = this.getUnit() - .getConverterTo( NcUnits.MILLIBAR ) - .convert( oldPresVal ) ; - //setValue(new Amount ( newPresValInMb, NcUnits.MILLIBAR )); - } - - double abbrevPressVal = ( newPresValInMb % 100 ) * 10; - Integer abbrevpressValAsInt = new Integer ( ( int ) abbrevPressVal ); - String abbrevPressureString = abbrevpressValAsInt.toString(); - return abbrevPressureString; - } - - else if ( ( formatStr.compareToIgnoreCase("RSLI") == 0 ) - || (formatStr.compareToIgnoreCase("SALI") == 0 )){ - - double newPresValInMb = Double.NaN; - if ( ( this.getUnit().toString().compareTo("inHg") != 0 ) ){ - double oldPresVal = this.value.doubleValue(); - newPresValInMb = this.getUnit() - .getConverterTo( NonSI.INCH_OF_MERCURY ) - .convert( oldPresVal ) ; - //setValue(new Amount ( newPresValInMb, NonSI.INCH_OF_MERCURY )); - } - - double abbrevPressVal = ( newPresValInMb % 10 ) * 100; - Integer abbrevpressValAsInt = new Integer ( ( int ) abbrevPressVal ); - String abbrevPressureString = abbrevpressValAsInt.toString(); - - if ( abbrevPressureString.length() == 1 ){ - abbrevPressureString = new String ( "00" + abbrevPressureString); - } - if ( abbrevPressureString.length() == 2 ){ - abbrevPressureString = new String ( "0" + abbrevPressureString); - } - - return abbrevPressureString; - } - - else - return super.getFormattedString( formatStr ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaSurfaceTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaSurfaceTemp.java deleted file mode 100644 index 6b93a10089..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SeaSurfaceTemp.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class SeaSurfaceTemp extends AbstractMetParameter implements - Temperature { - - public SeaSurfaceTemp() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveDir.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveDir.java deleted file mode 100644 index 3b814cf899..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveDir.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; -import javax.measure.unit.Unit; - - public class SecondarySwellWaveDir extends AbstractMetParameter - implements Angle { - - public SecondarySwellWaveDir() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveHeight.java deleted file mode 100644 index 4a9319502f..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWaveHeight.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class SecondarySwellWaveHeight extends AbstractMetParameter implements Length { - - public SecondarySwellWaveHeight() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWavePeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWavePeriod.java deleted file mode 100644 index 506466b18d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SecondarySwellWavePeriod.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class SecondarySwellWavePeriod extends AbstractMetParameter implements Duration { - - public SecondarySwellWavePeriod() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipCourse.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipCourse.java deleted file mode 100644 index 4d652a7f30..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipCourse.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Angle; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class ShipCourse extends - AbstractMetParameter implements Angle { - - public ShipCourse() { - super( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipIceThickness.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipIceThickness.java deleted file mode 100644 index 34c890c968..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShipIceThickness.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class ShipIceThickness extends AbstractMetParameter - implements Length { - - public ShipIceThickness() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShowalterIndex.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShowalterIndex.java deleted file mode 100644 index cfbd79b726..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/ShowalterIndex.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class ShowalterIndex extends AbstractMetParameter implements - Dimensionless { - - public ShowalterIndex(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SkyCoverage.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SkyCoverage.java deleted file mode 100644 index a0789c9cb5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SkyCoverage.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import java.util.HashMap; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class SkyCoverage extends AbstractMetParameter implements Dimensionless { - - // The SkyCoverage enum value is stored as a String. -// @Override -// public Boolean hasStringValue() { -// return true; -// } -// - public SkyCoverage() { - super( UNIT ); - setValueIsString(); - } - - -// @DeriveMethod -// public AbstractMetParameter determineFromCloudCover( CloudCover[] cldCoverList ) { -// // TODO : what is the default "", "CLR" -// if( cldCoverList == null || cldCoverList.length == 0 ) { -// setStringValue("BLNK"); -// return this; -// } -// -// // TODO : Raytheon reads the cloud_select.txt file to determine the 'rankedField' -// // but here we'll just encode the rules for determining the skyCoverage from the -// // various cloud coverages. -// // -// for( CloudCover cldCov : cldCoverList ) { -// -// } -// -// setStringValue("CLR"); -// -// return this; -// } - - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowDepth.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowDepth.java deleted file mode 100644 index 61bafa1e10..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowDepth.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class SnowDepth extends AbstractMetParameter implements Length { - - public SnowDepth(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowIcePelletWatchThresh.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowIcePelletWatchThresh.java deleted file mode 100644 index 258caa233b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SnowIcePelletWatchThresh.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ -public class SnowIcePelletWatchThresh extends AbstractMetParameter - implements Length { - - public SnowIcePelletWatchThresh(){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpecificHumidity.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpecificHumidity.java deleted file mode 100644 index 668e40e904..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpecificHumidity.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * - * @author archana - * - */ -public class SpecificHumidity extends AbstractMetParameter implements Dimensionless { - - protected SpecificHumidity() { - super(UNIT); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpeedOf05SecPeakWind.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpeedOf05SecPeakWind.java deleted file mode 100644 index 889eb455b9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SpeedOf05SecPeakWind.java +++ /dev/null @@ -1,20 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class SpeedOf05SecPeakWind extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public SpeedOf05SecPeakWind(){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StabilityWithRespectToPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StabilityWithRespectToPressure.java deleted file mode 100644 index d2ea0964bc..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StabilityWithRespectToPressure.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -import gov.noaa.nws.ncep.metParameters.quantity.RateOfChangeInTemperatureWithPressure; - -public class StabilityWithRespectToPressure extends AbstractMetParameter - implements RateOfChangeInTemperatureWithPressure { - - public StabilityWithRespectToPressure(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationElevation.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationElevation.java deleted file mode 100644 index 8299beff20..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationElevation.java +++ /dev/null @@ -1,95 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import java.util.List; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -import com.raytheon.uf.viz.core.catalog.DirectDbQuery; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; -import com.raytheon.uf.viz.core.exception.VizException; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class StationElevation extends AbstractMetParameter implements javax.measure.quantity.Length { - - public StationElevation() { - super( UNIT ); - } - -// // TODO : not implemented, hard code to test derived parameters -// @DeriveMethod -// AbstractMetParameter derive( StationID sid ) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// if( sid.hasValidValue() ) { -// -// -// } -// -// this.setValue( 10, SI.METER ); -// -// return this; -// } - - // TODO : check that this is stationPressure is correct here - @DeriveMethod - AbstractMetParameter derive( SeaLevelPressure alti, SurfacePressure pres ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( alti.hasValidValue() && pres.hasValidValue() ){ - Amount val = PRLibrary.prZalt(alti, pres ); - setValue(val); - }else - setValueToMissing(); - return this; - } - - @DeriveMethod - AbstractMetParameter derive( StationID sid ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - // TODO : look up the lat from the station name. - // this.setValue(val); - - StringBuilder query = new StringBuilder("select elevation from "); - query.append("obs "); - query.append("where stationid = '"); - query.append(sid.getStringValue()); - query.append("' "); - query.append(" and reporttype = 'METAR';"); - try { - List results = DirectDbQuery.executeQuery(query.toString(), "metadata", QueryLanguage.SQL); - if(results != null && results.size() > 0){ - - Object[] theObjectArray = results.get(0); - Integer selv = ( Integer ) theObjectArray[0]; - setValue(new Amount ( selv, SI.METER ) ) ; - - } - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return this; - } - - - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationID.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationID.java deleted file mode 100644 index d6bee97434..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationID.java +++ /dev/null @@ -1,53 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class StationID extends AbstractMetParameter implements Dimensionless { - - // StationName is a String and so the Amount value does not apply -// @Override -// public Boolean hasStringValue() { -// return true; -// } - - public StationID() { - super( UNIT ); - setValueIsString(); - } - -// // NOT Implemented. Just enough to execute and return something -// @DeriveMethod -// public AbstractMetParameter getStationIdFromName( StationName stnName ) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// this.setStringValue(stnName.getStringValue() ); -// return this; -// } - - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLatitude.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLatitude.java deleted file mode 100644 index 87a72b8f5e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLatitude.java +++ /dev/null @@ -1,66 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import java.util.List; - -import javax.measure.unit.NonSI; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; -import com.raytheon.uf.viz.core.exception.VizException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import gov.noaa.nws.ncep.metparameters.Amount; - - public class StationLatitude extends AbstractMetParameter - implements javax.measure.quantity.Angle { - - public StationLatitude() { - super( UNIT ); - } - -// @DeriveMethod -// AbstractMetParameter derive( StationID sid ) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// // TODO : look up the lat from the station name. -// // this.setValue(val); -// -// StringBuilder query = new StringBuilder("select latitude from "); -// query.append("sfcobs "); -// query.append("where stationid = '"); -// query.append(sid.getStringValue()); -// query.append("'; "); -// try { -// List results = DirectDbQuery.executeQuery(query.toString(), "metadata", QueryLanguage.SQL); -// if(results != null && results.size() > 0){ -// for( Object[] theObjectArray : results ){ -// Double latitude = ( Double ) theObjectArray[0]; -// this.setValue(new Amount ( latitude, NonSI.DEGREE_ANGLE ) ) ; -// } -// } -// } catch (VizException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } -// return this; -// } - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLongitude.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLongitude.java deleted file mode 100644 index 0e83e89996..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationLongitude.java +++ /dev/null @@ -1,69 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import java.util.List; - -import javax.measure.unit.NonSI; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; -import com.raytheon.uf.viz.core.exception.VizException; - -import gov.noaa.nws.ncep.metparameters.Amount; - - - public class StationLongitude extends AbstractMetParameter - implements javax.measure.quantity.Angle { - - public StationLongitude() { - super( UNIT ); - } - -// @DeriveMethod -// AbstractMetParameter derive( StationID sid ) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// // TODO : look up the long from the station name. -// // this.setValue(val); -// StringBuilder query = new StringBuilder("select longitude from "); -// query.append("sfcobs "); -// query.append("where stationid = '"); -// query.append(sid.getStringValue()); -// query.append("'; "); -// try { -// List results = DirectDbQuery.executeQuery(query.toString(), "metadata", QueryLanguage.SQL); -// if(results != null && results.size() > 0){ -// for( Object[] theObjectArray : results ){ -// Double longitude = ( Double ) theObjectArray[0]; -// this.setValue(new Amount ( longitude, NonSI.DEGREE_ANGLE ) ) ; -// } -// } -// } catch (VizException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } -// return this; -// } - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationName.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationName.java deleted file mode 100644 index b6309ba427..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StationName.java +++ /dev/null @@ -1,48 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class StationName extends AbstractMetParameter implements Dimensionless { - - // StationName is a String and so the Amount value does not apply - public StationName() { - super( UNIT ); - setValueIsString(); - } - - // NOT Implemented. Just enough to execute and return something - @DeriveMethod - public AbstractMetParameter getStationNameFromID( StationID stnId ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - this.setStringValue(stnId.getStringValue() ); - return this; - } - - } - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StormMotionSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StormMotionSpeed.java deleted file mode 100644 index 1787e88697..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/StormMotionSpeed.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - - public class StormMotionSpeed extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public StormMotionSpeed(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( EstStormDirectionUComp u, EstStormDirectionVComp v ) throws InvalidValueException, NullPointerException{ - if ( u.hasValidValue() && v.hasValidValue() ){ - Amount val = PRLibrary.prSped( u, v ); - setValue ( val ); - }else - setValueToMissing(); - return this; - } -} - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SunshineDuration.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SunshineDuration.java deleted file mode 100644 index be9c24e7ef..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SunshineDuration.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class SunshineDuration extends AbstractMetParameter implements Duration { - - public SunshineDuration(){ - super( UNIT ); - } - - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceEquivPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceEquivPotentialTemp.java deleted file mode 100644 index 7dc935cadb..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceEquivPotentialTemp.java +++ /dev/null @@ -1,30 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.SI; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class SurfaceEquivPotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public SurfaceEquivPotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public SurfaceEquivPotentialTemp derive( SurfacePressure p, AirTemperature t, DewPointTemp dpt ) throws InvalidValueException, NullPointerException, InvalidRangeException { - - - if ( p.hasValidValue() && t.hasValidValue() && dpt.hasValidValue() ){ - Amount theEquivPotTempAmount = PRLibrary.prThte( p, t, dpt ); - this.setValue(theEquivPotTempAmount); - } - else - setValueToMissing(); - return this; - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceMixingRatio.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceMixingRatio.java deleted file mode 100644 index 407f0b45d2..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceMixingRatio.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - - -import javax.measure.quantity.Dimensionless; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - /** - * @author archana - * - */ -public final class SurfaceMixingRatio extends AbstractMetParameter implements Dimensionless { - - public SurfaceMixingRatio(){ - super( UNIT ); - } - - @DeriveMethod - public SurfaceMixingRatio derive ( DewPointTemp d , SurfacePressure p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( d.hasValidValue() && p.hasValidValue() ){ - Amount mixingRatio = PRLibrary.prMixr( d, p ); - setValue(mixingRatio); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePotentialTemp.java deleted file mode 100644 index 58df84321c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePotentialTemp.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.SI; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -/** - * @author archana - * - */ -public final class SurfacePotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public SurfacePotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public SurfacePotentialTemp derive( AirTemperature t, SurfacePressure p ) throws InvalidRangeException, InvalidValueException, NullPointerException { - - - if ( t.hasValidValue() && p.hasValidValue() ){ - Amount thePotentialTempAmount = PRLibrary.prThta(t, p); - this.setValue(thePotentialTempAmount); - }else - setValueToMissing(); - return this; - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePressure.java deleted file mode 100644 index b659c5af9a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfacePressure.java +++ /dev/null @@ -1,41 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -// This can also be used to represent a StationPressure. -// -public class SurfacePressure extends AbstractMetParameter implements javax.measure.quantity.Pressure { - public SurfacePressure(){ - super( UNIT ); - } - - // TODO : check if this is correct. -// @DeriveMethod -// AbstractMetParameter derive( AirTemperature tmpc, PotentialTemp thta) -// throws InvalidValueException, NullPointerException, InvalidRangeException{ -// if ( tmpc.hasValidValue() && thta.hasValidValue() ){ -// Amount val = PRLibrary.prPres(tmpc, thta ); -// setValue ( val ); -// }else -// setValueToMissing(); -// return this; -// } - - @DeriveMethod - AbstractMetParameter derive( SeaLevelPressure altm, StationElevation selv ) - throws InvalidValueException, NullPointerException, InvalidRangeException { - - if( altm.hasValidValue() && selv.hasValidValue() ) { - - Amount val = PRLibrary.prPalt ( altm, selv ); - this.setValue( val ); - } - else { - this.setValueToMissing(); - } - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatEquivPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatEquivPotentialTemp.java deleted file mode 100644 index 3a80f79e83..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatEquivPotentialTemp.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class SurfaceSatEquivPotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - public SurfaceSatEquivPotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - public SurfaceSatEquivPotentialTemp derive( SurfacePressure p, AirTemperature t, AirTemperature t2 ) throws InvalidValueException, NullPointerException, InvalidRangeException { - if ( p.hasValidValue() && t.hasValidValue() && t2.hasValidValue() ){ - Amount theEquivPotTempAmount = PRLibrary.prThte( p, t, t2 ); - setValue(theEquivPotTempAmount); - }else - setValueToMissing(); - - return this; - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatMixingRatio.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatMixingRatio.java deleted file mode 100644 index f2dccc206d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/SurfaceSatMixingRatio.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -/** - * @author archana - * - */ - public final class SurfaceSatMixingRatio extends AbstractMetParameter implements javax.measure.quantity.Dimensionless { - - public SurfaceSatMixingRatio(){ - super( UNIT ); - } - - @DeriveMethod - public SurfaceSatMixingRatio derive ( AirTemperature t , SurfacePressure p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( t.hasValidValue() && p.hasValidValue() ){ - Amount mixingRatio = PRLibrary.prMixr( t, p ); - setValue(mixingRatio); - } - else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TempLapseRate.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TempLapseRate.java deleted file mode 100644 index 66dd9aed1e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TempLapseRate.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - - - public class TempLapseRate extends AbstractMetParameter implements - gov.noaa.nws.ncep.metParameters.quantity.RateOfChangeInTemperatureWithHeight { - - public TempLapseRate(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryCeilingAsMeanSeaLevel.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryCeilingAsMeanSeaLevel.java deleted file mode 100644 index 2d0eea3d2e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryCeilingAsMeanSeaLevel.java +++ /dev/null @@ -1,40 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -public class TemporaryCeilingAsMeanSeaLevel extends AbstractMetParameter implements Length { - - public TemporaryCeilingAsMeanSeaLevel() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( TemporaryOrProbabilityCeiling c, StationElevation se) throws InvalidValueException, NullPointerException{ - if ( c.hasValidValue() && se.hasValidValue() ){ - Amount val = PRLibrary.prCmsl( c, se ); - setValue ( val ); - }else - setValueToMissing(); - return this; - } -} - - - - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityCeiling.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityCeiling.java deleted file mode 100644 index bd941cfbcb..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityCeiling.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class TemporaryOrProbabilityCeiling extends AbstractMetParameter implements Length { - - public TemporaryOrProbabilityCeiling() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityFlightRuleIdentifier.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityFlightRuleIdentifier.java deleted file mode 100644 index b69a6806ae..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityFlightRuleIdentifier.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class TemporaryOrProbabilityFlightRuleIdentifier extends AbstractMetParameter - implements Dimensionless { - - public TemporaryOrProbabilityFlightRuleIdentifier() { - super( UNIT ); - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityMountainObscThreshMetIndicator.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityMountainObscThreshMetIndicator.java deleted file mode 100644 index b128fdcedd..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityMountainObscThreshMetIndicator.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Dimensionless; - - -public class TemporaryOrProbabilityMountainObscThreshMetIndicator extends - AbstractMetParameter implements Dimensionless { - - public TemporaryOrProbabilityMountainObscThreshMetIndicator() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( TemporaryCeilingAsMeanSeaLevel tcms, MountainObscThresh motv) throws InvalidValueException, NullPointerException{ - if( tcms.hasValidValue() && motv.hasValidValue() ){ - Amount val = PRLibrary.prMobs(tcms, motv ); - setValue ( val ); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityVisibility.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityVisibility.java deleted file mode 100644 index 3f2b43f649..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityVisibility.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TemporaryOrProbabilityVisibility extends AbstractMetParameter - implements Length { - - public TemporaryOrProbabilityVisibility(){ - super( UNIT ); - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindDirection.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindDirection.java deleted file mode 100644 index 8332c0bcbc..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindDirection.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class TemporaryOrProbabilityWindDirection extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public TemporaryOrProbabilityWindDirection() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( WindDirectionUComp u, WindDirectionVComp v) throws InvalidValueException, NullPointerException{ - if ( u.hasValidValue() && v.hasValidValue() ){ - Amount windDrct = PRLibrary.prDrct( u , v ); - setValue(windDrct); - }else - setValueToMissing(); - return this; - } - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindGust.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindGust.java deleted file mode 100644 index cdff5d1afe..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindGust.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TemporaryOrProbabilityWindGust extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public TemporaryOrProbabilityWindGust() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindSpeed.java deleted file mode 100644 index 816c69b318..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TemporaryOrProbabilityWindSpeed.java +++ /dev/null @@ -1,20 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TemporaryOrProbabilityWindSpeed extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public TemporaryOrProbabilityWindSpeed(){ - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInHrs.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInHrs.java deleted file mode 100644 index 5531ed180c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInHrs.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class TimeOf5SecPeakWindInHrs extends AbstractMetParameter implements Duration { - - public TimeOf5SecPeakWindInHrs(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInMins.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInMins.java deleted file mode 100644 index 4459c0cb40..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TimeOf5SecPeakWindInMins.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class TimeOf5SecPeakWindInMins extends AbstractMetParameter implements Duration { - - public TimeOf5SecPeakWindInMins(){ - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfIcing.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfIcing.java deleted file mode 100644 index 7bb765f6f5..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfIcing.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TopOfIcing extends AbstractMetParameter - implements Length { - - public TopOfIcing() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfTurbulence.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfTurbulence.java deleted file mode 100644 index a2e830ee40..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfTurbulence.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TopOfTurbulence extends AbstractMetParameter - implements Length { - - public TopOfTurbulence() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfWeather.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfWeather.java deleted file mode 100644 index 74d7061c46..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TopOfWeather.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class TopOfWeather extends AbstractMetParameter - implements Length { - - public TopOfWeather() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceFrequencySymbol.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceFrequencySymbol.java deleted file mode 100644 index f16a3c3a7b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceFrequencySymbol.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class TurbulenceFrequencySymbol extends AbstractMetParameter implements - Dimensionless { - - public TurbulenceFrequencySymbol() { - super(UNIT); - setValueIsString(); - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceIntensitySymbol.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceIntensitySymbol.java deleted file mode 100644 index 59b29771ac..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/TurbulenceIntensitySymbol.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class TurbulenceIntensitySymbol extends AbstractMetParameter implements - Dimensionless { - - public TurbulenceIntensitySymbol() { - super(UNIT); - setValueIsString(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms12hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms12hr.java deleted file mode 100644 index c3eef3c0e7..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms12hr.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class UncondProbOfTstorms12hr extends AbstractMetParameter implements - Dimensionless { - - public UncondProbOfTstorms12hr() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms24hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms24hr.java deleted file mode 100644 index aa0ac49678..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms24hr.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class UncondProbOfTstorms24hr extends AbstractMetParameter implements - Dimensionless { - - public UncondProbOfTstorms24hr() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms2hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms2hr.java deleted file mode 100644 index 746f5f829a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms2hr.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class UncondProbOfTstorms2hr extends AbstractMetParameter implements - Dimensionless { - - public UncondProbOfTstorms2hr() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms6hr.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms6hr.java deleted file mode 100644 index f5abdf2c3c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/UncondProbOfTstorms6hr.java +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -/** - * @author archana - * - */ - public class UncondProbOfTstorms6hr extends AbstractMetParameter implements - Dimensionless { - - public UncondProbOfTstorms6hr() { - super( UNIT ); - } - - } \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VaporPressure.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VaporPressure.java deleted file mode 100644 index 683429841c..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VaporPressure.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class VaporPressure extends AbstractMetParameter implements -javax.measure.quantity.Pressure { - public VaporPressure() { - super( UNIT ); - } - - @DeriveMethod - public VaporPressure derive( DewPointTemp d ) throws InvalidValueException, NullPointerException, InvalidRangeException { - - if ( d.hasValidValue() ){ - Amount vaporPresAmount = PRLibrary.prVapr( d ); - setValue(vaporPresAmount); - }else - setValueToMissing(); - - return this; - } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VerticalVelocity.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VerticalVelocity.java deleted file mode 100644 index d132c939ee..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VerticalVelocity.java +++ /dev/null @@ -1,17 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Velocity; - -/** - * - * @author archana - * - */ -public class VerticalVelocity extends AbstractMetParameter implements Velocity { - - protected VerticalVelocity() { - super(UNIT); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualPotentialTemp.java deleted file mode 100644 index f937cc1a25..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualPotentialTemp.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.quantity.Temperature; -import javax.measure.unit.Unit; - -/** - * @author archana - * - */ -public class VirtualPotentialTemp extends AbstractMetParameter implements - Temperature { - - public VirtualPotentialTemp() { - super( UNIT ); - } - - -// @DeriveMethod -// AbstractMetParameter derive(VirtualTemp v, SurfacePressure s ) throws InvalidRangeException, InvalidValueException, NullPointerException{ -// if ( v.hasValidValue() && s.hasValidValue() ){ -// Amount val = PRLibrary.prThta( v, s ) ; -// setValue ( val ); -// }else -// setValueToMissing(); -// return this; -// } - - @DeriveMethod - AbstractMetParameter derive(VirtualTemp v, PressureLevel p ) throws InvalidRangeException, InvalidValueException, NullPointerException{ - Amount val = PRLibrary.prThta( v , p ) ; - setValue ( val ); - return this; - } - -} - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualTemp.java deleted file mode 100644 index 214313c028..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/VirtualTemp.java +++ /dev/null @@ -1,42 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class VirtualTemp extends AbstractMetParameter implements -javax.measure.quantity.Temperature{ - - public VirtualTemp(){ - super( UNIT ); - } - - //TODO test this to see if the name of the derive method can be anything other than 'derive' - @DeriveMethod - public VirtualTemp computeVirtualTemp(AirTemperature t, DewPointTemp d, PressureLevel p) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if (t.hasValidValue() && d.hasValidValue() && p.hasValidValue() ){ - Amount virtualTempAmount = PRLibrary.prTvrk(t, d, p); - setValue(virtualTempAmount); - }else - setValueToMissing(); - - return this; - } - -// @DeriveMethod -// public VirtualTemp computeVirtualTemp(AirTemperature t, DewPointTemp d, SurfacePressure p) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// if (t.hasValidValue() && d.hasValidValue() && p.hasValidValue() ){ -// Amount virtualTempAmount = PRLibrary.prTvrk(t, d, p); -// setValue(virtualTempAmount); -// }else -// setValueToMissing(); -// -// return this; -// } - - - } - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Visibility.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Visibility.java deleted file mode 100644 index 333a0542af..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/Visibility.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class Visibility extends AbstractMetParameter implements - javax.measure.quantity.Length { - - public Visibility() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaterEquivOfNewSnow.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaterEquivOfNewSnow.java deleted file mode 100644 index d4f5753987..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaterEquivOfNewSnow.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class WaterEquivOfNewSnow extends AbstractMetParameter implements Length { - - public WaterEquivOfNewSnow(){ - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveHeight.java deleted file mode 100644 index 52f45ebd3d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveHeight.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class WaveHeight extends AbstractMetParameter implements Length { - - public WaveHeight() { - super( UNIT ); - } -} - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WavePeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WavePeriod.java deleted file mode 100644 index f9a63d0e44..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WavePeriod.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - - public class WavePeriod extends AbstractMetParameter implements Duration { - - public WavePeriod() { - super( UNIT ); - } - - } diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveSteepness.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveSteepness.java deleted file mode 100644 index b8608d3857..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WaveSteepness.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Dimensionless; - -/** - * @author archana - * - */ -public class WaveSteepness extends AbstractMetParameter implements - Dimensionless { - public WaveSteepness( ){ - super ( UNIT ); - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbPotentialTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbPotentialTemp.java deleted file mode 100644 index 4f5351941b..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbPotentialTemp.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class WetBulbPotentialTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public WetBulbPotentialTemp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive (PressureLevel p, AirTemperature t, DewPointTemp d ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - if ( p.hasValidValue() && t.hasValidValue() && d.hasValidValue() ){ - Amount val = PRLibrary.prThwc(p, t, d ); - setValue(val); - } - else - setValueToMissing(); - - return this; - } - -// AbstractMetParameter derive (SurfacePressure p, AirTemperature t, DewPointTemp d ) throws InvalidValueException, NullPointerException, InvalidRangeException{ -// Amount val = PRLibrary.prThwc(p, t, d ); -// this.setValue(val); -// return this; -// } - -} - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbTemp.java deleted file mode 100644 index 6f092be069..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WetBulbTemp.java +++ /dev/null @@ -1,58 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class WetBulbTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public WetBulbTemp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( AirTemperature t, MixingRatio m, PressureLevel p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - - if ( t.hasValidValue() && m.hasValidValue() && p.hasValidValue() ){ - Amount val = PRLibrary.prTmwb(t, m, p ); - setValue(val); - }else - setValueToMissing(); - - return this; - } - - @DeriveMethod - AbstractMetParameter derive ( AirTemperature t, SurfaceMixingRatio m, SurfacePressure p ) throws InvalidValueException, NullPointerException, InvalidRangeException{ - - if ( t.hasValidValue() && m.hasValidValue() && p.hasValidValue() ){ - Amount val = PRLibrary.prTmwb(t, m, p ); - setValue(val); - }else - setValueToMissing(); - - return this; - } - -} - - - - - - - - - - - - - - - - - diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillEquivalentTemp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillEquivalentTemp.java deleted file mode 100644 index b61928c548..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillEquivalentTemp.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class WindChillEquivalentTemp extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public WindChillEquivalentTemp( ) { - super( UNIT ); - } - - @DeriveMethod - public WindChillEquivalentTemp derive( AirTemperature t, WindSpeed ws) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( t.hasValidValue() && ws.hasValidValue() ){ - Amount tempAmount = PRLibrary.prWcht(t, ws); - setValue(tempAmount); - } - else - setValueToMissing(); - - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillTemperature.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillTemperature.java deleted file mode 100644 index 2137c2b1b6..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindChillTemperature.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidRangeException; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class WindChillTemperature extends AbstractMetParameter implements - javax.measure.quantity.Temperature { - - public WindChillTemperature( ) { - super( UNIT ); - } - - @DeriveMethod - public WindChillTemperature derive( AirTemperature t, WindSpeed ws) throws InvalidRangeException, InvalidValueException, NullPointerException { - if ( t.hasValidValue() && ws.hasValidValue() ){ - Amount tempAmount = PRLibrary.prWceq( t, ws); - setValue(tempAmount); - }else - setValueToMissing(); - - return this; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindCompDirection.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindCompDirection.java deleted file mode 100644 index efa7d2a76d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindCompDirection.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class WindCompDirection extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public WindCompDirection() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirection.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirection.java deleted file mode 100644 index dfebb38c3e..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirection.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class WindDirection extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public WindDirection() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( WindDirectionUComp u, WindDirectionVComp v) throws InvalidValueException, NullPointerException{ - if ( u.hasValidValue() && v.hasValidValue() ){ - Amount windDrct = PRLibrary.prDrct( u , v ); - setValue(windDrct); - }else - setValueToMissing(); - - return this; - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionUComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionUComp.java deleted file mode 100644 index 69992e8a3a..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionUComp.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -public class WindDirectionUComp extends AbstractMetParameter implements javax.measure.quantity.Velocity{ - - public WindDirectionUComp() { - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive( WindSpeed w, WindDirection d ) throws InvalidValueException, NullPointerException{ - if ( w.hasValidValue() && d.hasValidValue()){ - Amount uWnd = PRLibrary.prUwnd( w, d ); - setValue( uWnd ); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionVComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionVComp.java deleted file mode 100644 index bd4a1b966d..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindDirectionVComp.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class WindDirectionVComp extends AbstractMetParameter implements javax.measure.quantity.Velocity{ - - public WindDirectionVComp(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive( WindSpeed w, WindDirection d ) throws InvalidValueException, NullPointerException{ - if ( w.hasValidValue() && d.hasValidValue()){ - Amount vWnd = PRLibrary.prVwnd( w, d ); - setValue( vWnd ); - }else - setValueToMissing(); - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindGust.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindGust.java deleted file mode 100644 index 06eac3cc64..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindGust.java +++ /dev/null @@ -1,20 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class WindGust extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public WindGust() { - super( UNIT ); - } - -// @DeriveMethod -// public AbstractMetParameter getWindSpeedFromGustBarb( GustBarb gb ) { -// return gb.getWindGust(); -// } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeed.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeed.java deleted file mode 100644 index 78ec79d3da..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeed.java +++ /dev/null @@ -1,32 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - -import javax.measure.unit.Unit; - - public class WindSpeed extends AbstractMetParameter implements - javax.measure.quantity.Velocity { - - public WindSpeed(){ - super( UNIT ); - } - - @DeriveMethod - AbstractMetParameter derive ( WindDirectionUComp u, WindDirectionVComp v ) throws InvalidValueException, NullPointerException{ - if ( u.hasValidValue() && v.hasValidValue() ){ - Amount val = PRLibrary.prSped( u, v ); - setValue ( val ); - }else - setValueToMissing(); - - return this; - } -// @DeriveMethod -// public AbstractMetParameter getWindSpeedFromWindBarb( WindBarb wb ) { -// return wb.getWindSpeed(); -// } -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeedComp.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeedComp.java deleted file mode 100644 index 9ab33bd617..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindSpeedComp.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary; -import gov.noaa.nws.ncep.metParameters.parameterConversion.PRLibrary.InvalidValueException; -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.DeriveMethod; - - public class WindSpeedComp extends AbstractMetParameter implements javax.measure.quantity.Angle { - - public WindSpeedComp() { - super( UNIT ); - } - @DeriveMethod - AbstractMetParameter derive ( WindDirection wd, WindSpeed ws, WindCompDirection d) throws InvalidValueException, NullPointerException{ - if ( wd.hasValidValue() && ws.hasValidValue() && d.hasValidValue() ){ - Amount windDrct = PRLibrary.prWcmp(wd , ws , d ); - setValue(windDrct); - }else - setValueToMissing(); - - return this; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWaveHeight.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWaveHeight.java deleted file mode 100644 index 4b1df02680..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWaveHeight.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Length; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class WindWaveHeight extends AbstractMetParameter implements Length { - - public WindWaveHeight() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWavePeriod.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWavePeriod.java deleted file mode 100644 index b44c969c44..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/WindWavePeriod.java +++ /dev/null @@ -1,15 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - - -import javax.measure.quantity.Duration; -import javax.measure.unit.Unit; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class WindWavePeriod extends AbstractMetParameter implements Duration { - - public WindWavePeriod() { - super( UNIT ); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccess.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccess.java deleted file mode 100644 index 3c11a115d9..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccess.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.noaa.nws.ncep.metparameters.dbquery.util; - -public interface ClimateDataDbAccess { - double getTDYF(String stationId, String monthString, String monthDayString); - double getTNTF(String stationId, String monthString, String monthDayString); - double getPPNT(String stationId, String monthString, String monthDayString); - double getPP24(String stationId, String monthString, String monthDayString); -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessImpl.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessImpl.java deleted file mode 100644 index 66e47051a7..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessImpl.java +++ /dev/null @@ -1,136 +0,0 @@ -package gov.noaa.nws.ncep.metparameters.dbquery.util; - -import gov.noaa.nws.ncep.common.log.logger.NcepLogger; -import gov.noaa.nws.ncep.common.log.logger.NcepLoggerManager; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import com.raytheon.uf.viz.core.catalog.DirectDbQuery; -import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; -import com.raytheon.uf.viz.core.exception.VizException; - -public class ClimateDataDbAccessImpl implements ClimateDataDbAccess { - - private NcepLogger logger = NcepLoggerManager.getNcepLogger(this.getClass()); - - @Override - public double getTDYF(String stationId, String monthString, String monthDayString) { - String queryString = createClimateDataQueryForTDYF(stationId, monthString, monthDayString); - double tdyfValue = retrieveValue(queryString); -// logger.info("=== Now input stationid="+stationId); -// logger.info("=== Now retrieved tdyf="+tdyfValue); - return tdyfValue; - } - - @Override - public double getTNTF(String stationId, String monthString, String monthDayString) { - String queryString = createClimateDataQueryForTNTF(stationId, monthString, monthDayString); - double tntfValue = retrieveValue(queryString); -// logger.info("=== Now input stationid="+stationId); -// logger.info("=== Now retrieved tntf="+tntfValue); - return tntfValue; - } - - @Override - public double getPPNT(String stationId, String monthString, String monthDayString) { - String queryString = createClimateDataQueryForPPNT(stationId, monthString, monthDayString); - double ppntValue = retrieveValue(queryString); -// logger.info("=== Now input stationid="+stationId); -// logger.info("=== Now retrieved ppnt="+ppntValue); - return ppntValue; - } - - @Override - public double getPP24(String stationId, String monthString, String monthDayString) { - String queryString = createClimateDataQueryForPP24(stationId, monthString, monthDayString); - double ppdyValue = retrieveValue(queryString); -// logger.info("=== Now input stationid="+stationId); -// logger.info("=== Now retrieved ppdy="+ppdyValue); - return ppdyValue; - } - - - private double retrieveValue(String queryString) { - List objectArrayList = new ArrayList(); - try { - objectArrayList = DirectDbQuery.executeQuery(queryString, "ncep", QueryLanguage.SQL); - } catch (VizException e1) { - logger.error("VizException is thrown when trying to do DirectDbQuery.executeQuery to query stns.climo_data table, error="+e1.getMessage()); - e1.printStackTrace(); - } - double retrievedValue = 0.0; - if(!objectArrayList.isEmpty()) { - Object[] objectArray = objectArrayList.get(0); - - String retrievedStationId = (String)objectArray[0]; -// logger.info("=== Now retrieved stationid="+retrievedStationId); - BigDecimal retrievedValueInBigDecimal = (BigDecimal)objectArray[1]; - retrievedValue = retrievedValueInBigDecimal.doubleValue(); - } - - return retrievedValue; - } - - private String createClimateDataQueryForTDYF(String stationId, String monthString, String monthDayString) { - StringBuilder queryBuilder = new StringBuilder( - "select station_id, tdyf from stns.climo_data where station_id ='"); - queryBuilder.append(stationId) - .append("' and ") - .append("month = '") - .append(monthString) - .append("' and day = '") - .append(monthDayString) - .append("'"); - String queryString = queryBuilder.toString(); -// System.out.println("climate data query string ="+queryString); - return queryString; - } - - private String createClimateDataQueryForTNTF(String stationId, String monthString, String monthDayString) { - StringBuilder queryBuilder = new StringBuilder( - "select station_id, tntf from stns.climo_data where station_id ='"); - queryBuilder.append(stationId) - .append("' and ") - .append("month = '") - .append(monthString) - .append("' and day = '") - .append(monthDayString) - .append("'"); - String queryString = queryBuilder.toString(); -// System.out.println("climate data query string ="+queryString); - return queryString; - } - - private String createClimateDataQueryForPPNT(String stationId, String monthString, String monthDayString) { - StringBuilder queryBuilder = new StringBuilder( - "select station_id, ppnt from stns.climo_data where station_id ='"); - queryBuilder.append(stationId) - .append("' and ") - .append("month = '") - .append(monthString) - .append("' and day = '") - .append(monthDayString) - .append("'"); - String queryString = queryBuilder.toString(); -// System.out.println("climate data query string ="+queryString); - return queryString; - } - - private String createClimateDataQueryForPP24(String stationId, String monthString, String monthDayString) { - StringBuilder queryBuilder = new StringBuilder( - "select station_id, pp24 from stns.climo_data where station_id ='"); - queryBuilder.append(stationId) - .append("' and ") - .append("month = '") - .append(monthString) - .append("' and day = '") - .append(monthDayString) - .append("'"); - String queryString = queryBuilder.toString(); -// System.out.println("climate data query string ="+queryString); - return queryString; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessManager.java b/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessManager.java deleted file mode 100644 index 9cc1365eee..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/src/gov/noaa/nws/ncep/metparameters/dbquery/util/ClimateDataDbAccessManager.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.noaa.nws.ncep.metparameters.dbquery.util; - -public class ClimateDataDbAccessManager { - private static ClimateDataDbAccessManager instance; - - static { - instance = new ClimateDataDbAccessManager(); - } - - private ClimateDataDbAccess climateDataDbAccess; - - private ClimateDataDbAccessManager() { - climateDataDbAccess = new ClimateDataDbAccessImpl(); - } - - public static ClimateDataDbAccessManager getInstance() { - return instance; - } - - public ClimateDataDbAccess getClimateDataDbAccess() { - return climateDataDbAccess; - } -} diff --git a/ncep/gov.noaa.nws.ncep.metParameters/unit-test/gov/noaa/nws/ncep/metparameters/AbstractMetParameterTest.java b/ncep/gov.noaa.nws.ncep.metParameters/unit-test/gov/noaa/nws/ncep/metparameters/AbstractMetParameterTest.java deleted file mode 100644 index a70d6413be..0000000000 --- a/ncep/gov.noaa.nws.ncep.metParameters/unit-test/gov/noaa/nws/ncep/metparameters/AbstractMetParameterTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package gov.noaa.nws.ncep.metparameters; - -import static org.junit.Assert.*; - -import java.util.ArrayList; -import java.util.List; - -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -import gov.noaa.nws.ncep.metparameters.MetParameterFactory.NotDerivableException; - -import org.junit.Test; - -import com.raytheon.uf.common.dataplugin.IDecoderGettable.Amount; - -public class AbstractMetParameterTest { -//TODO update and add test-cases... -// @Test -// public void testDerive() { -// MetParameterFactory instance = MetParameterFactory.getInstance(); -// AbstractMetParameter tempParam = instance.createParameter("Temperature", -// new Amount(243, SI.CELSIUS ) ); -//// AbstractMetParameter relhParam = instance.createParameter("RELH", new Amount(0,NonSI.PERCENT) ); -//// relhParam.setValue( new Amount(33, SI.CELSIUS ) ); -// AbstractMetParameter dptParam = instance.createParameter("DewPointTemp", -// new Amount(23, SI.CELSIUS ) ); -// AbstractMetParameter presParam = instance.createParameter("Pressure", -// new Amount(29, NonSI.INCH_OF_MERCURY ) ); -// AbstractMetParameter thteParam = instance.createParameter("PotentialTemperature", SI.KELVIN); -// AbstractMetParameter heatIndexParam = instance.createParameter("HeatIndex", NonSI.FAHRENHEIT); -// List inputPrms = new ArrayList(); -//// inputPrms.add( relhParam ); -// inputPrms.add( tempParam ); -// inputPrms.add( dptParam ); -// inputPrms.add( presParam ); -// if( heatIndexParam.derivable(inputPrms) ) { -// System.out.println("heat index is derivable from temp and dwpt"); -//} -// else { -// System.out.println("heat index is derivable from temp and dwpt"); -//} -// try { -// HeatIndex hIndex = (HeatIndex) heatIndexParam.derive(inputPrms); -//// System.out.println("The computed heat index is: " + hIndex.getValue().doubleValue() + " " + hIndex.getValue().getUnit() ); -//} catch (NotDerivableException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -//} -// } -// -} diff --git a/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/BoundsProvider.java b/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/BoundsProvider.java new file mode 100644 index 0000000000..6137927e87 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/BoundsProvider.java @@ -0,0 +1,168 @@ +/* + * gov.noaa.nws.ncep.staticdataprovider + * + * 25 January 2013 + * + * This code has been developed by the NCEP/SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.staticdataprovider; + +import gov.noaa.nws.ncep.viz.common.dbQuery.NcDirectDbQuery; + +import java.util.ArrayList; +import java.util.List; + +import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; +import com.vividsolutions.jts.geom.CoordinateSequence; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LinearRing; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.impl.CoordinateArraySequence; +import com.vividsolutions.jts.io.WKBReader; + +/** + * Implementation of the bounds provider. + * + *
+ * SOFTWARE HISTORY
+ * Date       	Ticket#		Engineer	Description
+ * ------------	----------	-----------	--------------------------
+ * 01/13		#966		B. Yin		Initial creation
+ *
+ * 
+ * + * @author B. Yin + */ + +public class BoundsProvider { + + // List of bounds + private static List boundsList = null; + + /** + * Gets the a list of bounds available. + * @return + */ + public static List getBoundsList() { + if ( boundsList == null ){ + boundsList = loadBoundsList(); + } + if ( boundsList != null ){ + System.out.println(boundsList); + } + + return boundsList; + } + + /** + * Load the list of bounds available from the clo table in ncep database. + * @return + */ + private static List loadBoundsList() { + String sql = "select table_name, file_type from config.clo"; + List results; + List ret = new ArrayList(); + + try { + results = NcDirectDbQuery.executeQuery(sql, "ncep", QueryLanguage.SQL); + + for ( Object[] obj : results ){ + if ( obj[0] != null ) { + String str = (String)obj[0]; + if ( !str.isEmpty() && ((Integer)obj[1]) == 1){ + ret.add(str); + } + } + } + } + catch (Exception e ){ + System.out.println("db exception loading bounds list!"); + e.printStackTrace(); + } + + return ret; + } + + /** + * Loads a list of bounds name from a specified bounds table. + * @param table + * @return + */ + public static List loadBoundsNames( String table ){ + String sql = "select name from bounds." + table; + List results; + List ret = new ArrayList(); + + try { + results = NcDirectDbQuery.executeQuery(sql, "ncep", QueryLanguage.SQL); + + for ( Object[] obj : results ){ + if ( obj[0] != null ) { + String str = (String)obj[0]; + if ( !str.isEmpty() ){ + ret.add(str); + } + } + } + } + catch (Exception e ){ + System.out.println("db exception loading bounds names!"); + e.printStackTrace(); + } + + return ret; + } + + /** + * Loads the bounds polygon for the specified bounds name and bounds table. + * @param boundsTable + * @param boundsName + * @return + */ + public static Polygon loadBounds( String boundsTable, String boundsName ){ + String sql = "SELECT AsBinary(the_geom) FROM " + "bounds." + boundsTable + " WHERE " + + "name = '" + boundsName + "'"; + + List results; + Polygon ret = null; + + try { + results = NcDirectDbQuery.executeQuery(sql, "ncep", QueryLanguage.SQL); + + WKBReader wkbReader = new WKBReader(); + if (results != null && !results.isEmpty()) { + Object[] bound = results.get(0); // take the very first one + GeometryFactory geometryFactory = new GeometryFactory(); + + Geometry g = wkbReader.read((byte[]) bound[0]); + if(g instanceof MultiPolygon){ + MultiPolygon mg = (MultiPolygon) g; + int max = 0; + int index = 0; + for (int i = 0; i < mg.getNumGeometries(); i++) { + if (max < mg.getGeometryN(i).getNumPoints()){ + max = mg.getGeometryN(i).getNumPoints(); + index = i; + } + } + ret = (Polygon) mg.getGeometryN(index); + return ret; + } + + CoordinateSequence sequence = new CoordinateArraySequence(g.getCoordinates()); + LinearRing ring = new LinearRing(sequence, geometryFactory); + ret = new Polygon(ring, null, geometryFactory); + } + }catch (Exception e) { + System.out.println("db exception loading bounds: " + boundsName +"@" + boundsTable ); + e.printStackTrace(); + } + + return ret; + + } + + } diff --git a/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/StaticDataProvider.java b/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/StaticDataProvider.java index de87ef6561..e053525cbb 100644 --- a/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/StaticDataProvider.java +++ b/ncep/gov.noaa.nws.ncep.staticdataprovider/src/gov/noaa/nws/ncep/staticdataprovider/StaticDataProvider.java @@ -25,6 +25,7 @@ import com.raytheon.uf.viz.core.catalog.DirectDbQuery.QueryLanguage; import com.raytheon.uf.viz.core.exception.VizException; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; import gov.noaa.nws.ncep.common.staticdata.CostalWater; import gov.noaa.nws.ncep.common.staticdata.Cwa; @@ -50,6 +51,7 @@ import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; * 02/12 ? B. Yin Moved from PGEN * 06/12 734 J. Zeng add getAllRfcs() and getAllCwas() * 08/12 #770 Q. Zhou added loadContWatchNum() + * 01/13 #966 B. Yin Added methods to load bounds info. * * @@ -337,4 +339,20 @@ public class StaticDataProvider implements IStaticDataProvider { return watchNum; } + @Override + public List getBoundsTableList() { + return BoundsProvider.getBoundsList(); + } + + @Override + public List getBoundsNames( String table ) { + return BoundsProvider.loadBoundsNames( table ); + } + + @Override + public Polygon loadBounds(String boundsTable, String boundsName) { + return BoundsProvider.loadBounds( boundsTable, boundsName ); + + } + } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp.linux32/libbignsharp.so b/ncep/gov.noaa.nws.ncep.ui.nsharp.linux32/libbignsharp.so index c0dc9afb30..fdb7821aa1 100644 Binary files a/ncep/gov.noaa.nws.ncep.ui.nsharp.linux32/libbignsharp.so and b/ncep/gov.noaa.nws.ncep.ui.nsharp.linux32/libbignsharp.so differ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/Makefile b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/Makefile index fdd9d36b3a..c9a7be893a 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/Makefile +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/Makefile @@ -25,11 +25,12 @@ LFLAGS =$(LFLAGS_G) $(LFLAGS_R) XLIBS = -L/usr/X11R6/lib -lXm -lXt -lX11 +#CHIN change "-lnetcdf" to "$(OS_LIB)/libnetcdf.a" LIBS = -L./Sndglib -lsndg \ $(OS_LIB)/ginitp_alt.o $(OS_LIB)/gendp_alt.o \ -L$(OS_LIB) -lsnlist -lsnlib -lsflist -lsflib -lnxmlib -ldiaglib \ -lgemlib -lprmcnvlib -lgridlib -lgplt -lgridlib -lcgemlib \ - -ldevice -lxwp -lxw -lps -lgn -lgemlib -lnetcdf \ + -ldevice -lxwp -lxw -lps -lgn -lgemlib $(OS_LIB)/libnetcdf.a \ -ltextlib -lxml2 -lxslt -liconv -lbz2 \ $(XLIBS) -lz -lm diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/caveNsharp.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/caveNsharp.c index 6bab833935..1211419daa 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/caveNsharp.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/caveNsharp.c @@ -10,6 +10,13 @@ #include "Sndglib/profile.h" #include "Sndglib/setsndg.h" #include "Sndglib/sndglib.h" +#define cavesars cavesars_ +#define cavespnsharp cavespnsharp_ +#define hailcast1 hailcast1_ +void cavesars(float *, float *, float * , float *, float *, float *, float *, float *, float *, int *, float *, float *, float *, float *, char *[15], float *[15], char *[80],int *); +void cavespnsharp(float *, float *, float * , float *, float *, float *, int *, float *, float *, char *[15], float *[15], char *[80], +float *, float *, float *,int *); + /* * In Cave: parameters are defined dynamically in "populateSndgDataStatic()" in this file. Its index are defined * as followings. @@ -73,6 +80,86 @@ typedef struct cloudInfoStr float preStartCE[MAX_CLOUD_LAYER]; float preEndCE[MAX_CLOUD_LAYER]; }CloudInfoStr; +/* +typedef struct stpStatsStr +{ + int stpcColor; + int pwColor; + int blMaxColor; + int fosbergColor; + float stpCin; + char sfcRh[60]; + char sfc[60]; + char zeroOneKmRh[60]; + char zeroOneKmMean[60]; + char blMeanRh[60]; + char blMean[60]; + char pw[60]; + char blMax[60]; + char fosberg[60]; +} StpStatsStr; +*/ +#define WINTER_STRING_LEN 60 +typedef struct winterInfoStr +{ + float mopw; + /*float htop; + float hbot; + float mrh; + float mq; + float mo; + float pw; + float pLevel;*/ + char oprh[WINTER_STRING_LEN]; + char layerDepth[WINTER_STRING_LEN]; + char meanLayerRh[WINTER_STRING_LEN]; + char meanLayerMixRat[WINTER_STRING_LEN]; + char meanLayerPw[WINTER_STRING_LEN]; + char meanLayerOmega[WINTER_STRING_LEN]; + char initPhase[100]; + char tempProfile1[WINTER_STRING_LEN]; + char tempProfile2[WINTER_STRING_LEN]; + char tempProfile3[WINTER_STRING_LEN]; + char wetbulbProfile1[WINTER_STRING_LEN]; + char wetbulbProfile2[WINTER_STRING_LEN]; + char wetbulbProfile3[WINTER_STRING_LEN]; + char bestGuess1[WINTER_STRING_LEN]; + char bestGuess2[WINTER_STRING_LEN]; +} WinterInfoStr; + +#define FIRE_STRING_LEN 60 +typedef struct fireInfoStr +{ + int sfcRhColor; + int pwColor; + int blMaxColor; + int fosbergColor; + char sfcRh[FIRE_STRING_LEN]; + char sfc[FIRE_STRING_LEN]; + char zeroOneKmRh[FIRE_STRING_LEN]; + char zeroOneKmMean[FIRE_STRING_LEN]; + char blMeanRh[FIRE_STRING_LEN]; + char blMean[FIRE_STRING_LEN]; + char pw[FIRE_STRING_LEN]; + char blMax[FIRE_STRING_LEN]; + char fosberg[FIRE_STRING_LEN]; +} FireInfoStr; + +#define SARS_STRING_LEN 40 +#define SARS_STRING_LINES 12 +typedef struct sarsInfoStr +{ + int numHailstr; //max=12 + char hailStr[SARS_STRING_LINES][SARS_STRING_LEN]; + int hailStrColor[SARS_STRING_LINES]; + //char sighailStr[2][SARS_STRING_LEN]; + //int sighailStrColor; + int numsupcellstr; //max=12 + char supcellStr[SARS_STRING_LINES][SARS_STRING_LEN]; + int supcellStrColor[SARS_STRING_LINES]; + //char torStr[2][SARS_STRING_LEN]; + //int torStrColor; +} SarsInfoStr; struct Sounding staticSounding; @@ -115,6 +202,27 @@ void initStaticGlobalsMem(){ } strcpy(new->stid, "ARCH"); // dont care for us strcpy(new->dattim, "ARCH");// dont care for us + + + +} +void setSarsSupcellFileName(char sarsFlName[],int sarsLen, char supercellFlName[], int supLen){ + //init GLOBALS sars_filename and sup_filename (for supercell) + //the following statements are copied from read_nsharp_config(); + //printf("input super file = %s\n",supercellFlName); + int i; + for(i=0; i < sizeof(sars_filename); i++){ + sars_filename[i]=0x0; + } + if(sarsLen >0 && sarsLen<= sizeof(sars_filename)) + strncpy(sars_filename, sarsFlName, sarsLen); //"/export/cdbsrv/cchen/Desktop/bigsharp9-original/nlist.txt"); + for(i=0; i < sizeof(sup_filename); i++){ + sup_filename[i]=0x0; + } + if(supLen>0 && supLen<= sizeof(sup_filename)) + strncpy(sup_filename, supercellFlName, supLen); + + //printf("copied super file = %s\n",sup_filename); } Sounding *getSoundingAndInit( short nlev) { @@ -328,7 +436,6 @@ void get_surfaceWind(float* windSp, float * windDir){ void get_effectLayertopBotPres(float *topP, float * botP){ //get p_top and p_bot by calling effective_inflow_layer, 100 and -250 are used by BigNsharp - //effective_inflow_layer_thermo(100,-250, &p_bot,&p_top); effective_inflow_layer(100,-250, &p_bot,&p_top); *topP = p_top; @@ -1156,7 +1263,7 @@ void draw_Clouds( struct cloudInfoStr *cloudStr ) /*****************************************************************/ { int startflag,s1,s2,s3,i,spsub,epsub; - float T1,T2,T3,dz,d2T,R1,R2,R3,d2R,startpres,endpres,x1,x2,y,t2,p2; + float T1,T2,T3,dz,d2T,R1,R2,R3,d2R,startpres,endpres,t2,p2; float Tavg,DDavg,DD; float dd1,dd2,dd3,d2x; int cloudAmt,top,basefound; @@ -1178,7 +1285,7 @@ void draw_Clouds( struct cloudInfoStr *cloudStr ) T2=sndg[s2][PTEMP]; T3=sndg[s3][PTEMP]; dz=sndg[s3][PHGHT]-sndg[s1][PHGHT]; - if (dz==0) dz=1; + if (dz==0.0) dz=1; d2T=(T3-2*T2+T1)/(dz*dz); R1=100*mixratio(sndg[s1][PPRESS],sndg[s1][PDEW])/mixratio(sndg[s1][PPRESS],sndg[s1][PTEMP]); R2=100*mixratio(sndg[s2][PPRESS],sndg[s2][PDEW])/mixratio(sndg[s2][PPRESS],sndg[s2][PTEMP]); @@ -1293,3 +1400,1262 @@ void draw_Clouds( struct cloudInfoStr *cloudStr ) } } + +void getWinterInfo( WinterInfoStr * winterInfo ) +/************************************************************* + * Chin's note: + * This function is based on show_winter_new() of xwvid3.c + * by John Hart NSSFC KCMO + * Chin: Rewrite code to get all computed parameters/string for + * CAVE. + * All original BigNsharp plotting are removed. + *************************************************************/ +{ + float ix1, ix2; + float pose, nege; + float ptop, pbot, htop, hbot, mrh, mq, mo, pw, mopw; + short pIndex, zIndex, tIndex; + short phase; + char st[100]; + struct _ptype ptype1; + //char pt[80]; + + tIndex = getParmIndex("TEMP"); + pIndex = getParmIndex("PRES"); + zIndex = getParmIndex("HGHT"); + + + /* Do dendritic growth zone calcs */ + ptop = temp_lvl(-17, &ix1); + pbot = temp_lvl(-12, &ix1); + if (ptop < 0) ptop = sndg[sfc()][pIndex]; + if (pbot < 0) pbot = sndg[sfc()][pIndex]; + htop = i_hght(ptop, I_PRES); + hbot = i_hght(pbot, I_PRES); + mrh = mean_relhum(&ix1, pbot, ptop); + mq = mean_mixratio(&ix1, pbot, ptop); + mo = mean_omeg(&ix1, pbot, ptop) * 1000; + pw = precip_water(&ix1, pbot, ptop); + mopw = (mo * pw) * mrh / 100; + + //added for cave + winterInfo->mopw = mopw; + + // setcliprgn(1,1,xwdth, xhght); + + /* ----- Draw box around parameter area ----- */ + //setlinestyle(1,1); + /*txtlin = skv.tlx + 731;*/ + //if (display_mode_right == DISPLAY_WINTER_RIGHT) + // {txtlin = skv.tlx + 1066;} + // if (display_mode_left == DISPLAY_WINTER_LEFT) + // {txtlin = skv.tlx + 712;} + // if (display_mode_left == DISPLAY_WINTER_LEFT && display_mode_right == DISPLAY_WINTER_RIGHT) + // { + // setcolor(5); + // set_font(6); + // sprintf( st, "Please choose another inset"); + // outgtext ( st, txtlin +394, txtrow + 115); + // } + // txtrow = skv.bry + 20; + // setcolor(0); + // rectangle(1, txtlin, txtrow, txtlin + 350, txtrow + 250); + // setcolor(31); + // rectangle(0, txtlin, txtrow, txtlin + 350, txtrow + 250); + + /* ----- Dendritic Zone Data ----- */ + // setcolor(5); + // set_font(4); + // txtlin += 5; + // txtrow += 11; + // strcpy(st, " * * * DENDRITIC GROWTH ZONE (-12 to -17C) * * *"); + //ix1 = (350 - getgtextextent(st))/2; + // outgtext(st, txtlin + ix1 - 5, txtrow); + + // txtrow += 15; + //if (mopw < -.1) setcolor(13); else setcolor(31); + //sprintf(st, "OPRH (Omega*PW*RH): %s", qc2(mopw, "", 2)); + sprintf(winterInfo->oprh, "OPRH (Omega*PW*RH): %s", qc2(mopw, "", 2)); + //ix1 = (350 - getgtextextent(st))/2; + // outgtext(st, txtlin + ix1 - 5, txtrow); + + // set_font(4); + //setcolor(31); + // txtrow += 20; + + //strcpy(st, "Layer Depth:"); + // outgtext(st, txtlin, txtrow); + //sprintf( st, "%.0f ft (%.0f - %.0f ft msl)", mtof(htop-hbot), mtof(hbot), mtof(htop)); + sprintf( winterInfo->layerDepth, "Layer Depth: %.0f ft (%.0f - %.0f ft msl)", mtof(htop-hbot), mtof(hbot), mtof(htop)); + // outgtext(st, txtlin+100, txtrow); + + // txtrow += 14; + //strcpy(st, "Mean Layer RH:"); + // outgtext(st, txtlin, txtrow); + // strcpy( st, qc2(mrh, " %", 0)); + strcpy( winterInfo->meanLayerRh, "Mean Layer RH: "); + strcat( winterInfo->meanLayerRh, qc2(mrh, " %", 0)); + // disp_param( st, txtlin + 150, txtrow); + + //strcpy(st, "Mean Layer MixRat:"); + // outgtext(st, txtlin+165, txtrow); + // strcpy( st, qc2(mq, " g/kg", 1)); + strcpy( winterInfo->meanLayerMixRat,"Mean Layer MixRat: "); + strcat( winterInfo->meanLayerMixRat, qc2(mq, " g/kg", 1)); + // disp_param( st, txtlin + 315, txtrow); + + /// txtrow += 14; + //strcpy(st, "Mean Layer PW:"); + // outgtext(st, txtlin, txtrow); + // strcpy( st, qc2(pw, " in.", 2)); + strcpy( winterInfo->meanLayerPw, "Mean Layer PW: "); + strcat( winterInfo->meanLayerPw, qc2(pw, " in.", 2)); + // disp_param( st, txtlin + 150, txtrow); + + //strcpy(st, "Mean Layer Omega:"); + // outgtext(st, txtlin+165, txtrow); + // strcpy( st, qc2(mo, " ub/s", 0)); + strcpy( winterInfo->meanLayerOmega, "Mean Layer Omega: "); + strcat( winterInfo->meanLayerOmega, qc2(mo, " ub/s", 0)); + // disp_param( st, txtlin + 315, txtrow); + + // txtrow += 14; + // moveto(txtlin, txtrow); + // lineto(txtlin+320, txtrow); + // moveto(txtlin+160, txtrow); + // lineto(txtlin+160, txtrow-28); + + /* ----- Initial Phase of Precip ----- */ + // txtrow += 8; + // set_font(4); + // setcolor(31); + strcpy(st, init_phase(&ix1, &phase)); + + ptype1.init_phase = phase; //moved from best_guess_ptype() (below) to avoid calling init_phase twice + ptype1.init_temp = i_temp(ix1, I_PRES); + ptype1.init_lvl = ix1; + + + if (ix1>100) + { + sprintf( winterInfo->initPhase, "Initial Phase: %s from: %.0fmb (%.0f ft msl ; %.1f C)", st, ix1, mtof(i_hght(ix1, I_PRES)), i_temp(ix1, I_PRES)); + + // sprintf( st1, "Initial Phase: %s from: %.0fmb (%.0f ft msl ; %.1f C)", st, ix1, mtof(i_hght(ix1, I_PRES)), i_temp(ix1, I_PRES)); + // outgtext( st1, txtlin, txtrow); + //printf( "%s\n", st1); + } + else + { + sprintf( winterInfo->initPhase, "Initial Phase: No Precipitation layers found."); + // sprintf( st, "Initial Phase: No Precipitation layers found."); + // outgtext( st, txtlin, txtrow); + } + + // txtrow += 15; + // moveto(txtlin, txtrow); + // lineto(txtlin+320, txtrow); + + /* ----- Temperature Pos/Neg Areas ----- */ + posneg_temperature(-1, &pose, &nege, &ptop, &pbot); + ptype1.tpos = pose; //moved from best_guess_ptype() (below) to avoid calling posneg_temperature twice + ptype1.tneg = nege; + //txtrow += 8; + // set_font(4); + //setcolor(31); + //strcpy(st, "TEMPERATURE PROFILE"); + //outgtext(st, txtlin, txtrow); + // txtrow += 14; + + if ((pose > 0) && (nege < 0)) { + sprintf( winterInfo->tempProfile1, "Pos= %.0f J/kg Neg=%.0f J/kg", pose, nege); //Added for Cave + //sprintf( st, "Pos= %.0f J/kg Neg=%.0f J/kg", pose, nege); + //outgtext(st, txtlin, txtrow); + //txtrow += 14; + ix1 = mtof(i_hght(ptop, I_PRES)-i_hght(pbot, I_PRES)); + sprintf(winterInfo->tempProfile2, "Melt Lyr: %3.0f - %3.0fmb (%.0f ft)", ptop, pbot, ix1); //Added for Cave + //sprintf(st, "Melt Lyr: %3.0f - %3.0fmb (%.0f ft)", ptop, pbot, ix1); + //outgtext(st, txtlin, txtrow); + // txtrow += 14; + ix2 = sndg[sfc()][pIndex]; + ix1 = mtof(i_hght(pbot, I_PRES)-i_hght(ix2, I_PRES)); + sprintf(winterInfo->tempProfile3, "Frz Lyr: %3.0f - %4.0fmb (%.0f ft)", pbot, ix2, ix1); //Added for Cave + //sprintf(st, "Frz Lyr: %3.0f - %4.0fmb (%.0f ft)", pbot, ix2, ix1); + //outgtext(st, txtlin, txtrow); + } + else { + //txtrow += 14; + strcpy(winterInfo->tempProfile1, ""); //Added for Cave + strcpy(winterInfo->tempProfile2, "Warm/Cold layers not found.\n"); //Added for Cave + strcpy(winterInfo->tempProfile3, ""); //Added for Cave + // outgtext("Warm/Cold layers not found.", txtlin, txtrow); + // txtrow += 14; + } + + /* ----- WetBulb Pos/Neg Areas ----- */ + posneg_wetbulb(-1, &pose, &nege, &ptop, &pbot); + //txtrow -= 42; + //txtlin += 165; + //set_font(4); + //setcolor(31); + //strcpy(st, "WETBULB PROFILE"); + //outgtext(st, txtlin, txtrow); + //txtrow += 14; + + if ((pose > 0) && (nege < 0)) { + sprintf( winterInfo->wetbulbProfile1, "Pos= %.0f J/kg Neg=%.0f J/kg", pose, nege); + //sprintf( st, "Pos= %.0f J/kg Neg=%.0f J/kg", pose, nege); + //outgtext(st, txtlin, txtrow); + //txtrow += 14; + ix1 = mtof(i_hght(ptop, I_PRES)-i_hght(pbot, I_PRES)); + sprintf( winterInfo->wetbulbProfile2, "Melt Lyr: %3.0f - %3.0fmb (%.0f ft)", ptop, pbot, ix1); + //sprintf(st, "Melt Lyr: %3.0f - %3.0fmb (%.0f ft)", ptop, pbot, ix1); + //outgtext(st, txtlin, txtrow); + //txtrow += 14; + ix2 = sndg[sfc()][pIndex]; + ix1 = mtof(i_hght(pbot, I_PRES)-i_hght(ix2, I_PRES)); + sprintf( winterInfo->wetbulbProfile3, "Frz Lyr: %3.0f - %4.0fmb (%.0f ft)", pbot, ix2, ix1); + //sprintf(st, "Frz Lyr: %3.0f - %4.0fmb (%.0f ft)", pbot, ix2, ix1); + //outgtext(st, txtlin, txtrow); + } + else { + //txtrow += 14; + //outgtext("Warm/Cold layers not found.", txtlin, txtrow); + strcpy(winterInfo->wetbulbProfile1, ""); //Added for Cave + strcpy(winterInfo->wetbulbProfile2, "Warm/Cold layers not found."); //Added for Cave + strcpy(winterInfo->wetbulbProfile3, ""); //Added for Cave + //txtrow += 14; + } + + // txtrow += 14; + //txtlin -= 165; + // moveto(txtlin, txtrow); + // lineto(txtlin+320, txtrow); + // moveto(txtlin+160, txtrow); + // lineto(txtlin+160, txtrow-56); + + /* ----- Best Guess Precip Type ----- */ + // txtrow += 8; + // set_font(4); + // setcolor(31); + // strcpy(st, "* * * BEST GUESS PRECIP TYPE * * *"); + // ix1 = (350 - getgtextextent(st))/2; + //outgtext(st, txtlin + ix1 - 5, txtrow); + // txtrow += 18; + + //best_guess_ptype(txtlin, txtrow); + //Chin: the following are derived from best_guess_ptype() of xwvid3.c + + //strcpy(st, init_phase(&ix1, &phase)); + //Chin: moved these lines up + //ptype1.init_phase = phase; + //ptype1.init_temp = i_temp(ix1, I_PRES); + //ptype1.init_lvl = ix1; + + //posneg_temperature(-1, &pose, &nege, &ptop, &pbot); + //Chin: moved these lines up + //ptype1.tpos = pose; + //ptype1.tneg = nege; + + tIndex = getParmIndex("TEMP"); + + if (!sndg || tIndex == -1) + ptype1.tsfc = RMISSD; + else + ptype1.tsfc = sndg[sfc()][tIndex]; + strcpy(winterInfo->bestGuess1, best_guess(ptype1)); //Cave + //strcpy(pt, best_guess(ptype1)); + // set_font(6); + // setcolor(31); + // sprintf(st, "%s", pt); + // ix1 = (350 - getgtextextent(st))/2; + // outgtext(st, txtlin + ix1 - 5, txtrow); + + //txtrow += 18; + // set_font(4); + sprintf(winterInfo->bestGuess2, "Based on sfc temperature of %.1f F.", ctof(ptype1.tsfc)); + //sprintf(st, "Based on sfc temperature of %.1f F.", ctof(ptype1.tsfc)); + // ix1 = (350 - getgtextextent(st))/2; + // outgtext(st, txtlin + ix1 - 5, txtrow); + +} +void getFireInfo(FireInfoStr * fireInfo) +/************************************************************* + * Chin Note: this function is derived from show_fire() of xwvid3.c + * of BigNsharp by Rich Thompson SPC OUN + * Chin: Rewrite code to get all computed parameters/string for + * CAVE. + * All original BigNsharp plotting are removed. + *************************************************************/ +{ + float ix1, ix2, ix3, ix4, pres, h2, p1, p2, sfctemp, sfcdwpt, sfcpres, sfcrh; + short oldlplchoice, pIndex, zIndex, tIndex; + Parcel pcl; + + oldlplchoice = lplvals.flag; + tIndex = getParmIndex("TEMP"); + pIndex = getParmIndex("PRES"); + zIndex = getParmIndex("HGHT"); + + + define_parcel(1, 0); + ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + sfctemp = lplvals.temp; + sfcdwpt = lplvals.dwpt; + sfcpres = lplvals.pres; + + p1 = sndg[sfc()][pIndex]; + p2 = sndg[sfc()][pIndex]; + relh(-1, &ix3); + sfcrh = ix3; + + + if (ix3 > 35) fireInfo->sfcRhColor =8; + else if (ix3 > 30) fireInfo->sfcRhColor =18; + else if (ix3 > 20) fireInfo->sfcRhColor =31; + else if (ix3 > 15) fireInfo->sfcRhColor =19; + else if (ix3 > 10) fireInfo->sfcRhColor =2; + else if (ix3 >= 0) fireInfo->sfcRhColor =7; + else fireInfo->sfcRhColor =31; + + sprintf( fireInfo->sfcRh, "SFC RH = %s", qc2(ix3, "%", 0)); + mean_wind( p1, p2, &ix1, &ix2, &ix3, &ix4); + if (ix3 < 0) + strcpy( fireInfo->sfc, "SFC = M"); + else + sprintf( fireInfo->sfc, "SFC = %4.0f/%.0f", ix3, ix4); + + h2 = 1000; + sprintf( fireInfo->zeroOneKmRh, "0-1 km RH = %s", qc2( mean_relhum(&ix3, p1, i_pres(msl(h2))), "%", 0 )); + mean_wind( p1, i_pres(msl(h2)), &ix1, &ix2, &ix3, &ix4); + if (ix3 < 0) + strcpy( fireInfo->zeroOneKmMean, "0-1 km mean = M"); + else + sprintf( fireInfo->zeroOneKmMean, "0-1 km mean = %4.0f/%.0f", ix3, ix4); + + pbl_top(&p2); + sprintf( fireInfo->blMeanRh, "BL mean RH = %s", qc2( mean_relhum(&ix3, p1, p2), "%", 0 )); + + mean_wind( p1, p2, &ix1, &ix2, &ix3, &ix4); + if (ix3 < 0) + strcpy( fireInfo->blMean, "BL mean = M"); + else + sprintf( fireInfo->blMean, "BL mean = %4.0f/%.0f", ix3, ix4); + + define_parcel(3, 500); + parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + precip_water(&ix1, -1, -1); + if ((ix1 < 0.5) && (pcl.bplus > 50) && (sfcrh < 35)){ + fireInfo->pwColor = 2; + } + sprintf( fireInfo->pw, "PW = %s", qc2( ix1, "in", 2 )); + max_wind(&ix1, &ix2, &ix3, -1, p2); + if (ix3 < 0) + strcpy( fireInfo->blMax, "BL max = M"); + else{ + if (ix3 > 50) fireInfo->blMaxColor =7; + else if (ix3 > 40) fireInfo->blMaxColor =2; + else if (ix3 > 30) fireInfo->blMaxColor =19; + else if (ix3 > 20) fireInfo->blMaxColor =31; + else if (ix3 > 10) fireInfo->blMaxColor =18; + else fireInfo->blMaxColor =8; + sprintf( fireInfo->blMax, "BL max = %4.0f/%.0f", ix2, ix3); + } + ix3 = fosberg(&ix4); + if (ix3 < 0) + strcpy( fireInfo->fosberg, "Fosberg FWI = M"); + else { + + if (ix3 >= 70) fireInfo->fosbergColor =7; + else if (ix3 >= 60) fireInfo->fosbergColor =2; + else if (ix3 >= 50) fireInfo->fosbergColor =19; + else if (ix3 >= 40) fireInfo->fosbergColor =31; + else if (ix3 >= 30) fireInfo->fosbergColor =18; + else fireInfo->fosbergColor =8; + sprintf( fireInfo->fosberg, "Fosberg FWI = %4.0f", ix3); + } + + + /* parcel setback */ + if (oldlplchoice == 1) + pres = 0; + else if (oldlplchoice == 2) + pres = 0; + else if (oldlplchoice == 3) + pres = mu_layer; + else if (oldlplchoice == 4) + pres = mml_layer; + else if (oldlplchoice == 5) + pres = user_level; + else if (oldlplchoice == 6) + pres = mu_layer; + define_parcel(oldlplchoice, pres); + +} +void getSarsInfo(SarsInfoStr * sarsInfo) +/************************************************************* + * Chin Note: this function is derived from show_sars() of xwvid3.c + * of BigNsharp by John Hart NSSFC KCMO + * Chin: Rewrite code to get all computed parameters/string for + * CAVE. + * All original BigNsharp gui functions are removed. + *************************************************************/ +{ + float ix1, ix2, ix3, ix4, sfctemp, sfcdwpt, sfcpres, j1, j2; + float nv_cape, nv_cinh, nv_cap, pres, ptop, pbot, mucape, mumixr, avsize, matches2; + float lr75, shr3, shr6, shr9, fzlh, mucinh, ship, esi2, t500; + float srh3, matches, p1, p2, haillist[15], suplist[15], oldlplpres; + float mucp, mlcp, mllcl, srh1, shr3k, shr6k, shr9k; + short txtlin, txtrow, oldlplchoice, pIndex, zIndex, tIndex, trow2, i; + short tdIndex, nsndgs, trx, j, temp_mark, y, totalsndgs; + char st[100], st1[20], st2[20], sndglist[15][15], tempStr[16]; + char tortags[3][10] = { "NONTOR", "WEAKTOR", "SIGTOR" }; + Parcel pcl; + Parcel pcl2; + + //initialize SarsInfoStr + sarsInfo->numHailstr =SARS_STRING_LINES; + sarsInfo->numsupcellstr=SARS_STRING_LINES; + //memset(sarsInfo->hailStr,'\0', 600); + + tIndex = getParmIndex("TEMP"); + pIndex = getParmIndex("PRES"); + zIndex = getParmIndex("HGHT"); + tdIndex = getParmIndex("DWPT"); + + oldlplchoice = lplvals.flag; + oldlplpres = lplvals.pres; + + + define_parcel(4,100); + ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + mlcp = pcl.bplus; + mllcl = agl(i_hght(pcl.lclpres, I_PRES)); + + define_parcel(3, mu_layer); + sfctemp = lplvals.temp; + sfcdwpt = lplvals.dwpt; + sfcpres = lplvals.pres; + + /* ----- Calculate Parcel Data ----- */ + ix1 = parcel( -1, -1, sfcpres, sfctemp, sfcdwpt, &pcl); + mucp = pcl.bplus; + mumixr = mixratio(lplvals.pres, lplvals.dwpt); + + + /* ----- Titles ----- */ + + /* Compute Hail Sars Data */ + t500 = i_temp(500, I_PRES); + lr75 = lapse_rate(&ix1, 700, 500); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(6000)), &ix1, &ix2, &ix3, &ix4); shr6 = kt_to_mps(ix4); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(9000)), &ix1, &ix2, &ix3, &ix4); shr9 = kt_to_mps(ix4); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(3000)), &ix1, &ix2, &ix3, &ix4); shr3 = kt_to_mps(ix4); + + if (agl(i_hght(p_bot, I_PRES)) > 0){ + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.25)), &ix1, &ix2, &ix3, &ix4); shr3 = kt_to_mps(ix4); + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.5)), &ix1, &ix2, &ix3, &ix4); shr6 = kt_to_mps(ix4); + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.75)), &ix1, &ix2, &ix3, &ix4); shr9 = kt_to_mps(ix4); + } + fzlh = mtof(agl(i_hght(temp_lvl(0, &ix1), I_PRES))); + ship = sig_hail(pcl.bplus, mumixr, lr75, t500, kt_to_mps(shr6), fzlh, pcl.bminus, 0, 0, 25, mlcp); + srh3 = helicity(0, 3000, st_dir, st_spd, &ix2, &ix3); + srh1 = helicity(0, 1000, st_dir, st_spd, &ix2, &ix3); + + if (agl(i_hght(p_bot, I_PRES)) > 0){ + srh3 = helicity(p_bot, p_top, st_dir, st_spd, &ix2, &ix3); + srh1 = helicity(p_bot, p_top, st_dir, st_spd, &ix2, &ix3); + } + + cavesars(&mumixr, &mucp, &t500, &lr75, &shr6, &shr9, &shr3, &ship, &srh3, &nsndgs, &matches, &p1, &avsize, &matches2, sndglist, &haillist, &sars_filename,&totalsndgs); + // hail match strings...on right side of graphs + if (nsndgs>0) + { + if (nsndgs > 10) nsndgs = 10; + + for (i=0;i<10;i++) + { + if(i < nsndgs){ + j = haillist[i]; + if (j<1) {sarsInfo->hailStrColor[i]=8;} + else if (j<2) {sarsInfo->hailStrColor[i]=(18);} + else sarsInfo->hailStrColor[i]=(5); + //Chin note: sndglist contains matched date and stn from nlist.txt's first column + // haillist contains matched hail size from nlist.txt's 3rd column + memset(tempStr,'\0',16); + strncpy(tempStr, sndglist[i],15); + //printf("Before:tempSTr::%s hailsize=%.2f hairSTr::%s\n",tempStr,haillist[i],sarsInfo->hailStr[i]); + sprintf( sarsInfo->hailStr[i], "%s %.2f%c", tempStr, haillist[i], '\0'); + //printf("After:hairSTr::%s\n",sarsInfo->hailStr[i]); + } + else { + memset(sarsInfo->hailStr[i], '\0', 1); + } + } + //sarsInfo->numHailstr = nsndgs; + } + else + { + for (i=0;i<10;i++) + { + memset(sarsInfo->hailStr[i], '\0', 1); + } + sarsInfo->hailStrColor[5]=31; + sprintf( sarsInfo->hailStr[5], "No Quality HAIL Matches"); + //sarsInfo->numHailstr = 1; + } + + //----- Plot Hail SARS Result ----- + p2 = 100.0 - p1; + if (matches>0){ + sarsInfo->hailStrColor[10]=(31); + sarsInfo->hailStrColor[11]=(31); + strcpy(st1, "Non-sig Hail"); + } + else if (p1>=50){ + sarsInfo->hailStrColor[10]= 12; + sarsInfo->hailStrColor[11]=12; + strcpy(st1, "**SIG HAIL!**"); + } + else { + strcpy(st1, "No Matches"); + sarsInfo->hailStrColor[10]=(31); + sarsInfo->hailStrColor[11]=(31); + } + if ((p1>=50) || (p1<50 && matches>0)) + { + sprintf( sarsInfo->hailStr[10], "(%.0f matches out of %d sndgs)", matches,totalsndgs); + } + else { + sprintf( sarsInfo->hailStr[10],""); + } + + sprintf( sarsInfo->hailStr[11], "SARS: %s (%.0f%s SIG)", st1, p1, "%"); + + //Supercell match plot on left side of graph + //fromhere.... + + wind_shear(sndg[sfc()][pIndex], i_pres(msl(6000)), &ix1, &ix2, &ix3, &ix4); shr6k = ix4; + wind_shear(sndg[sfc()][pIndex], i_pres(msl(9000)), &ix1, &ix2, &ix3, &ix4); shr9k = ix4; + wind_shear(sndg[sfc()][pIndex], i_pres(msl(3000)), &ix1, &ix2, &ix3, &ix4); shr3k = ix4; + + cavespnsharp(&mlcp, &mllcl, &t500, &lr75, &shr6k, &srh1, &nsndgs, &matches, &p1, sndglist, &suplist, &sup_filename, &shr3k, &shr9k, &srh3, &totalsndgs); + /* + for (i=0; i < 15; i++) sndglist[i][14] = '\0'; + printf( "%d High Quality SUPERCELL Matches were found.\n", nsndgs); + for (i=0;i0) + { + if (nsndgs > 10) nsndgs = 10; + for (i=0;i<10;i++) + { + if(i < nsndgs){ + // R/J's comments : I am now passing values in suplist (0-3). I assigned an array of strings called tortags to plot the right stuff on the screen. + j = suplist[i]; + if (j<1) {sarsInfo->supcellStrColor[i]=(18);} + else if (j<2) {sarsInfo->supcellStrColor[i]=(6);} + else sarsInfo->supcellStrColor[i]=(2); + memset(tempStr,'\0',16); + strncpy(tempStr, sndglist[i],15); + sprintf(sarsInfo->supcellStr[i], "%s %s%c", tempStr,tortags[j],'\0'); + } + else { + memset(sarsInfo->supcellStr[i], '\0', 1); + } + } + + } + else + { + for (i=0;i<10;i++) + { + memset(sarsInfo->supcellStr[i], '\0', 1); + } + sarsInfo->supcellStrColor[5]= 31; + sprintf( sarsInfo->supcellStr[5], "No Quality SUPERCELL Matches"); + + } + + + + // ----- Plot Supercell SARS Result ----- + p2 = 100.0 - p1; + sarsInfo->supcellStrColor[10]=(31); + sarsInfo->supcellStrColor[11]=(31); + strcpy(st1, "No Matches"); + define_parcel(1,0); + ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + if (pcl.bplus >= 100){ + if (matches>0){ + strcpy(st1, "NONTOR"); + } + if (p1>50){ + sarsInfo->supcellStrColor[10]=12; + sarsInfo->supcellStrColor[11]=12; + strcpy(st1, "**TOR!**"); + } + if ((p1>50) || (p1<=50 && matches>0)){ + sprintf( sarsInfo->supcellStr[10], "(%.0f matches out of %d sndgs)", matches,totalsndgs); + } + else { + sprintf( sarsInfo->supcellStr[10],""); + } + + sprintf( sarsInfo->supcellStr[11], "SARS: %s (%.0f%s TOR)", st1, p1, "%"); + } + + // ----- Set Parcel Back ----- + if (oldlplchoice == 1) + pres = 0; + else if (oldlplchoice == 2) + pres = 0; + else if (oldlplchoice == 3) + pres = mu_layer; + else if (oldlplchoice == 4) + pres = mml_layer; + else if (oldlplchoice == 5) + pres = user_level; + else if (oldlplchoice == 6) + pres = mu_layer; + define_parcel(oldlplchoice, pres); + + +} +/************************************************************* + * Chin Note: this function is derived from show_skewtpage1() + * plus show_hail_new() of xwvid3.c + * of BigNsharp by John Hart NSSFC KCMO + * Chin: Rewrite code to get all computed parameters/string for + * CAVE. + * All original BigNsharp gui functions are removed. + *************************************************************/ +void getHailInfo(){ + float hvars[30], h2[100]; + float ix1, ix2, ix3, ix4, mumixr,esicat; + float T0, Td0, el, pbot, ptop, base, depth, effdep, ebs; + short tIndex, tdIndex, pIndex,zIndex; + float sfctemp, sfcdwpt, sfcpres, j1, j2; + float nv_cape, nv_cinh, nv_cap, pres, mucape, mlcape; + float lr75, shr3, shr6, shr9, fzlh, mucinh, ship, esi2, t500; + float srh3, matches, matches2, avsize, p1, haillist[15]; + short txtlin, txtrow, oldlplchoice, trow2, i, j; + short nsndgs, trx, temp_mark, y; + char st[100], st1[20], sndglist[15][15]; + Parcel pcl; + Parcel pcl2; + + // Chin: use memset() instead + memset(h2, 0, sizeof(h2)); + memset(hvars,0, sizeof(hvars)); + //was::for (i=0;i<100;i++) {h2[i] = 0.0;} + //was::for (i=0;i<30;i++) {hvars[i] = 0.0;} + + /* Compute Effective Vertical Shear. Default to 6km if not available */ + ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + pIndex = getParmIndex("PRES"); + tIndex = getParmIndex("TEMP"); + tdIndex = getParmIndex("DWPT"); + zIndex = getParmIndex("HGHT"); + pbot = sndg[sfc()][pIndex]; + el = 12000.0; + if (pcl.bplus >= 100) { + el = agl(i_hght(pcl.elpres, I_PRES)); + /* 24 Mar 2008 */ + /* effective_inflow_layer(100, -250, &pbot, &ptop);*/ + } + base = agl(i_hght(p_bot, I_PRES)); + depth = (el - base); + effdep = base + (depth * 0.5); + wind_shear(p_bot, i_pres(msl(effdep)), &ix1, &ix2, &ix3, &ix4); + ebs = kt_to_mps(ix4)/effdep; + //printf("Shear = %.1f kt %.1f mps\nEBS = %.6f\nDepth = %.1f m\n", ix4, kt_to_mps(ix4), ebs, effdep); + T0 = sndg[sfc()][tIndex]; + Td0 = sndg[sfc()][tdIndex]; + hailcast1(&T0, &Td0, &ebs, &hvars, &mumixr, &esicat); + + h2[0]=1; + h2[1]=0; + for (i=0;i<=30;i++) + { + printf( "HVARS[%d] = %f\n", i, hvars[i]); + h2[i+2] = hvars[i]; + } + //CHin Note::: Above code are from show_skewtpage1(). It does some parameters setting before calling show_hail_new(). + //Chin note::: From here down are rewriting code of show_hail_new(&h2); + + oldlplchoice = lplvals.flag; + + define_parcel(4, 100); + mlcape = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + + define_parcel(3, mu_layer); + sfctemp = lplvals.temp; + sfcdwpt = lplvals.dwpt; + sfcpres = lplvals.pres; + + //----- Calculate Parcel Data ----- + ix1 = parcel( -1, -1, sfcpres, sfctemp, sfcdwpt, &pcl); + + // ----- Hail Model Output ----- + // Chin:: resume work from here... + set_font(4); + setcolor(31); + sprintf(st, "Hailcast1 --> (%.0f convecting) T/Td= %.0fF/%.0fF Storm Cat: %.0f of 4", h2[18], ctof(h2[2]), ctof(h2[3]),h2[25]); + outgtext ( st, txtlin, txtrow ); + + if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(3); + if (h2[24] >= 1.95) setcolor(2); + + txtrow += 15; + sprintf(st, "Avg: %.1f in. Max: %.1f in. Min: %.1f in. SIG = %.0f SVR = %.0f ", h2[19], h2[20],h2[21],h2[22], h2[23]); + outgtext ( st, txtlin, txtrow ); + + txtrow +=20; + set_font(4); + setcolor(31); + if(h2[4] == 0) setcolor(31); + sprintf(st, "Hailcast2 --> (%.0f convecting) T/Td= %.0fF/%.0fF Storm Cat: %.0f of 4", h2[4], ctof(h2[2]), ctof(h2[3]),h2[17]); + outgtext ( st, txtlin, txtrow ); + + if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(3); + if (h2[15] >= 1.95) setcolor(2); + + if(h2[4] == 0) h2[15] = 0; + sprintf(st, "Avg: %.1f in. Max: %.1f in. Min: %.1f in. SIG = %.0f SVR = %.0f ", h2[5], h2[6],h2[7],h2[8], h2[9]); + txtrow += 14; + outgtext ( st, txtlin, txtrow ); + + + + txtrow += 15; + setcolor(31); + moveto(txtlin, txtrow); + lineto(txtlin+340, txtrow); + + + + setcolor(31); + set_font(6); + if (h2[4] == 0 && h2[18] == 0) { + sprintf(st, "No Convecting Members"); + txtrow += 6; + ix1 = (350 - getgtextextent(st))/2; + outgtext(st, txtlin + ix1 - 5, txtrow); + }else{ + // If convecting members then........... + txtrow +=4; + if (h2[24] < 1.00) setcolor(31); + if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(3); + if (h2[24] >= 1.95) setcolor(2); + sprintf(st, "Hailcast1---> %.1f", h2[24]); + ix1 = (350 - getgtextextent(st))/2; + outgtext(st, txtlin + ix1 - 85, txtrow); + + if (h2[15] < 1.00) setcolor(31); + if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(3); + if (h2[15] >= 1.95) setcolor(2); + sprintf(st, "Hailcast2---> %.1f",h2[15]); + ix1 = (350 - getgtextextent(st))/2; + outgtext(st, txtlin + ix1 + 70, txtrow); + + } + + txtrow += 18; + setcolor(31); + moveto(txtlin, txtrow); + lineto(txtlin+340, txtrow); + + /* Compute SARS Data */ + define_parcel(4, 100); + mlcape = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + define_parcel(3, 400); + mucape = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); + mumixr = mixratio(lplvals.pres, lplvals.dwpt); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(6000)), &ix1, &ix2, &ix3, &ix4); shr6 = kt_to_mps(ix4); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(9000)), &ix1, &ix2, &ix3, &ix4); shr9 = kt_to_mps(ix4); + wind_shear(sndg[sfc()][pIndex], i_pres(msl(3000)), &ix1, &ix2, &ix3, &ix4); shr3 = kt_to_mps(ix4); + + if (agl(i_hght(p_bot, I_PRES)) > 0){ + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.25)), &ix1, &ix2, &ix3, &ix4); shr3 = kt_to_mps(ix4); + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.5)), &ix1, &ix2, &ix3, &ix4); shr6 = kt_to_mps(ix4); + wind_shear(p_bot, i_pres(msl(agl(i_hght(p_top, I_PRES))*0.75)), &ix1, &ix2, &ix3, &ix4); shr9 = kt_to_mps(ix4); + } + + t500 = i_temp(500, I_PRES); + lr75 = lapse_rate(&ix1, 700, 500); + fzlh = mtof(agl(i_hght(temp_lvl(0, &ix1), I_PRES))); + ship = sig_hail(pcl.bplus, mumixr, lr75, t500, kt_to_mps(shr6), fzlh, pcl.bminus, 0, 0, 25, mlcape); + srh3 = helicity(0, 3000, st_dir, st_spd, &ix2, &ix3); + if (agl(i_hght(p_bot, I_PRES)) > 0){ + srh3 = helicity(p_bot, p_top, st_dir, st_spd, &ix2, &ix3); + } + + + sars(&mumixr, &mucape, &t500, &lr75, &shr6, &shr9, &shr3, &ship, &srh3, &nsndgs, &matches, &p1, &avsize, &matches2, sndglist, &haillist, &sars_filename); + + for (i=0; i < 15; i++) sndglist[i][14] = '\0'; + printf( "%d High Quality HAIL Matches were found.\n", nsndgs); + for (i=0;i= 2 && (avsize < 2.06 && avsize > 1.49)) setcolor(3); + if (matches2 >= 2 && avsize >= 2.06) setcolor(2); + if (matches2 >= 1) { + set_font(6); + if (avsize <= 1.49) { + sprintf(st, "Best guess from SARS = < 1 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 1.49) && (avsize <= 1.68)) { + sprintf(st, "Best guess from SARS = 1 - 1.5 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 1.68) && (avsize <= 2.06)) { + sprintf(st, "Best guess from SARS = 1.75 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 2.06) && (avsize <= 2.39)) { + sprintf(st, "Best guess from SARS = 2 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 2.39) && (avsize <= 2.52)) { + sprintf(st, "Best guess from SARS = 2.5 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 2.52) && (avsize <= 2.56)) { + sprintf(st, "Best guess from SARS = 2.75 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if ((avsize > 2.56) && (avsize <= 2.64)) { + sprintf(st, "Best guess from SARS = 3 - 4 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + if (avsize > 2.64) { + sprintf(st, "Best guess from SARS = > 4 inch"); + ix1 = (350 - getgtextextent(st))/2; + outgtext ( st, txtlin + ix1 - 5, txtrow ); + } + txtrow += 18; + set_font(4); + sprintf(st, "AVG size = %.2f (based on %.0f matches)", avsize, matches2); + ix1 = (350 - getgtextextent(st))/2; + outgtext(st, txtlin + ix1 - 5, txtrow); + } + + txtrow += 18; + setcolor(31); + moveto(txtlin, txtrow); + lineto(txtlin+340, txtrow); + if (matches2 > 0) { + txtrow += 7; + set_font(4); + setcolor(31); + strcpy( st, "SARS output ranges for reported sizes (white)"); + ix1 = (350 - getgtextextent(st))/2; + outgtext(st, txtlin + ix1 - 5, txtrow); + + txtrow += 18; + /* SARS for reported < 1" hail */ + if (avsize <= 1.49) { + setcolor(31); + set_font(6); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + set_font(4); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 56, txtrow - 5, txtlin + 91, txtrow + 60); + } + /* SARS for reported 1-1.5" hail */ + if ((avsize > 1.49) && (avsize <= 1.68)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + set_font(6); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + set_font(4); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 91, txtrow - 5, txtlin + 126, txtrow + 60); + } + /* SARS for reported 1.75" hail */ + if ((avsize > 1.68) && (avsize <= 2.06)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + set_font(6); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + set_font(4); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 126, txtrow - 5, txtlin + 161, txtrow + 60); + } + /* SARS for reported 2" hail */ + if ((avsize > 2.06) && (avsize <= 2.39)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + set_font(6); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + set_font(4); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 161, txtrow - 5, txtlin + 196, txtrow + 60); + } + /* SARS for reported 2.5" hail */ + if ((avsize > 2.39) && (avsize <= 2.52)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + set_font(6); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + set_font(4); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 196, txtrow - 5, txtlin + 231, txtrow + 60); + } + /* SARS for reported 2.75" hail */ + if ((avsize > 2.52) && (avsize <= 2.56)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + set_font(6); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + set_font(4); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 231, txtrow - 5, txtlin + 266, txtrow + 60); + } + /* SARS for reported 3-4" hail */ + if ((avsize > 2.56) && (avsize <= 2.64)) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + set_font(6); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + set_font(4); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 266, txtrow - 5, txtlin + 301, txtrow + 60); + } + /* SARS for reported >4" hail */ + if (avsize > 2.64) { + setcolor(31); + set_font(4); + strcpy(st, "<1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1-1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.75"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.75"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3-4"); + outgtext(st, txtlin + 270, txtrow); + set_font(6); + strcpy(st, ">4"); + outgtext(st, txtlin + 305, txtrow); + setcolor(27); + rectangle(0, txtlin + 301, txtrow - 5, txtlin + 336, txtrow + 60); + } + + txtrow += 15; + setcolor(31); + set_font(4); + strcpy(st, "+1 STD"); + outgtext(st, txtlin, txtrow); + setcolor(27); + strcpy(st, "1.9"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "2.0"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "2.3"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2.8"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.9"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "3.0"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "3.0"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, "3.0"); + outgtext(st, txtlin + 305, txtrow); + + txtrow += 15; + setcolor(31); + strcpy(st, "AVG"); + outgtext(st, txtlin, txtrow); + setcolor(27); + strcpy(st, "1.5"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1.5"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.8"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "2.3"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.5"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "2.6"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, "2.7"); + outgtext(st, txtlin + 305, txtrow); + + txtrow += 15; + setcolor(31); + strcpy(st, "-1 STD"); + outgtext(st, txtlin, txtrow); + setcolor(27); + strcpy(st, "1.1"); + outgtext(st, txtlin + 60, txtrow); + strcpy(st, "1.1"); + outgtext(st, txtlin + 95, txtrow); + strcpy(st, "1.3"); + outgtext(st, txtlin + 130, txtrow); + strcpy(st, "1.7"); + outgtext(st, txtlin + 165, txtrow); + strcpy(st, "2.1"); + outgtext(st, txtlin + 200, txtrow); + strcpy(st, "2.1"); + outgtext(st, txtlin + 235, txtrow); + strcpy(st, "2.2"); + outgtext(st, txtlin + 270, txtrow); + strcpy(st, "2.4"); + outgtext(st, txtlin + 305, txtrow); + } + + /* ----- Set Parcel Back ----- */ + + if (oldlplchoice == 1) + pres = 0; + else if (oldlplchoice == 2) + pres = 0; + else if (oldlplchoice == 3) + pres = mu_layer; + else if (oldlplchoice == 4) + pres = mml_layer; + else if (oldlplchoice == 5) + pres = user_level; + else if (oldlplchoice == 6) + pres = mu_layer; + define_parcel(oldlplchoice, pres); + +} + +/* +void getStpStats(StpStatsStr * stpStr) +/************************************************************* + * Chin Note: this function is derived from show_stp_stats() of xwvid3.c + * of BigNsharp by Rich Thompson SPC OUN + * Chin: Rewrite code to get all computed parameters/string for + * CAVE. + * All original BigNsharp gui are removed. + ************************************************************* +{ +float s10th, s25th, s50th, s75th, s90th, w10th, w25th, w50th, w75th, w90th; +float n10th, n25th, n50th, n75th, n90th, stpc, maxval, ix1, pres; +short tlx, tly, oldlplchoice, pIndex, zIndex, tIndex, trow2, i, y, hash; +char st[100]; +Parcel pcl; +// plot sounding value of STPC +// max plotted STPC value will be 11 +ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); +stpc = sigtorn_cin(st_dir, st_spd); +if (stpc > 11) stpc = 11; +y = (short)(240 - (stpc * 20)); +// set line color to match color coding of composite parameter inset +if (stpc >= 5.95) stpStr->stpcColor =7; +else if (stpc >= 3.95) stpStr->stpcColor =2; +else if (stpc >= 1.95) stpStr->stpcColor =19; +else if (stpc >= .45) stpStr->stpcColor =31; +else stpStr->stpcColor =8; +stpStr->stpCin = stpc; +// +// * the following from prob_sigt_mlcape() of xwvid3.c +//* +oldlplchoice = lplvals.flag; + +// lift ML parcel +define_parcel(4, 100); +ix1 = parcel( -1, -1, lplvals.pres, lplvals.temp, lplvals.dwpt, &pcl); +mlcape = pcl.bplus; + +if (mlcape >= 4500){ psigt_mlcape=.31; +setcolor(19); +} +else + if (mlcape >= 3500 && mlcape < 4500){ psigt_mlcape=.23; + setcolor(19); + } +else + if (mlcape >= 2500 && mlcape < 3500){ psigt_mlcape=.25; + setcolor(19); + } +else + if (mlcape >= 1500 && mlcape < 2500){ psigt_mlcape=.14; + setcolor(31); + } +else + if (mlcape < 1500 && mlcape >= 50){ psigt_mlcape=.08; + setcolor(18); + } +else +if (mlcape < 50){ psigt_mlcape=0.0; + setcolor(8); + } + +sprintf( stpStr->mlcape, "based on CAPE: %.2f", psigt_mlcape); +disp_param( st, tlx+335, tly+45); +setcolor(31); +set_font(4); +sprintf( st, "based on CAPE: "); +outgtext( st, tlx+208, tly+45); + +// ----- Set Parcel Back ----- + +if (oldlplchoice == 1) + pres = 0; +else if (oldlplchoice == 2) + pres = 0; +else if (oldlplchoice == 3) + pres = mu_layer; +else if (oldlplchoice == 4) + pres = mml_layer; +else if (oldlplchoice == 5) + pres = user_level; +else if (oldlplchoice == 6) + pres = mu_layer; +define_parcel(oldlplchoice, pres); + +} +*/ + + diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesars.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesars.f new file mode 100644 index 0000000000..c4cb6c17d7 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesars.f @@ -0,0 +1,344 @@ + subroutine cavesars(mumr, mucape, temp, lr, shr, + + km9, shr3, ship, srh, tier1, + + matches, p1, avsize, matches2, + + sndglist, haillist, fname, cnt) + +c Jan 27, 2010, REJ. + integer maob,saob + parameter (maob=15000) ! Max number of raobs allowed. + parameter (saob=15) ! Number of raobs to return to NSHARP. + + real mumr,mucape,temp,lr,shr,km9,shr3,ship,srh,avsize + + real matsize(maob),matmr(maob),matcape(maob),mattemp(maob), + & matlr(maob),matshr(maob),matkm9(maob),matshr3(maob),p1,p2, + & matsrh(maob),matship(maob),matmodel(maob),ranmr,rancape,rantemp, + & ranlr,ranshr,rankm9,ranshr3,ranmrt1,rancapet1,rantempt1,ranshrt1, + & rankm9t1,ransrh2t1,ransrh,ransrht1,sigcnt,nulcnt,matches, + & dif(maob),haillist(saob),matelev(maob),mattemp3(maob), + & matlr2(maob),matches2 + + character datestn*15,dummy*25,matdatestn(maob)*15 + character sndglist(saob)*15, fname*(256), fname1*(256) + + integer j,cnt,mrmat(maob),capemat(maob),tempmat(maob), + & lrmat(maob),shrmat(maob),km9mat(maob),shr3mat(maob),golf, + & sigm(maob),tier1,tier1cnt,srhmat(maob) + +c print *, "****************************************************" +c print *, " Entering SARS fortran subroutine" +c print *, "****************************************************" + +1 format(a) + + fname1 = fname(1:len_trim(fname)) +c print *, "Sars Opening input file: ", fname1(1:len_trim(fname1)) + open(unit=10,status='old',file=fname1,err=999,iostat=IERR) + +************* Read file list.txt into array ******************** +c Note...first line of input file ignored. + read(10,1) dummy + + j = 1 + p1=0 + + 70 read(10,*,err=70,end=80) matdatestn(j),matelev(j),matsize(j), + & matcape(j),matmr(j),mattemp(j),mattemp3(j),matlr(j),matlr2(j), + & matshr3(j),matshr(j),matkm9(j),matsrh(j),matship(j),matmodel(j) + + +c 70 read(10,*,err=70,end=80) matdatestn(j),matsize(j),matmr(j), +c & matcape(j),mattemp(j),matlr(j),matshr(j),matkm9(j),matshr3(j), +c & matship(j),matmodel(j),matsrh(j) + + if(matsize(j).ge.2.0) then + sigm(j)=1 + else + sigm(j)=0 + endif + +c Calculate difference in shear magnitude between sounding and match + dif(j) = 1.94*abs(shr-matshr(j)) + + j=j+1 + if(j.gt.maob)stop'Array size too small to read in data...99999' + goto 70 + + + 80 close(10) + +c count number of soundings + cnt = j - 1 +c mixing ratio ranges (g/kg) - k1 + ranmr= 2.0 + ranmrt1= 2.0 + +c determine cape ranges based on cape magnitude (j/kg) - k2 + + rancape = mucape*.30 + + if(mucape.lt.500.) then + rancapet1= mucape*.50 + elseif(mucape.ge.500.0.and.mucape.lt.2000.) then + rancapet1= mucape*.25 + else + rancapet1= mucape*.20 + endif + +c 700-500 mb lapse rate ranges (c/km)- k3 + ranlr= 2.0 + ranlrt1= 0.4 + +c 500 mb temperature ranges (c) - k4 + rantemp= 9 + rantempt1= 1.5 + +c 0-6 km shear ranges (m/s) - k6 + ranshr= 12 + ranshrt1= 6 + +c 0-9 shear ranges - k7 + rankm9= 22 + rankm9t1= 15 + +c 0-3 km shear ranges (m/s) - k8 + ranshr3= 10 + ranshr3t1= 8 + +c SRH shear ranges (m/s) - k9 +c ransrh = 100 + if(srh.lt.50) then + ransrht1 = 25 + else + ransrht1= srh*0.5 + endif +************************************************************* +c using passed sounding, check against all soundings j . + + sigcnt = 0 + nulcnt = 0 + matches = 0 + matches2 = 0 + avsize = 0 + tier1cnt=0 + golf = 0 + tier1 = 0 + jh = 0 + + DO 99 j=1,cnt + + + mrmat(j) = 0 + capemat(j) = 0 + lrmat(j) = 0 + tempmat(j) = 0 + shrmat(j)= 0 + km9mat(j) = 0 + shr3mat(j) = 0 + srhmat(j) = 0 + + if(mumr.ge.(matmr(j)-ranmr).and. + & mumr.le.(matmr(j)+ranmr)) mrmat(j)=1 + if(mucape.ge.(matcape(j)-rancape).and. + & mucape.le.(matcape(j)+rancape)) capemat(j)=1 + if(lr.ge.(matlr(j)-ranlr).and. + & lr.le.(matlr(j)+ranlr)) lrmat(j)=1 + if(temp.ge.(mattemp(j)-rantemp).and. + & temp.le.(mattemp(j)+rantemp)) tempmat(j)=1 + if(shr.ge.(matshr(j)-ranshr).and. + & shr.le.(matshr(j)+ranshr)) shrmat(j)=1 + if(km9.ge.(matkm9(j)-rankm9).and. + & km9.le.(matkm9(j)+rankm9)) km9mat(j)=1 + if(shr3.ge.(matshr3(j)-ranshr3).and. + & shr3.le.(matshr3(j)+ranshr3)) shr3mat(j)=1 + +****** Check if all 7 parameters are met, exclude datestn ********* + if(mrmat(j).eq.1.and.capemat(j).eq.1.and.tempmat(j).eq.1.and. + & lrmat(j).eq.1.and.shrmat(j).eq.1.and.km9mat(j).eq.1.and. + & shr3mat(j).eq.1) then + +*** It's a match..................... + matches = matches + 1 +************* Determine if majority of matches are correct category *** + if(sigm(j).eq.1) sigcnt = sigcnt + 1. + if(sigm(j).eq.0) nulcnt = nulcnt + 1. + +********* Count Golfball Matches for each sounding ******** + if(matsize(j).eq.1.75) golf = golf + 1 + + endif + +******************** Reset Variable for Tier 1 matches ************** + mrmat(j) = 0 + capemat(j) = 0 + lrmat(j) = 0 + tempmat(j) = 0 + shrmat(j)= 0 + km9mat(j) = 0 + shr3mat(j) = 0 + srhmat(j) = 0 +********************************* TIER 1 ******************************* + if(mumr.ge.(matmr(j)-ranmrt1).and. + & mumr.le.(matmr(j)+ranmrt1)) mrmat(j)=1 + if(mucape.ge.(matcape(j)-rancapet1).and. + & mucape.le.(matcape(j)+rancapet1)) capemat(j)=1 + if(lr.ge.(matlr(j)-ranlrt1).and. + & lr.le.(matlr(j)+ranlrt1)) lrmat(j)=1 + if(temp.ge.(mattemp(j)-rantempt1).and. + & temp.le.(mattemp(j)+rantempt1)) tempmat(j)=1 + if(shr.ge.(matshr(j)-ranshrt1).and. + & shr.le.(matshr(j)+ranshrt1)) shrmat(j)=1 + if(km9.ge.(matkm9(j)-rankm9t1).and. + & km9.le.(matkm9(j)+rankm9t1)) km9mat(j)=1 + if(shr3.ge.(matshr3(j)-ranshr3t1).and. + & shr3.le.(matshr3(j)+ranshr3t1)) shr3mat(j)=1 + if(srh.ge.(matsrh(j)-ransrht1).and. + & srh.le.(matsrh(j)+ransrht1)) srhmat(j)=1 + +************** See if sounding matches ******************************** + if(mrmat(j).eq.1.and.capemat(j).eq.1.and.tempmat(j).eq.1.and. + & lrmat(j).eq.1.and.shrmat(j).eq.1.and.km9mat(j).eq.1.and. + & shr3mat(j).eq.1.and.srhmat(j).eq.1) then +cr if(tier1.gt.0) GOTO 5 +cr write(*,*)'--------------------------------------------------' +c5 write(*,8) matdatestn(j), matsize(j), 1.94*matshr(j) +6 format('** TOP MATCHES FOR ',a,'***') +8 format(1X,a13,1X,f5.2,2X,'6km= ',f4.1,' kt') + tier1=tier1 + 1 + +*** John, lets just list them all, at worst they go off the screen *** + if (tier1 .lt. 15) then + sndglist(tier1) = matdatestn(j) + haillist(tier1) = matsize(j) + endif + endif + +************************************************************************ +************************************************************************ +*** Run again, using new ranges, to find the average match size ******* +************************************************************************ +************************************************************************ +c mixing ratio ranges (g/kg) - k1 + ranmr= 2.0 + +c determine cape ranges based on cape magnitude (j/kg) - k2 + rancape = mucape*.40 + +c 700-500 mb lapse rate ranges (c/km)- k3 + ranlr= 1.5 + +c 500 mb temperature ranges (c) - k4 + rantemp= 7 + +c 0-6 km shear ranges (m/s) - k6 + ranshr= 9 + +c 0-9 shear ranges - k7 + rankm9= 22 + +c 0-3 km shear ranges (m/s) - k8 + ranshr3= 10 + + + mrmat(j) = 0 + capemat(j) = 0 + lrmat(j) = 0 + tempmat(j) = 0 + shrmat(j)= 0 + km9mat(j) = 0 + shr3mat(j) = 0 + srhmat(j) = 0 + + if(mumr.ge.(matmr(j)-ranmr).and. + & mumr.le.(matmr(j)+ranmr)) mrmat(j)=1 + if(mucape.ge.(matcape(j)-rancape).and. + & mucape.le.(matcape(j)+rancape)) capemat(j)=1 + if(lr.ge.(matlr(j)-ranlr).and. + & lr.le.(matlr(j)+ranlr)) lrmat(j)=1 + if(temp.ge.(mattemp(j)-rantemp).and. + & temp.le.(mattemp(j)+rantemp)) tempmat(j)=1 + if(shr.ge.(matshr(j)-ranshr).and. + & shr.le.(matshr(j)+ranshr)) shrmat(j)=1 + if(km9.ge.(matkm9(j)-rankm9).and. + & km9.le.(matkm9(j)+rankm9)) km9mat(j)=1 + if(shr3.ge.(matshr3(j)-ranshr3).and. + & shr3.le.(matshr3(j)+ranshr3)) shr3mat(j)=1 + +****** Check if all 7 parameters are met, exclude datestn ********* + if(mrmat(j).eq.1.and.capemat(j).eq.1.and.tempmat(j).eq.1.and. + & lrmat(j).eq.1.and.shrmat(j).eq.1.and.km9mat(j).eq.1.and. + & shr3mat(j).eq.1) then + +*** It's a match..................... + matches2 = matches2 + 1 + +***** For sndg (i), sum matching sizes through list j calc avg below *** + avsize = avsize + matsize(j) + + endif +************************************************************************ +************************************************************************ + + 99 continue + +c if(tier1.ne.1) then +c print *, '-----------------------------------------------------' +c write(*,*) tier1,' High Quality Matches Listed Above ' +c print *, '-----------------------------------------------------' +c else +c print *, '-----------------------------------------------------' +c write(*,*) tier1, ' High Quality Match Listed Above ' +c print *, '-----------------------------------------------------' +c endif + +c matches = sigcnt + nulcnt + +c print *, 'SARS Searching',cnt,' soundings, found',matches + + if(matches2.gt.0) then +c Calculate average hail size from matches... + avsize = avsize/matches2 +c write(*,*) 'Averaging ',matches2, ' matches.' +c write(*,*) 'SARS Best Guess Size: ',avsize + endif + + if(matches.gt.0) then + p1 = sigcnt/matches*100 + p2 = nulcnt/matches*100 + + if(sigcnt.gt.nulcnt) then + +c write(*,10) p1 +10 format(' SARS Says:',f5.1,'% SIG') + elseif(sigcnt.lt.nulcnt) then +c write(*,11) p2 +11 format(' SARS Says:',f5.1,'% SMALL') + elseif(sigcnt.eq.nulcnt) then + if(golf.gt.nulcnt/2) then +c write(*,10) p1 + else +c write(*,*)' SARS Says: Inconclusive' + endif + endif + + else + +c write(*,*) ' No Matches.' +c write(*,*) ' ' + + endif + +c write(*,*)'----------------------------------------------------' +c write(*,*)'To overlay matching soundings, browse to' +c write(*,*)' ~jewell/hail/snd/*' +c write(*,*) '' + + return(0) + + + +999 matches = 0 + p1 = 0 + tier1 = 0 + print *, "ERROR - SARS input file not found. Aborting..." + end diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesup_nsharp.f b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesup_nsharp.f new file mode 100644 index 0000000000..9c27e51861 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/cavesup_nsharp.f @@ -0,0 +1,285 @@ +c program sup_nsharp + + subroutine cavespnsharp(mlcape, mllcl, temp, lr, shr, + + srh, tier1, matches, p1, sndglist, supl2, + + fname,shr3k,shr9k,srh3, cnt) + + +c SARS For Supercells + integer saob,maob + parameter (maob=15000) ! Max number of raobs allowed. + parameter (saob=15) ! Number of raobs to return to NSHARP. + + real mlcape,mlcin,mllcl,mucape,sblcl,shr,srh,stp, + &mustp,temp,ddd,lr,h500u,h500v,matmlmr(maob),matmlcape(maob), + &matmlcin(maob),matmllcl(maob),matmucape(maob),matsblcl(maob), + &matshr(maob),matsrh(maob),matstp(maob),matmustp(maob), + &mattemp(maob),matddd(maob),matlr(maob),math500u(maob), + &math500v(maob),ranmlmr,ranmlcape,ranmlcin,ranmllcl,ranmucape, + &ransblcl,ranshr,ransrh,rantemp,ranlr,ranh500u, + &ranh500v,ranstp,torcnt,noncnt,matches,p1,p2,supl2(saob), + &matshr3k(maob),matshr9k(maob),shr3kmat(maob),shr9kmat(maob), + &shr3k,shr9k,ranshr3kt1,ranshr9kt1,srh3,matsrh3(maob), + &ransrh3t1 + + character datestn(maob)*16,dummy*25,matdatestn(maob)*16 + character sndglist(saob)*15, fname*(256), fname1*(256) + character tortype(maob)*8,suplist(saob)*8 + + integer i,j,cnt,mlmrmat(maob),mlcapemat(maob), + & mlcinmat(maob),mllclmat(maob),mucapemat(maob),sblclmat(maob), + & shrmat(maob),srhmat(maob),tempmat(maob),lrmat(maob),stpmat(maob), + & h500umat(maob),h500vmat(maob),shrcat(maob),matshrcat(maob),tier1, + & tier1cnt,matcat(maob),srh3mat(maob) + +c print *, "****************************************************" +c print *, " Entering SUP_NSHARP fortran subroutine" +c print *, "****************************************************" + + +1 format(a) + fname1 = fname(1:len_trim(fname)) +c print *, "SUP Opening input file: ", fname1(1:len_trim(fname1)) + open(unit=10,status='old',file=fname1,err=999,iostat=IERR) + + + +************* Read file list.txt into second array ******************** +c Note...first line of input file ignored. + read(10,1) dummy + + j = 1 + 70 read(10,*,err=70,end=80) matdatestn(j),matcat(j),matmlmr(j), + &matmlcape(j),matmlcin(j),matmllcl(j),matsrh(j),matshr(j), + &matstp(j),mattemp(j),matddd(j),matlr(j),matshr3k(j),matshr9k(j), + &matsrh3(j) + +c matsrh(j) = abs(matsrh(j)) + if(matcat(j).eq.2) tortype(j)=' SIG TOR' + if(matcat(j).eq.1) tortype(j)='WEAK TOR' + if(matcat(j).eq.0) tortype(j)=' NON TOR' + + if(matshr(j).lt.20) matshrcat(j)=1 + if(matshr(j).ge.20.and.matshr(j).lt.35) matshrcat(j)=2 + if(matshr(j).ge.35.and.matshr(j).lt.50) matshrcat(j)=3 + if(matshr(j).ge.50) matshrcat(j)=4 + + j=j+1 + if(j.gt.maob)stop'Array size too small to read in data...99999' + goto 70 + + 80 close(10) + +c count number of soundings + cnt = j - 1 + + +c mlcape ranges - k2 + ranmlcape= 1300 + ranmlcapet1 = mlcape*0.25 + +c mllcl ranges - k4 + ranmllcl = 50 + ranmllclt1= 200 + +c 0-6 km shear ranges (kt) - k7 + ranshr = 14 + ranshrt1 = 10 + +c 0-1 km srh ranges (m2/s2) - k8 + if(abs(srh).lt.50) then + ransrh = 100 + else + ransrh = srh + endif + + if(abs(srh).lt.100) then + ransrht1 = 50 + else + ransrht1 = (abs(srh))*0.30 + endif + +c 0-3 srh tier 1 ranges + if(abs(srh3).lt.100) then + ransrh3t1 = 50 + else + ransrh3t1 = (abs(srh3))*0.50 + endif + +c 500 mb temperature ranges (c) - k9 + rantemp= 7 + rantempt1 = 5 + +c 700-500 mb lapse rate ranges (c/km)- k10 + ranlr = 1.0 + ranlrt1= 0.8 + +c 3km and 9km shear matching + ranshr3kt1 = 15 + ranshr9kt1 = 25 + +c 500 U and V components (kt) - k11 and k12 +c ranh500u(1)= 5 +c ranh500u(2)= 15 +c ranh500u(3)= 20 +c ranh500u(4)= 25 +c ranh500v(1)= 5 +c ranh500v(2)= 15 +c ranh500v(3)= 20 +c ranh500v(4)= 25 + +************************************************************* + +c using sounding i , check against all soundings j . + + tier1 = 0 + tier1cnt = 0 + matches = 0 + torcnt = 0 + noncnt = 0 + p1=0 + p2=0 + + DO 99 j=1,cnt + + mlcapemat(j) = 0 + mlcinmat(j) = 0 + mllclmat(j) = 0 + shrmat(j) = 0 + srhmat(j) = 0 + tempmat(j) = 0 + lrmat(j) = 0 +c h500umat(j) = 0 +c h500vmat(j) = 0 + + if(mlcape.ge.(matmlcape(j)-ranmlcape).and. + & mlcape.le.(matmlcape(j)+ranmlcape)) mlcapemat(j)=1 + if(mllcl.ge.(matmllcl(j)-ranmllcl).and. + & mllcl.le.(matmllcl(j)+ranmllcl)) mllclmat(j)=1 + if(shr.ge.(matshr(j)-ranshr).and. + & shr.le.(matshr(j)+ranshr)) shrmat(j)=1 + if(srh.ge.(matsrh(j)-ransrh).and. + & srh.le.(matsrh(j)+ransrh)) srhmat(j)=1 + if(temp.ge.(mattemp(j)-rantemp).and. + & temp.le.(mattemp(j)+rantemp)) tempmat(j)=1 + if(lr.ge.(matlr(j)-ranlr).and. + & lr.le.(matlr(j)+ranlr)) lrmat(j)=1 + + +****** Check if all 6 parameters are met, exclude datestn (i) ********* + if(mlcapemat(j).eq.1.and.mllclmat(j).eq.1. + & and.shrmat(j).eq.1.and.srhmat(j).eq.1.and. + & tempmat(j).eq.1.and.lrmat(j).eq.1) then + +************* Determine if majority of matches are correct category *** + if(matcat(j).eq.1.or.matcat(j).eq.2) torcnt = torcnt + 1. + if(matcat(j).eq.0) noncnt = noncnt + 1. + + endif + +******************** Reset Variable for Tier 1 matches ************** + + mlmrmat(j) = 0 + mlcapemat(j) = 0 + mllclmat(j) = 0 + shrmat(j) = 0 + srhmat(j) = 0 + tempmat(j) = 0 + lrmat(j) = 0 + shr3kmat(j) = 0 + shr9kmat(j) = 0 + srh3mat(j) = 0 +c h500umat(j) = 0 +c h500vmat(j) = 0 + +********************************* TIER 1 ******************************* + if(mlcape.ge.(matmlcape(j)-ranmlcapet1).and. + & mlcape.le.(matmlcape(j)+ranmlcapet1)) mlcapemat(j)=1 + if(mllcl.ge.(matmllcl(j)-ranmllclt1).and. + & mllcl.le.(matmllcl(j)+ranmllclt1)) mllclmat(j)=1 + if(shr.ge.(matshr(j)-ranshrt1).and. + & shr.le.(matshr(j)+ranshrt1)) shrmat(j)=1 + if(srh.ge.(matsrh(j)-ransrht1).and. + & srh.le.(matsrh(j)+ransrht1)) srhmat(j)=1 + if(temp.ge.(mattemp(j)-rantempt1).and. + & temp.le.(mattemp(j)+rantempt1)) tempmat(j)=1 + if(lr.ge.(matlr(j)-ranlrt1).and. + & lr.le.(matlr(j)+ranlrt1)) lrmat(j)=1 + if(shr3k.ge.(matshr3k(j)-ranshr3kt1).and. + & shr3k.le.(matshr3k(j)+ranshr3kt1)) shr3kmat(j)=1 + if(shr9k.ge.(matshr9k(j)-ranshr9kt1).and. + & shr9k.le.(matshr9k(j)+ranshr9kt1)) shr9kmat(j)=1 + if(srh3.ge.(matsrh3(j)-ransrh3t1).and. + & srh3.le.(matsrh3(j)+ransrh3t1)) srh3mat(j)=1 + +****** Check if all 6 parameters are met ****************************** + + if(mlcapemat(j).eq.1.and.mllclmat(j).eq.1. + & and.shrmat(j).eq.1.and.srhmat(j).eq.1.and. + & tempmat(j).eq.1.and.lrmat(j).eq.1.and.shr3kmat(j).eq.1.and. + &shr9kmat(j).eq.1.and.srh3mat(j).eq.1) then +c +cr if(tier1.gt.0) GOTO 5 +cr write(*,*)'--------------------------------------------------' +c5 write(*,8) matdatestn(j), matcat(j), matshr(j) +6 format('** TOP MATCHES FOR ',a,'***') +8 format(1X,a16,1X,I1,2X,'6km= ',f4.1,' kt') + tier1=tier1 + 1 +*** John, lets just list them all, at worst they go off the screen *** + if (tier1 .lt. 15) then + sndglist(tier1) = matdatestn(j) + suplist(tier1) = tortype(j) + supl2(tier1) = matcat(j) + endif + endif + + + 99 continue + +c if(tier1.ne.1) then +c print *, '-----------------------------------------------------' +c write(*,*) tier1,' High Quality Matches Listed Above ' +c print *, '-----------------------------------------------------' +c else +c print *, '-----------------------------------------------------' +c write(*,*) tier1, ' High Quality Match Listed Above ' +c print *, '-----------------------------------------------------' +c endif + + matches = torcnt + noncnt + +c print *, 'SARS Supercell Searching',cnt,' soundings, found',matches + + if(matches.ne.0) then + p1 = torcnt/matches*100 + p2 = noncnt/matches*100 + + if(torcnt.gt.noncnt.or.torcnt.eq.noncnt) then +c write(*,10) p1 +10 format(' SARS Says:',f5.1,'% TOR') + elseif(torcnt.lt.noncnt) then +c write(*,11) p2 +11 format(' SARS Says:',f5.1,'% NON-TOR') +c elseif(torcnt.eq.noncnt) then +c write(*,*)' SARS Says: Crap shoot' + endif +c else +c write(*,*) ' No Matches.' +c write(*,*) ' ' + endif + +c write(*,*)'----------------------------------------------------' +c write(*,*)'To overlay matching soundings, browse to' +c write (*,*)' /users/mead/pfcdir/' +c write(*,*) '' + + return(0) + + + +999 matches = 0 + p1 = 0 + tier1 = 0 + print *, "ERROR - SUPERCELL input file not found. Aborting..." + end + diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/config.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/config.c index 50cbdb7cfd..bb740a529d 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/config.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/config.c @@ -184,9 +184,9 @@ int read_nsharp_config(void) fprintf(stderr, "Could not read nsharp.cfg file. Use default.\n"); strcpy(sars_filename, " "); //strcpy(sars_filename, "/users/thompson/nsharp/bigsharp5/nlist.txt"); - strcpy(sars_filename, "/export/cdbsrv/cchen/Desktop/bigsharp9/nlist.txt"); + strcpy(sars_filename, "/export/cdbsrv/cchen/Desktop/bigsharp9-original/nlist.txt"); strcpy(sup_filename, " "); - strcpy(sup_filename, "/export/cdbsrv/cchen/Desktop/bigsharp9/sup.txt"); + strcpy(sup_filename, "/export/cdbsrv/cchen/Desktop/bigsharp9-original/sup.txt"); return(1); } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals.h b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals.h index f46b27ea15..feac3ea866 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals.h +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/globals.h @@ -43,7 +43,7 @@ extern float mu_layer; /* most-unstable layer */ /* Titling stuff */ extern char raobtitle[80], stn_abbrev[4], raob_type[80], mdl_type[80]; extern char raobtitle2[80], stn_abbrev2[4], raob_type2[80], mdl_type2[80]; -extern char raobsavefilename[256], sars_filename[80], sup_filename[80]; +extern char raobsavefilename[256], sars_filename[256], sup_filename[256]; //CHIN extern struct _configure config; extern struct _pagemode pages; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c index 546cfc6267..bd891848c4 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/parameterization.c @@ -224,7 +224,9 @@ float sig_hail(float mucape, float mumixr, float lr75, float t500, float shr6, f if (t500 < -23.0 ) sighail = 0; if (fzlh < 2100 ) sighail = 0; - if (mucape < 1300) sighail*(mucape / 1300); + //Chin: change from the following original line after confirmed by Rich T. 10/19/2012 + //if (mucape < 1300) sighail*(mucape / 1300); + if (mucape < 1300) sighail = sighail*(mucape / 1300); if (lr75 < 5.8 ) sighail = sighail*(lr75 / 5.8); if (fzlh < 2400) sighail = sighail*(fzlh / 2400); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c index c3697ea1ce..69c136f834 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/sharp95.c @@ -37,7 +37,7 @@ float mu_layer = 400.0; /* most-unstable layer */ /* Titling junk */ char raobtitle[80], stn_abbrev[4], raob_type[80], mdl_type[80]; char raobtitle2[80], stn_abbrev2[4], raob_type2[80], mdl_type2[80]; -char raobsavefilename[256], sars_filename[80], sup_filename[80]; +char raobsavefilename[256], sars_filename[256], sup_filename[256]; //CHIN, change from 80 to 256 History hist; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh index ee1eb46acd..a420685052 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/so_new.csh @@ -17,7 +17,8 @@ $RM *.o glibnsharp.so Sndglib/*.o -set myLinkflags = "-L$AWIPS2/tools/lib -shared -Wl,-soname,libbignsharp.so -o libbignsharp.so" +# CHIN was::set myLinkflags = "-L$AWIPS2/tools/lib -shared -Wl,-soname,libbignsharp.so -o libbignsharp.so" +set myLinkflags = "-L$AWIPS2/tools/lib -L/usr1/cchen/awips2/tools/lib -shared -Wl,-soname,libbignsharp.so -o libbignsharp.so" set myLinktail = "-lg2c -lc $XLIBS -lz -lm" # diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid3.c b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid3.c index 4b704f4a91..d10ee16682 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid3.c +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/BigNsharp/xwvid3.c @@ -3216,8 +3216,10 @@ void main_winds(void) depth = el - agl(i_hght(p_bot, I_PRES)); wind_shear(p_bot, i_pres(msl(depth*0.5)), &ix1, &ix2, &ix3, &shr6); } - - ship = sig_hail(mucape, mumixr, lr75, i_temp(500, I_PRES), kt_to_mps(shr6), fzlh, mucinh, 0, 0, 25, mlcape); + //Chin: 10/19/2012. + // change fzlh to in unit of ft, after confirmed by Rich T. + // Fzlh should be in ft AGL when used in sig_hail according to Rich. + ship = sig_hail(mucape, mumixr, lr75, i_temp(500, I_PRES), kt_to_mps(shr6), mtof(fzlh), mucinh, 0, 0, 25, mlcape); if (ship < .45) setcolor(8); if (ship >= .45) setcolor(31); if (ship >= .95) setcolor(19); @@ -3986,7 +3988,7 @@ void main_winds(void) txtrow += 5; /* ----- Hail Model Output ----- */ - setcolor(5); + setcolor(26);//chin setcolor(5); set_font(4); strcpy( st, "* * * HAILCAST HAIL MODEL - 4/21/10 * * *" ); ix1 = (350 - getgtextextent(st))/2; @@ -3995,12 +3997,12 @@ void main_winds(void) txtrow += 15; set_font(4); - setcolor(31); + setcolor(26);//chin setcolor(31); sprintf(st, "Hailcast1 --> (%.0f convecting) T/Td= %.0fF/%.0fF Storm Cat: %.0f of 4", h2[18], ctof(h2[2]), ctof(h2[3]),h2[25]); outgtext ( st, txtlin, txtrow ); - if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(3); - if (h2[24] >= 1.95) setcolor(2); + if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(26);//chin setcolor(3); + if (h2[24] >= 1.95) setcolor(26);//chin setcolor(2); txtrow += 15; sprintf(st, "Avg: %.1f in. Max: %.1f in. Min: %.1f in. SIG = %.0f SVR = %.0f ", h2[19], h2[20],h2[21],h2[22], h2[23]); @@ -4008,13 +4010,13 @@ void main_winds(void) txtrow +=20; set_font(4); - setcolor(31); + setcolor(26);//chin setcolor(31); if(h2[4] == 0) setcolor(31); sprintf(st, "Hailcast2 --> (%.0f convecting) T/Td= %.0fF/%.0fF Storm Cat: %.0f of 4", h2[4], ctof(h2[2]), ctof(h2[3]),h2[17]); outgtext ( st, txtlin, txtrow ); - if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(3); - if (h2[15] >= 1.95) setcolor(2); + if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(26);//chin setcolor(3); + if (h2[15] >= 1.95) setcolor(26);//chin setcolor(2); if(h2[4] == 0) h2[15] = 0; sprintf(st, "Avg: %.1f in. Max: %.1f in. Min: %.1f in. SIG = %.0f SVR = %.0f ", h2[5], h2[6],h2[7],h2[8], h2[9]); @@ -4024,13 +4026,13 @@ void main_winds(void) txtrow += 15; - setcolor(31); + setcolor(26);//chin setcolor(31); moveto(txtlin, txtrow); lineto(txtlin+340, txtrow); - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(6); if (h2[4] == 0 && h2[18] == 0) { sprintf(st, "No Convecting Members"); @@ -4040,16 +4042,16 @@ void main_winds(void) }else{ /* If convecting members then...........*/ txtrow +=4; - if (h2[24] < 1.00) setcolor(31); - if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(3); - if (h2[24] >= 1.95) setcolor(2); + if (h2[24] < 1.00) setcolor(26);//chin setcolor(31); + if (h2[24] >= 1.00 && h2[18] >= 1) setcolor(26);//chin setcolor(3); + if (h2[24] >= 1.95) setcolor(26);//chin setcolor(2); sprintf(st, "Hailcast1---> %.1f", h2[24]); ix1 = (350 - getgtextextent(st))/2; outgtext(st, txtlin + ix1 - 85, txtrow); - if (h2[15] < 1.00) setcolor(31); - if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(3); - if (h2[15] >= 1.95) setcolor(2); + if (h2[15] < 1.00) setcolor(26);//chin setcolor(31); + if (h2[15] >= 1.00 && h2[4] >= 1) setcolor(26);//chin setcolor(3); + if (h2[15] >= 1.95) setcolor(26);//chin setcolor(2); sprintf(st, "Hailcast2---> %.1f",h2[15]); ix1 = (350 - getgtextextent(st))/2; outgtext(st, txtlin + ix1 + 70, txtrow); @@ -4206,7 +4208,7 @@ void main_winds(void) /* SARS hail size */ txtrow += 6; set_font(4); - setcolor(5); + setcolor(26);//chin setcolor(5); strcpy( st, "* * * SARS HAIL SIZE * * *" ); ix1 = (350 - getgtextextent(st))/2; outgtext(st, txtlin + ix1 - 5, txtrow); @@ -4214,14 +4216,14 @@ void main_winds(void) txtrow += 15; set_font(6); if (matches2 == 0) { - setcolor(31); + setcolor(26);//chin setcolor(31); sprintf(st, "No Matches"); ix1 = (350 - getgtextextent(st))/2; outgtext ( st, txtlin + ix1 - 5, txtrow ); } - if (matches2 == 1 || avsize <= 1.49) setcolor(31); - if (matches2 >= 2 && (avsize < 2.06 && avsize > 1.49)) setcolor(3); - if (matches2 >= 2 && avsize >= 2.06) setcolor(2); + if (matches2 == 1 || avsize <= 1.49) setcolor(26);//chin setcolor(31); + if (matches2 >= 2 && (avsize < 2.06 && avsize > 1.49)) setcolor(26);//chin setcolor(3); + if (matches2 >= 2 && avsize >= 2.06) setcolor(26);//chin setcolor(2); if (matches2 >= 1) { set_font(6); if (avsize <= 1.49) { @@ -4278,13 +4280,13 @@ void main_winds(void) } txtrow += 18; - setcolor(31); + setcolor(26);//chin setcolor(31); moveto(txtlin, txtrow); lineto(txtlin+340, txtrow); if (matches2 > 0) { txtrow += 7; set_font(4); - setcolor(31); + setcolor(26);//chin setcolor(31); strcpy( st, "SARS output ranges for reported sizes (white)"); ix1 = (350 - getgtextextent(st))/2; outgtext(st, txtlin + ix1 - 5, txtrow); @@ -4311,7 +4313,7 @@ void main_winds(void) */ /* SARS for reported < 1" hail */ if (avsize <= 1.49) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(6); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4330,12 +4332,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 56, txtrow - 5, txtlin + 91, txtrow + 60); } /* SARS for reported 1-1.5" hail */ if ((avsize > 1.49) && (avsize <= 1.68)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4355,12 +4357,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 91, txtrow - 5, txtlin + 126, txtrow + 60); } /* SARS for reported 1.75" hail */ if ((avsize > 1.68) && (avsize <= 2.06)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4380,12 +4382,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 126, txtrow - 5, txtlin + 161, txtrow + 60); } /* SARS for reported 2" hail */ if ((avsize > 2.06) && (avsize <= 2.39)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4405,12 +4407,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 161, txtrow - 5, txtlin + 196, txtrow + 60); } /* SARS for reported 2.5" hail */ if ((avsize > 2.39) && (avsize <= 2.52)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4430,12 +4432,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 196, txtrow - 5, txtlin + 231, txtrow + 60); } /* SARS for reported 2.75" hail */ if ((avsize > 2.52) && (avsize <= 2.56)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4455,12 +4457,12 @@ void main_winds(void) outgtext(st, txtlin + 270, txtrow); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 231, txtrow - 5, txtlin + 266, txtrow + 60); } /* SARS for reported 3-4" hail */ if ((avsize > 2.56) && (avsize <= 2.64)) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4480,12 +4482,12 @@ void main_winds(void) set_font(4); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 266, txtrow - 5, txtlin + 301, txtrow + 60); } /* SARS for reported >4" hail */ if (avsize > 2.64) { - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "<1"); outgtext(st, txtlin + 60, txtrow); @@ -4504,16 +4506,16 @@ void main_winds(void) set_font(6); strcpy(st, ">4"); outgtext(st, txtlin + 305, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); rectangle(0, txtlin + 301, txtrow - 5, txtlin + 336, txtrow + 60); } txtrow += 15; - setcolor(31); + setcolor(26);//chin setcolor(31); set_font(4); strcpy(st, "+1 STD"); outgtext(st, txtlin, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); strcpy(st, "1.9"); outgtext(st, txtlin + 60, txtrow); strcpy(st, "2.0"); @@ -4532,10 +4534,10 @@ void main_winds(void) outgtext(st, txtlin + 305, txtrow); txtrow += 15; - setcolor(31); + setcolor(26);//chin setcolor(31); strcpy(st, "AVG"); outgtext(st, txtlin, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); strcpy(st, "1.5"); outgtext(st, txtlin + 60, txtrow); strcpy(st, "1.5"); @@ -4554,10 +4556,10 @@ void main_winds(void) outgtext(st, txtlin + 305, txtrow); txtrow += 15; - setcolor(31); + setcolor(26);//chin setcolor(31); strcpy(st, "-1 STD"); outgtext(st, txtlin, txtrow); - setcolor(27); + setcolor(26);//chin setcolor(27); strcpy(st, "1.1"); outgtext(st, txtlin + 60, txtrow); strcpy(st, "1.1"); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/MANIFEST.MF index 019f9770b3..86ca1a65b9 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/MANIFEST.MF +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/META-INF/MANIFEST.MF @@ -65,13 +65,7 @@ Export-Package: gov.noaa.nws.ncep.ui.nsharp, gov.noaa.nws.ncep.ui.nsharp.display, gov.noaa.nws.ncep.ui.nsharp.display.map, gov.noaa.nws.ncep.ui.nsharp.display.rsc, - gov.noaa.nws.ncep.ui.nsharp.maprsc, - gov.noaa.nws.ncep.ui.nsharp.menu, gov.noaa.nws.ncep.ui.nsharp.natives, - gov.noaa.nws.ncep.ui.nsharp.palette, - gov.noaa.nws.ncep.ui.nsharp.skewt, - gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd, - gov.noaa.nws.ncep.ui.nsharp.skewt.rsc, gov.noaa.nws.ncep.ui.nsharp.view Bundle-ClassPath: ., jna.jar diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml b/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml index 83da9d88cb..183c298172 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/plugin.xml @@ -94,7 +94,7 @@ name="Nsharp" recursive="true" value="ncep/nsharp" - extensionFilter=".xml"> + extensionFilter=".xml,.txt"> nsharpFiles =listFiles( pthmgr, + fileName, + new String[]{ ".txt" }, true, true ); + + for( LocalizationFile lFile : nsharpFiles.values() ) { + if( lFile.getFile().getAbsolutePath() != null ){ + //System.out.println("sarsFile name="+ lFile.getFile().getAbsolutePath());// lFile.getName()); + + return lFile.getFile().getAbsolutePath(); + } + } + return null; + } } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConstants.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConstants.java index 65ffba0b69..dbec14d701 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConstants.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpConstants.java @@ -23,6 +23,7 @@ import gov.noaa.nws.ncep.viz.localization.NcPathManager; import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; import java.text.DecimalFormat; +import java.util.HashMap; import javax.measure.converter.UnitConverter; import javax.measure.unit.NonSI; @@ -180,8 +181,12 @@ public class NsharpConstants { public static double center = (left + right) / 2; + public static RGB color_vanilla = new RGB(255,239,206); public static RGB color_red = new RGB(255,0,0);//red public static RGB color_green = new RGB(0,255,0);//green + public static RGB color_darkgreen = new RGB(0x2f,0x4f,0x2f);//green + public static RGB color_mdgreen = new RGB(0x34,0x80,0x17);//green + public static RGB color_coral = new RGB(0xf0,0x80,0x80); public static RGB color_lawngreen = new RGB(119,255,0);//green public static RGB color_yellow_green = new RGB(154,205,50);//green public static RGB color_yellow = new RGB(255,255,0);//yellow @@ -189,29 +194,77 @@ public class NsharpConstants { public static RGB color_cyan = new RGB(0,255,255); //cyan public static RGB color_cyan_md = new RGB(0,238,238); //cyan_md, cyan2 public static RGB color_navy = new RGB(0,0,128); //navy + public static RGB color_apricot = new RGB(251,206,177); + public static RGB color_plum = new RGB(0xB9,0x3B,0x8F); + public static RGB color_purple = new RGB(0x8E,0x35,0xEF); public static RGB color_violet = new RGB(125,0,255);//violet public static RGB color_violet_red = new RGB(208,32,144);//violet public static RGB color_violet_md = new RGB(208,32,144);//md-violet - public static RGB color_white = new RGB(255,250,250);//white + public static RGB color_white = new RGB(255,255,255);//white + public static RGB color_brown = new RGB(166,104,41);//brown public static RGB color_black = new RGB(0,0,0);//black + public static RGB color_orangered = new RGB(255,0x45, 0);//orangered public static RGB color_orange = new RGB(255,122, 66);//orange public static RGB color_darkorange = new RGB(255,140, 0);//orange public static RGB color_babypink = new RGB(249,207, 221);// public static RGB color_deeppink = new RGB(255,20, 147);// public static RGB color_hotpink = new RGB(255,105, 180);// public static RGB color_pink = new RGB(255, 192, 203); + public static RGB color_blue = new RGB(0,0,255); public static RGB color_stellblue = new RGB(70,130,180); public static RGB color_royalblue = new RGB(65,105,225); public static RGB color_skyblue = new RGB(135,206,235); - public static RGB color_lightblue = new RGB(173, 216, 230); + public static RGB color_lightblue = new RGB(173, 223,255); public static RGB color_dodgerblue = new RGB(30,144,255); public static RGB color_chocolate = new RGB(210,105,30); public static RGB color_firebrick = new RGB(178,34,34); public static RGB color_gold = new RGB(255,215,0); public static RGB color_magenta = new RGB(255,0,255); + public static RGB color_maroon = new RGB(0x80,0,0); public static final RGB[] COLOR_ARRAY = {color_green, color_violet,color_yellow,color_hotpink, color_stellblue,color_yellow_green,color_royalblue,color_violet_red,color_orange,color_deeppink, color_dodgerblue, color_chocolate,color_navy}; + + public static final HashMap gempakColorToRGB = new HashMap(){ + /** + * + */ + private static final long serialVersionUID = 1L; + { + put(1,NsharpConstants.color_vanilla); + put(2,NsharpConstants.color_red); + put(3,NsharpConstants.color_green); + put(4,NsharpConstants.color_blue); + put(5,NsharpConstants.color_yellow); + put(6,NsharpConstants.color_cyan); + put(7,NsharpConstants.color_magenta); + put(8,NsharpConstants.color_brown); + put(9,NsharpConstants.color_coral); + put(10,NsharpConstants.color_apricot); + put(11,NsharpConstants.color_pink); + put(12,NsharpConstants.color_deeppink); + put(13,NsharpConstants.color_violet_md); + put(14,NsharpConstants.color_maroon); + put(15,NsharpConstants.color_firebrick); + put(16,NsharpConstants.color_orangered); + put(17,NsharpConstants.color_orange); + put(18,NsharpConstants.color_darkorange); + put(19,NsharpConstants.color_gold); + put(20,NsharpConstants.color_yellow_DK); + put(21,NsharpConstants.color_lawngreen); + put(22,NsharpConstants.color_mdgreen); + put(23,NsharpConstants.color_darkgreen); + put(24,NsharpConstants.color_blue); + put(25,NsharpConstants.color_lightblue); + put(26,NsharpConstants.color_skyblue); + put(27,NsharpConstants.color_cyan_md); + put(28,NsharpConstants.color_violet); + put(29,NsharpConstants.color_purple); + put(30,NsharpConstants.color_plum); + put(31,NsharpConstants.color_white); + put(32,NsharpConstants.color_black); + } + }; // horizontal height line that will be drawn. public static final int[] HEIGHT_LEVEL_METERS = {/*16000,*/ 15000, 12000, 9000, 6000, 3000, 2000 }; public static final int[] HEIGHT_LEVEL_FEET = {50000, 45000, 40000, 35000, 30000, 25000, 20000, 15000, 10000, 5000, 2500 }; @@ -658,13 +711,13 @@ public class NsharpConstants { } //Line configuration. Line name listing order in this array should be in order with constant defined below it. - public static String[] lineNameArray= {"Temperature", "Dew Point", "Parcel","Parcel Ascent","DCAPE","Virtual Temp","Wetbulb","Wind Barb","Overlay 1", "Overlay 2", "Compare 1", "Compare 2","Compare 3","Compare 4","Compare 5","Compare 6","Compare 7","Compare 8","Compare 9","Compare 10", + public static String[] lineNameArray= {"Temperature", "Dew Point", "Parcel Tv","Parcel","DCAPE","Virtual Temp","Wetbulb","Wind Barb","Overlay 1", "Overlay 2", "Compare 1", "Compare 2","Compare 3","Compare 4","Compare 5","Compare 6","Compare 7","Compare 8","Compare 9","Compare 10", "Icing RH", "Icing Temp", "Icing EPI", "Turbulence Ln", "Turbulence WindShear"}; public static int LINE_TEMP = 0; public static int LINE_DEWP = LINE_TEMP+1; - public static int LINE_PARCEL = LINE_DEWP+1; - public static int LINE_PARCEL_ASCENT = LINE_PARCEL+1; - public static int LINE_DCAPE =LINE_PARCEL_ASCENT+1; + public static int LINE_PARCEL_TV = LINE_DEWP+1; + public static int LINE_PARCEL = LINE_PARCEL_TV+1; + public static int LINE_DCAPE =LINE_PARCEL+1; public static int LINE_VIRTUAL_TEMP =LINE_DCAPE+1; public static int LINE_WETBULB = LINE_VIRTUAL_TEMP+1; public static int LINE_WIND_BARB = LINE_WETBULB+1; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGraphProperty.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGraphProperty.java index 8b945834a3..3e14210533 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGraphProperty.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGraphProperty.java @@ -37,10 +37,10 @@ public class NsharpGraphProperty implements ISerializableObject{ private boolean dewp=true; @XmlAttribute - private boolean parcel=true; + private boolean parcelTv=true; @XmlAttribute - private boolean parcelAscent=true; + private boolean parcel=true; @XmlAttribute private boolean dcape=true; @@ -121,6 +121,15 @@ public class NsharpGraphProperty implements ISerializableObject{ this.dewp = dewp; } + + public boolean isParcelTv() { + return parcelTv; + } + + public void setParcelTv(boolean parcelTv) { + this.parcelTv = parcelTv; + } + public boolean isParcel() { return parcel; } @@ -129,15 +138,6 @@ public class NsharpGraphProperty implements ISerializableObject{ this.parcel = parcel; } - - public boolean isParcelAscent() { - return parcelAscent; - } - - public void setParcelAscent(boolean parcelAscent) { - this.parcelAscent = parcelAscent; - } - public boolean isDcape() { return dcape; } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGridInventory.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGridInventory.java index 816011eea2..4faa7aad89 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGridInventory.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/NsharpGridInventory.java @@ -38,7 +38,7 @@ public class NsharpGridInventory { // with the NcGridInventory which stores the parm/vcord/levels but not // the dataTimes. // - public static final String nsharpGridInventoryName = "NSharpGridInventory"; + public static final String nsharpGridInventoryName = "NsharpGridInventory"; private static final ArrayList inventoryParamNames = new ArrayList(); { /* @@ -47,8 +47,9 @@ public class NsharpGridInventory { * will have to change as well. */ inventoryParamNames.add( "pluginName" ); - inventoryParamNames.add( "info.datasetId" ); - inventoryParamNames.add( "dataTime.refTime" ); + inventoryParamNames.add( "info.datasetId" ); //model type + inventoryParamNames.add( "dataTime" );//available grid files + //inventoryParamNames.add( "dataTime.refTime" );//available grid files //inventoryParamNames.add( "dataTime.fcstTime"); } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpEditor.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpEditor.java index baced2dad2..937d314b45 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpEditor.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpEditor.java @@ -1099,6 +1099,7 @@ public class NsharpEditor extends AbstractEditor implements AddListener, } } public void registerMouseHandler(IInputHandler handler, IInputHandler.InputPriority priority) { + if(skewtInputManager!=null) skewtInputManager.registerMouseHandler(handler, priority); } @@ -1110,6 +1111,7 @@ public class NsharpEditor extends AbstractEditor implements AddListener, */ @Override public void registerMouseHandler(IInputHandler handler) { + if(skewtInputManager != null) skewtInputManager.registerMouseHandler(handler); } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpHodoPaneMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpHodoPaneMouseHandler.java index 72f03610b8..0cc5cd20ba 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpHodoPaneMouseHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpHodoPaneMouseHandler.java @@ -19,7 +19,7 @@ package gov.noaa.nws.ncep.ui.nsharp.display; import gov.noaa.nws.ncep.ui.nsharp.display.map.NsharpMapResource; import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpHodoPaneResource; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpShowTextDialog; +import gov.noaa.nws.ncep.ui.nsharp.view.NsharpShowTextDialog; import org.eclipse.swt.graphics.Point; @@ -235,7 +235,7 @@ public class NsharpHodoPaneMouseHandler extends NsharpAbstractMouseHandler{ this.mode = Mode.CREATE; } else if(mouseButton == 3){ //right mouse button - System.out.println("hodo handleMouseUp right button"); + //System.out.println("hodo handleMouseUp right button"); NsharpMapResource.bringMapEditorToTop(); } editor.refresh(); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpSkewTPaneMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpSkewTPaneMouseHandler.java index a1c0087d32..ecf3ce9c9d 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpSkewTPaneMouseHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpSkewTPaneMouseHandler.java @@ -182,6 +182,9 @@ public class NsharpSkewTPaneMouseHandler extends NsharpAbstractMouseHandler{ skewRsc.getRscHandler().setInteractiveTempPointCoordinate(c); editor.refresh(); } + else { + skewRsc.getRscHandler().setPlotInteractiveTemp(false); + } return false; } if (prefManager.handleLongClick(ZOOMIN_PREF, button) @@ -273,9 +276,11 @@ public class NsharpSkewTPaneMouseHandler extends NsharpAbstractMouseHandler{ else if(currentSkewTEditMode == NsharpConstants.SKEWT_EDIT_MODE_MOVELINE) display.getCursorControl().setCursor(movingCursor); } - else + else{ + if(display.getCursorControl()!=null) display.getCursorControl().setCursor(null); } + } //cursorInSkewT=true; skewRsc.setCursorInSkewT(true); try { @@ -371,6 +376,7 @@ public class NsharpSkewTPaneMouseHandler extends NsharpAbstractMouseHandler{ if (skewRsc != null) { skewRsc.setCursorInSkewT(false); } + this.mode = Mode.CREATE; return false; } public void disposeCursor(){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpTimeStnPaneMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpTimeStnPaneMouseHandler.java index dc5118f502..16ce6db33a 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpTimeStnPaneMouseHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/NsharpTimeStnPaneMouseHandler.java @@ -22,7 +22,7 @@ package gov.noaa.nws.ncep.ui.nsharp.display; import gov.noaa.nws.ncep.ui.nsharp.display.map.NsharpMapResource; import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpTimeStnPaneResource; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpShowTextDialog; +import gov.noaa.nws.ncep.ui.nsharp.view.NsharpShowTextDialog; import com.raytheon.uf.viz.core.IDisplayPane; import com.vividsolutions.jts.geom.Coordinate; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapMouseHandler.java index 82d37b1331..3feb1fe4b2 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapMouseHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapMouseHandler.java @@ -118,7 +118,7 @@ public class NsharpMapMouseHandler extends InputHandlerDefaultImpl { */ @Override public boolean handleMouseUp(int x, int y, int button) { - if ( !NsharpMapResource.getOrCreateNsharpMapResource().isEditable()) return false; + //if ( !NsharpMapResource.getOrCreateNsharpMapResource().isEditable()) return false; //System.out.println("NsharpMapMouseHandler handleMouseUp called"); // button 1 is left mouse button if (button == 1 ){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapResourceData.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapResourceData.java index 7711277b13..c2d4d13c4b 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapResourceData.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/map/NsharpMapResourceData.java @@ -64,7 +64,7 @@ public class NsharpMapResourceData extends AbstractResourceData { @Override public boolean equals(Object obj) { - return obj == this; + return false; } public MarkerState getMarkerState() { diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpDataPaneResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpDataPaneResource.java index ccc2404100..edf4e23e3b 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpDataPaneResource.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpDataPaneResource.java @@ -23,7 +23,7 @@ import gov.noaa.nws.ncep.ui.nsharp.display.NsharpAbstractPaneDescriptor; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._lplvalues; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._parcel; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpParcelDialog; +import gov.noaa.nws.ncep.ui.nsharp.view.NsharpParcelDialog; import java.awt.geom.Rectangle2D; import java.util.List; @@ -2502,8 +2502,11 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ VerticalAlignment.TOP, null); curY = curY + charHeight; - //Calculate mean wind at 0-6 km - nsharpNative.nsharpLib.mean_wind( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.agl(6000)), mnu, mnv, wdir, wspd); + //fix TT 549890 + //Calculate mean wind at 0-6 km, following the same algorithm used in drawPanel2() at BigNsharp page 2. + //Like this : mean_wind(nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2))) + nsharpNative.nsharpLib.mean_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), mnu, mnv, wdir, wspd); + //this line was nsharpNative.nsharpLib.mean_wind( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.agl(6000)), mnu, mnv, wdir, wspd); //System.out.println("wsp ="+ wspd.getValue()+ " wdir "+ wdir.getValue() + " agl(6000)="+nsharpNative.nsharpLib.agl(6000)+ " preAt6000="+nsharpNative.nsharpLib.i_pres(nsharpNative.nsharpLib.agl(6000))); if(nsharpNative.nsharpLib.qc(wdir.getValue()) == 1 && nsharpNative.nsharpLib.qc(wspd.getValue())== 1) { textStr = NsharpNativeConstants.MEANWIND_SFC6KM_LINE; @@ -2520,8 +2523,33 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ VerticalAlignment.TOP, null); } curY = curY + charHeight; + + + + //fix TT 549890 + //Calculate mean wind at LFC-EL, following the same algorithm used in drawPanel2() for LCL_EL for BigNsharp pag + // Replacing LCL with LFC + _lplvalues lpvls; + _parcel pcl; + lpvls = new _lplvalues(); + pcl = new _parcel(); + float h1, h2; + h1=-1; + h2=-1; + nsharpNative.nsharpLib.get_lpvaluesData(lpvls); + + float sfctemp = lpvls.temp; + float sfcdwpt = lpvls.dwpt; + float sfcpres = lpvls.pres; + nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); + if (pcl.bplus > 0) + { + h1 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres)); + h2 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres)); + } + //Calculate mean wind at LFC-EL - nsharpNative.nsharpLib.mean_wind( -1, -1, mnu, mnv, wdir, wspd); + nsharpNative.nsharpLib.mean_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), mnu, mnv, wdir, wspd); if(nsharpNative.nsharpLib.qc(wdir.getValue())==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { textStr = NsharpNativeConstants.MEANWIND_LFC_EL_LINE; textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), @@ -2594,7 +2622,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); //Calculate wind shear at Low - 3 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(3000)), + nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(3000)), shu,shv,sdir,smag); if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { textStr = NsharpNativeConstants.SHEAR_LOW_3KM_LINE; @@ -2615,7 +2643,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ curY = curY + charHeight; //Calculate wind shear at Sfc - 2 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), + nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), shu,shv,sdir,smag); if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { textStr = NsharpNativeConstants.SHEAR_SFC_2KM_LINE; @@ -2635,7 +2663,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ curY = curY + charHeight; //Calculate wind shear at Sfc - 6 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), + nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), shu,shv,sdir,smag); if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { textStr = NsharpNativeConstants.SHEAR_SFC_6KM_LINE; @@ -2655,7 +2683,7 @@ public class NsharpDataPaneResource extends NsharpAbstractPaneResource{ curY = curY + charHeight; //Calculate wind shear at Sfc - 12 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(12000)), + nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(12000)), shu,shv,sdir,smag); if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { textStr = NsharpNativeConstants.SHEAR_SFC_12KM_LINE; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpResourceHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpResourceHandler.java index 6846736319..3a17090ad6 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpResourceHandler.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpResourceHandler.java @@ -1013,7 +1013,7 @@ public class NsharpResourceHandler { return 0; } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); + //System.out.println("t1="+s1tok1+" t2="+s2tok1); StringTokenizer st2 = new StringTokenizer(o2.getTimeDescription()); int tkCount2 = st2.countTokens(); //System.out.println("ElementComparatorTimeLine o2="+o2.elementDescription+"c2 = "+tkCount2); @@ -1557,6 +1557,7 @@ public class NsharpResourceHandler { String elmDesc = tempTimeLineArr[i].toString(); String stnId = elmDesc.substring(0,elmDesc.indexOf(" ")); String timeLine= elmDesc.substring(elmDesc.indexOf(" ")+1); + timeLine = timeLine.replace(" ", "-"); //fixed DR15325 - sorting time line issue in D2D //add time line to stnTimeTable and set its index addElementToTableAndLists(elmDesc,stnId,timeLine,stnInfo); } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSkewTPaneResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSkewTPaneResource.java index 4c362f48f4..7d668dd183 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSkewTPaneResource.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSkewTPaneResource.java @@ -120,8 +120,8 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ private IShadedShape cloudFMShape = null; private IWireframeShape cloudFMLabelShape = null; private IShadedShape cloudCEShape = null; - private IWireframeShape parcelTraceRscShape; - private IWireframeShape parcelAscentRscShape; + private IWireframeShape parcelVtTraceRscShape; //Virtual temp Parcel trace + private IWireframeShape parcelRtRscShape; //Real temp parcel trace private IWireframeShape dacpeTraceRscShape; private ListpressureTempRscShapeList = new ArrayList(); //ICING wireframe shape @@ -1253,16 +1253,16 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ target.drawWireframeShape(vtempTraceCurveRscShape,lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); } // parcel trace curve - if(graphConfigProperty.isParcel() == true && !compareStnIsOn && !compareTmIsOn){ + if(graphConfigProperty.isParcelTv() == true && !compareStnIsOn && !compareTmIsOn){ if(soundingLys.size() > 0){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]); - target.drawWireframeShape(parcelTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); + NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]); + target.drawWireframeShape(parcelVtTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); } } - if(graphConfigProperty.isParcelAscent() == true && !compareStnIsOn && !compareTmIsOn){ + if(graphConfigProperty.isParcel() == true && !compareStnIsOn && !compareTmIsOn){ if(soundingLys.size() > 0){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_ASCENT]); - target.drawWireframeShape(parcelAscentRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); + NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]); + target.drawWireframeShape(parcelRtRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); } } @@ -1314,10 +1314,10 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ target.drawWireframeShape(vtempTraceCurveRscShape,lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); // parcel trace curve + lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_TV]); + target.drawWireframeShape(parcelVtTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]); - target.drawWireframeShape(parcelTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); - lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL_ASCENT]); - target.drawWireframeShape(parcelAscentRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); + target.drawWireframeShape(parcelRtRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); if(dacpeTraceRscShape != null){ lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DCAPE]); target.drawWireframeShape(dacpeTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10); @@ -1456,22 +1456,22 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ } public void createRscParcelTraceShapes( short parcelType, float userPre){ //System.out.println("createRscParcelTraceShape called defoine_parcel pType="+parcelType+" pre="+ userPre+ " BY:"+this.toString()); - if(parcelTraceRscShape != null){ - parcelTraceRscShape.dispose(); - parcelTraceRscShape = null; + if(parcelVtTraceRscShape != null){ + parcelVtTraceRscShape.dispose(); + parcelVtTraceRscShape = null; } - if(parcelAscentRscShape != null){ - parcelAscentRscShape.dispose(); - parcelAscentRscShape = null; + if(parcelRtRscShape != null){ + parcelRtRscShape.dispose(); + parcelRtRscShape = null; } if(dacpeTraceRscShape != null){ dacpeTraceRscShape.dispose(); dacpeTraceRscShape = null; } - parcelTraceRscShape= target.createWireframeShape(false,descriptor ); - parcelTraceRscShape.allocate(40); - parcelAscentRscShape= target.createWireframeShape(false,descriptor ); - parcelAscentRscShape.allocate(40); + parcelVtTraceRscShape= target.createWireframeShape(false,descriptor ); + parcelVtTraceRscShape.allocate(40); + parcelRtRscShape= target.createWireframeShape(false,descriptor ); + parcelRtRscShape.allocate(40); dacpeTraceRscShape= target.createWireframeShape(false,descriptor ); dacpeTraceRscShape.allocate(40); //call native define_parcel() with parcel type and user defined pressure (if user defined it) @@ -1497,7 +1497,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ c2.y = world.mapY(c2.y); double [][] lines = {{c1.x, c1.y},{c2.x, c2.y}}; - parcelTraceRscShape.addLineSegment(lines); + parcelVtTraceRscShape.addLineSegment(lines); c1 = c2; Coordinate a1 = NsharpWxMath.getSkewTXY(sfcpres, sfctemp); @@ -1508,7 +1508,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ a2.y = world.mapY(a2.y); double [][] alines = {{a1.x, a1.y},{a2.x, a2.y}}; - parcelAscentRscShape.addLineSegment(alines); + parcelRtRscShape.addLineSegment(alines); a1 = a2; float t3; @@ -1521,14 +1521,14 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ c2.y = world.mapY(c2.y); double [][] lines1 = {{c1.x, c1.y},{c2.x, c2.y}}; - parcelTraceRscShape.addLineSegment(lines1); + parcelVtTraceRscShape.addLineSegment(lines1); c1 = c2; a2 = NsharpWxMath.getSkewTXY(i, t3); a2.x = world.mapX(a2.x); a2.y = world.mapY(a2.y); double [][] alines1 = {{a1.x, a1.y},{a2.x, a2.y}}; - parcelAscentRscShape.addLineSegment(alines1); + parcelRtRscShape.addLineSegment(alines1); a1 = a2; } @@ -1539,16 +1539,16 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ c2.y = world.mapY(c2.y); double [][] lines2 = {{c1.x, c1.y},{c2.x, c2.y}}; - parcelTraceRscShape.addLineSegment(lines2); + parcelVtTraceRscShape.addLineSegment(lines2); a2 = NsharpWxMath.getSkewTXY(100, t3); a2.x = world.mapX(a2.x); a2.y = world.mapY(a2.y); double [][] alines1 = {{a1.x, a1.y},{a2.x, a2.y}}; - parcelAscentRscShape.addLineSegment(alines1); + parcelRtRscShape.addLineSegment(alines1); - parcelAscentRscShape.compile(); - parcelTraceRscShape.compile(); + parcelRtRscShape.compile(); + parcelVtTraceRscShape.compile(); //DCAPE------------------ //Downdraft Convective Available Potential Energy - DCAPE @@ -2410,13 +2410,13 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ parcelTraceRscShapeList.clear(); }*/ - if(parcelTraceRscShape != null){ - parcelTraceRscShape.dispose(); - parcelTraceRscShape = null; + if(parcelVtTraceRscShape != null){ + parcelVtTraceRscShape.dispose(); + parcelVtTraceRscShape = null; } - if(parcelAscentRscShape != null){ - parcelAscentRscShape.dispose(); - parcelAscentRscShape = null; + if(parcelRtRscShape != null){ + parcelRtRscShape.dispose(); + parcelRtRscShape = null; } if(dacpeTraceRscShape != null){ dacpeTraceRscShape.dispose(); @@ -2612,6 +2612,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ if (ext.getWidth() == 0.0 || ext.getHeight() == 0.0) { return; } + //System.out.println("skewtPane: handleResize"); this.rectangle = new Rectangle((int)ext.getMinX(), (int) ext.getMinY(), (int) ext.getWidth(), (int) ext.getHeight()); @@ -2652,7 +2653,7 @@ public class NsharpSkewTPaneResource extends NsharpAbstractPaneResource{ @Override public void handleZooming() { - //System.out.println("NsharpSkewTPaneResource handleZooming called! "); + if(heightMarkRscShape!=null) heightMarkRscShape.dispose(); if(omegaBkgShape!=null){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSpcGraphsPaneResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSpcGraphsPaneResource.java index 1a311c28b9..2fa8ece265 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSpcGraphsPaneResource.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpSpcGraphsPaneResource.java @@ -9,7 +9,8 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc; * * Date Ticket# Engineer Description * ------- ------- -------- ----------- - * 07/10/2012 229 Chin Chen Initial coding + * 07/10/2012 229 Chin Chen Initial coding + EBS + * 10/01/2012 Chin Chen Add STP Stats * * * @@ -19,6 +20,7 @@ package gov.noaa.nws.ncep.ui.nsharp.display.rsc; import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; import gov.noaa.nws.ncep.ui.nsharp.display.NsharpAbstractPaneDescriptor; +import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._lplvalues; import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._parcel; @@ -27,6 +29,7 @@ import gov.noaa.nws.ncep.ui.nsharp.view.NsharpPaletteWindow; import java.util.ArrayList; import java.util.List; +import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import com.raytheon.uf.viz.core.DrawableLine; @@ -105,11 +108,8 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ */ /* values in kt */ private float nonSupercell[] = {8.2f, 12.2f,14.4f,15.8f, 17.0f, 20.0f, 23.2f,27.0f, 30.4f, 32.0f}; - /*private IWireframeShape ebsBkgLblShape; - private IWireframeShape ebsBkgLineShape; - private IWireframeShape ebsSupercellShape; - private IWireframeShape ebsMrglSupShape; - private IWireframeShape ebsNonSupSgape;*/ + + ; public NsharpSpcGraphsPaneResource(AbstractResourceData resourceData, LoadProperties loadProperties, NsharpAbstractPaneDescriptor desc) { super(resourceData, loadProperties, desc); @@ -141,37 +141,1221 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ xend = spcRightXOrig + spcFrameWidth; } } + /* + * This function is based on show_sars() in xwvid3.c of BigNsharp + * + */ + private void plotSars(int side) throws VizException{ + nsharpNative.setSarsSupcellFileName(); + NsharpNative.NsharpLibrary.SarsInfoStr sarsInfo = new NsharpNative.NsharpLibrary.SarsInfoStr(); + nsharpNative.nsharpLib.getSarsInfo(sarsInfo); + List lineList = new ArrayList(); + List strList = new ArrayList(); + this.font11.setSmoothing(false); + this.font11.setScaleFont(false); + this.font12.setSmoothing(false); + this.font12.setScaleFont(false); + this.font10.setSmoothing(false); + setXyStartingPosition(side); + DrawableString titleStr = new DrawableString("SARS - Sounding Analog System", NsharpConstants.color_white); + titleStr.font = font12; + titleStr.horizontalAlignment = HorizontalAlignment.LEFT; + titleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.25 *spcFrameWidth; + ypos = ystart; + titleStr.setCoordinates(xpos, ypos); + strList.add(titleStr); + + DrawableLine line1 = new DrawableLine(); + line1.lineStyle = LineStyle.SOLID; + line1.basics.color = NsharpConstants.color_white; + line1.width = 1; + ypos = ypos + 2* charHeight; + line1.setCoordinates(xstart, ypos); + line1.addPoint(xend, ypos); + lineList.add(line1); + + DrawableLine line2 = new DrawableLine(); + line2.lineStyle = LineStyle.SOLID; + line2.basics.color = NsharpConstants.color_white; + line2.width = 1; + xpos = xstart + 0.5 *spcFrameWidth; + line2.setCoordinates(xpos, ypos); + line2.addPoint(xpos, ypos+spcHeight); + lineList.add(line2); + + DrawableString supercellTitleStr = new DrawableString("SUPERCELL", NsharpConstants.color_white); + supercellTitleStr.font = font11; + supercellTitleStr.horizontalAlignment = HorizontalAlignment.LEFT; + supercellTitleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.15 *spcFrameWidth; + ypos = ypos + 0.5* charHeight; + supercellTitleStr.setCoordinates(xpos, ypos); + strList.add(supercellTitleStr); + + DrawableString hailTitleStr = new DrawableString("SGFNT HAIL", NsharpConstants.color_white); + hailTitleStr.font = font11; + hailTitleStr.horizontalAlignment = HorizontalAlignment.LEFT; + hailTitleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.65 *spcFrameWidth; + hailTitleStr.setCoordinates(xpos, ypos); + strList.add(hailTitleStr); + + DrawableLine line3 = new DrawableLine(); + line3.lineStyle = LineStyle.SOLID; + line3.basics.color = NsharpConstants.color_white; + line3.width = 1; + ypos = ypos + 2* charHeight; + line3.setCoordinates(xstart, ypos); + line3.addPoint(xend, ypos); + lineList.add(line3); + + //int numHailstr = sarsInfo.getNumHailstr(); + //int numSupstr = sarsInfo.getNumsupcellstr(); + //since numHailstr and numSupstr should be 10, based on design, + // we do both together. + + for(int i=0; i < NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LINES; i++){ + ypos = ypos + charHeight; + String supStr = new String(sarsInfo.getSupcellStr(), (i*NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN), NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN); + //System.out.println("supercell str #"+ (i+1)+ " "+ supStr); + int nulCharIndex=supStr.indexOf('\0'); + if(nulCharIndex>0 && nulCharIndex < NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN){ + supStr = supStr.substring(0, nulCharIndex);// get rid of tailing null char(s), as DrawableString will print them out + RGB strColor = NsharpConstants.gempakColorToRGB.get(sarsInfo.getSupcellStrColor()[i]); + DrawableString supercellMatchStr = new DrawableString(supStr, strColor); + supercellMatchStr.font = font10; + supercellMatchStr.horizontalAlignment = HorizontalAlignment.LEFT; + supercellMatchStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart ; + supercellMatchStr.setCoordinates(xpos, ypos); + strList.add(supercellMatchStr); + } + String hailStr = new String(sarsInfo.getHailStr(), (i*NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN), NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN); + nulCharIndex=hailStr.indexOf('\0'); + // make sure this line is valid + if(nulCharIndex>0 && nulCharIndex < NsharpNative.NsharpLibrary.SarsInfoStr.SARS_STRING_LEN){ + hailStr = hailStr.substring(0, nulCharIndex);// get rid of tailing null char(s), as DrawableString will print them out + //System.out.println("java hail str #"+ (i+1)+ " "+ hailStr); + RGB strColor = NsharpConstants.gempakColorToRGB.get(sarsInfo.getHailStrColor()[i]); + DrawableString hailMatchStr = new DrawableString(hailStr, strColor); + hailMatchStr.font = font10; + hailMatchStr.horizontalAlignment = HorizontalAlignment.LEFT; + hailMatchStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.51 *spcFrameWidth; + hailMatchStr.setCoordinates(xpos, ypos); + strList.add(hailMatchStr); + + } + //else + // System.out.println("java hail str #"+ (i+1)+ " "+ hailStr); + + } + /* + ypos = spcYEnd - 4 * charHeight; + for(int i=0; i < 2; i++){ + String supStr = new String(sarsInfo.getTorStr(), (i*60), 60); + //System.out.println("tor str #"+ (1+ i)+ " "+ supStr); + RGB strColor = NsharpConstants.gempakColorToRGB.get(sarsInfo.getTorStrColor()); + supStr = supStr.substring(0, supStr.indexOf('\0'));// get rid of tailing null char(s), as DrawableString will print them out + DrawableString supercellMatchStr = new DrawableString(supStr, strColor); + supercellMatchStr.font = font10; + supercellMatchStr.horizontalAlignment = HorizontalAlignment.LEFT; + supercellMatchStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart ; + ypos = ypos + charHeight; + supercellMatchStr.setCoordinates(xpos, ypos); + strList.add(supercellMatchStr); + + String sighailStr = new String(sarsInfo.getSighailStr(), (i*60), 60); + //System.out.println("sighail str #"+ (1+ i)+ " "+ sighailStr); + RGB strColor1 = NsharpConstants.gempakColorToRGB.get(sarsInfo.getSighailStrColor()); + sighailStr = sighailStr.substring(0, sighailStr.indexOf('\0'));// get rid of tailing null char(s), as DrawableString will print them out + DrawableString sighailMatchStr = new DrawableString(sighailStr, strColor1); + sighailMatchStr.font = font10; + sighailMatchStr.horizontalAlignment = HorizontalAlignment.LEFT; + sighailMatchStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.51 *spcFrameWidth; + sighailMatchStr.setCoordinates(xpos, ypos); + strList.add(sighailMatchStr); + }*/ + + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + } + /* + * This function is based on show_fire() in xwvid3.c of BigNsharp + * + */ + private void plotFire(int side) throws VizException{ + NsharpNative.NsharpLibrary.FireInfoStr fireInfo = new NsharpNative.NsharpLibrary.FireInfoStr(); + nsharpNative.nsharpLib.getFireInfo(fireInfo); + String sfcRh = new String(fireInfo.getSfcRh()); + String sfc = new String(fireInfo.getSfc()); + String zeroOneKmRh = new String(fireInfo.getZeroOneKmRh()); + String zeroOneKmMean = new String(fireInfo.getZeroOneKmMean()); + String blMeanRh = new String(fireInfo.getBlMeanRh()); + String blMean = new String(fireInfo.getBlMean()); + String pw = new String(fireInfo.getPw()); + String blMax = new String(fireInfo.getBlMax()); + String fosberg = new String(fireInfo.getFosberg()); + RGB sfcRhColor = NsharpConstants.gempakColorToRGB.get(fireInfo.getSfcRhColor()); + RGB pwColor = NsharpConstants.gempakColorToRGB.get(fireInfo.getPwColor()); + RGB blMaxColor = NsharpConstants.gempakColorToRGB.get(fireInfo.getBlMaxColor()); + RGB fosbergColor = NsharpConstants.gempakColorToRGB.get(fireInfo.getFosbergColor()); + List lineList = new ArrayList(); + List strList = new ArrayList(); + this.font11.setSmoothing(false); + this.font11.setScaleFont(false); + this.font12.setSmoothing(false); + this.font12.setScaleFont(false); + this.font10.setSmoothing(false); + setXyStartingPosition(side); + DrawableString titleStr = new DrawableString("Fire Weather Parameters", NsharpConstants.color_white); + titleStr.font = font12; + titleStr.horizontalAlignment = HorizontalAlignment.LEFT; + titleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.25 *spcFrameWidth; + ypos = ystart; + titleStr.setCoordinates(xpos, ypos); + strList.add(titleStr); + DrawableString moistureTStr = new DrawableString("Moisture", NsharpConstants.color_lawngreen); + moistureTStr.font = font12; + moistureTStr.horizontalAlignment = HorizontalAlignment.LEFT; + moistureTStr.verticallAlignment = VerticalAlignment.TOP; + double xleft = xstart + 0.1 *spcFrameWidth; + ypos = ypos+2*charHeight; + moistureTStr.setCoordinates(xleft, ypos); + strList.add(moistureTStr); + DrawableString llWindTStr = new DrawableString("Low-Level Wind", NsharpConstants.color_dodgerblue); + llWindTStr.font = font12; + llWindTStr.horizontalAlignment = HorizontalAlignment.LEFT; + llWindTStr.verticallAlignment = VerticalAlignment.TOP; + double xright = xstart + 0.5 *spcFrameWidth; + llWindTStr.setCoordinates(xright, ypos); + strList.add(llWindTStr); + DrawableLine line1 = new DrawableLine(); + line1.lineStyle = LineStyle.SOLID; + line1.basics.color = NsharpConstants.color_white; + line1.width = 1; + ypos = ypos + 2* charHeight; + line1.setCoordinates(xstart, ypos); + line1.addPoint(xend, ypos); + lineList.add(line1); + DrawableString sfcRhStr = new DrawableString(sfcRh.trim(), sfcRhColor); + sfcRhStr.font = font12; + sfcRhStr.horizontalAlignment = HorizontalAlignment.LEFT; + sfcRhStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+charHeight; + sfcRhStr.setCoordinates(xleft, ypos); + strList.add(sfcRhStr); + DrawableString sfcStr = new DrawableString(sfc.trim(), NsharpConstants.color_white); + sfcStr.font = font10; + sfcStr.horizontalAlignment = HorizontalAlignment.LEFT; + sfcStr.verticallAlignment = VerticalAlignment.TOP; + sfcStr.setCoordinates(xright, ypos); + strList.add(sfcStr); + DrawableString zeroOneRhStr = new DrawableString(zeroOneKmRh.trim(), NsharpConstants.color_white); + zeroOneRhStr.font = font10; + zeroOneRhStr.horizontalAlignment = HorizontalAlignment.LEFT; + zeroOneRhStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+2*charHeight; + zeroOneRhStr.setCoordinates(xleft, ypos); + strList.add(zeroOneRhStr); + DrawableString zeroOneKmMeanStr = new DrawableString(zeroOneKmMean.trim(), NsharpConstants.color_white); + zeroOneKmMeanStr.font = font10; + zeroOneKmMeanStr.horizontalAlignment = HorizontalAlignment.LEFT; + zeroOneKmMeanStr.verticallAlignment = VerticalAlignment.TOP; + zeroOneKmMeanStr.setCoordinates(xright, ypos); + strList.add(zeroOneKmMeanStr); + DrawableString blMeanRhStr = new DrawableString(blMeanRh.trim(), NsharpConstants.color_white); + blMeanRhStr.font = font10; + blMeanRhStr.horizontalAlignment = HorizontalAlignment.LEFT; + blMeanRhStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+2*charHeight; + blMeanRhStr.setCoordinates(xleft, ypos); + strList.add(blMeanRhStr); + DrawableString blMeanStr = new DrawableString(blMean.trim(), NsharpConstants.color_white); + blMeanStr.font = font10; + blMeanStr.horizontalAlignment = HorizontalAlignment.LEFT; + blMeanStr.verticallAlignment = VerticalAlignment.TOP; + blMeanStr.setCoordinates(xright, ypos); + strList.add(blMeanStr); + DrawableString pwStr = new DrawableString(pw.trim(), pwColor); + if(pwColor.equals(NsharpConstants.color_red)) + pwStr.font = font12; + else + pwStr.font = font10; + pwStr.horizontalAlignment = HorizontalAlignment.LEFT; + pwStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+2*charHeight; + pwStr.setCoordinates(xleft, ypos); + strList.add(pwStr); + DrawableString blMaxStr = new DrawableString(blMax.trim(), blMaxColor); + blMaxStr.font = font12; + blMaxStr.horizontalAlignment = HorizontalAlignment.LEFT; + blMaxStr.verticallAlignment = VerticalAlignment.TOP; + blMaxStr.setCoordinates(xright, ypos); + strList.add(blMaxStr); + DrawableString derivedTStr = new DrawableString("Derived Indices", NsharpConstants.color_orange); + derivedTStr.font = font12; + derivedTStr.horizontalAlignment = HorizontalAlignment.LEFT; + derivedTStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+4*charHeight; + derivedTStr.setCoordinates(xstart + 0.3 *spcFrameWidth, ypos); + strList.add(derivedTStr); + DrawableLine line2 = new DrawableLine(); + line2.lineStyle = LineStyle.SOLID; + line2.basics.color = NsharpConstants.color_orange; + line2.width = 1; + ypos = ypos + 2* charHeight; + line2.setCoordinates(xstart, ypos); + line2.addPoint(xend, ypos); + lineList.add(line2); + DrawableString fosbergStr = new DrawableString(fosberg.trim(), fosbergColor); + fosbergStr.font = font12; + fosbergStr.horizontalAlignment = HorizontalAlignment.LEFT; + fosbergStr.verticallAlignment = VerticalAlignment.TOP; + ypos = ypos+2*charHeight; + fosbergStr.setCoordinates(xstart + 0.27 *spcFrameWidth, ypos); + strList.add(fosbergStr); + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + } + /* + * This function is based on show_winter_new() in xwvid3.c of BigNsharp + * + */ + private void plotWinter(int side) throws VizException{ + NsharpNative.NsharpLibrary.WinterInfoStr winterInfo = new NsharpNative.NsharpLibrary.WinterInfoStr(); + nsharpNative.nsharpLib.getWinterInfo(winterInfo); + String temp1 = new String(winterInfo.getTempProfile1()); + String temp2 = new String(winterInfo.getTempProfile2()); + String temp3 = new String(winterInfo.getTempProfile3()); + String wetbulb1 = new String(winterInfo.getWetbulbProfile1()); + String wetbulb2 = new String(winterInfo.getWetbulbProfile2()); + String wetbulb3 = new String(winterInfo.getWetbulbProfile3()); + String bestGuess1 = new String(winterInfo.getBestGuess1()); + String bestGuess2 = new String(winterInfo.getBestGuess2()); + String initPhase = new String(winterInfo.getInitPhase()); + String meanLayerMixRat = new String(winterInfo.getMeanLayerMixRat()); + String meanLayerOmega = new String(winterInfo.getMeanLayerOmega()); + String meanLayerPw = new String(winterInfo.getMeanLayerPw()); + String meanLayerRh = new String(winterInfo.getMeanLayerRh()); + String layerDepth = new String(winterInfo.getLayerDepth()); + String oprh = new String(winterInfo.getOprh()); + //System.out.println("oprh=" +oprh); + //System.out.println("temp2=" +temp2); + List lineList = new ArrayList(); + List strList = new ArrayList(); + this.font11.setSmoothing(false); + this.font11.setScaleFont(false); + this.font12.setSmoothing(false); + this.font12.setScaleFont(false); + this.font10.setSmoothing(false); + setXyStartingPosition(side); + DrawableString titleStr = new DrawableString(" * * * DENDRITIC GROWTH ZONE (-12 to -17C) * * *", NsharpConstants.color_yellow); + titleStr.font = font11; + titleStr.horizontalAlignment = HorizontalAlignment.LEFT; + titleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.1 *spcFrameWidth; + ypos = ystart; + titleStr.setCoordinates(xpos, ypos); + strList.add(titleStr); + RGB oprhColor; + if (winterInfo.getMopw() < -.1f) + oprhColor = NsharpConstants.color_red; //setcolor(13); + else + oprhColor = NsharpConstants.color_white;//setcolor(31); + + DrawableString oprhStr = new DrawableString(oprh.trim(), oprhColor); + oprhStr.font = font10; + oprhStr.horizontalAlignment = HorizontalAlignment.LEFT; + oprhStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *spcFrameWidth; + ypos = ypos + 1.5* charHeight;; + oprhStr.setCoordinates(xpos, ypos); + strList.add(oprhStr); + + DrawableString layerDepthStr = new DrawableString(layerDepth.trim(), NsharpConstants.color_white); + layerDepthStr.font = font10; + layerDepthStr.horizontalAlignment = HorizontalAlignment.LEFT; + layerDepthStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight;; + layerDepthStr.setCoordinates(xpos, ypos); + strList.add(layerDepthStr); + + DrawableString meanLayerRhStr = new DrawableString(meanLayerRh.trim(), NsharpConstants.color_white); + meanLayerRhStr.font = font10; + meanLayerRhStr.horizontalAlignment = HorizontalAlignment.LEFT; + meanLayerRhStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight;; + meanLayerRhStr.setCoordinates(xpos, ypos); + strList.add(meanLayerRhStr); + + DrawableLine line = new DrawableLine(); + line.lineStyle = LineStyle.SOLID; + line.basics.color = NsharpConstants.color_white; + line.width = 1; + xpos = xstart + 0.5 *spcFrameWidth; + line.setCoordinates(xpos, ypos); + line.addPoint(xpos, ypos+3*charHeight); + lineList.add(line); + + DrawableString meanLayerMixRatStr = new DrawableString(meanLayerMixRat.trim(), NsharpConstants.color_white); + meanLayerMixRatStr.font = font10; + meanLayerMixRatStr.horizontalAlignment = HorizontalAlignment.LEFT; + meanLayerMixRatStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + meanLayerMixRatStr.setCoordinates(xpos, ypos); + strList.add(meanLayerMixRatStr); + + DrawableString meanLayerPwStr = new DrawableString(meanLayerPw.trim(), NsharpConstants.color_white); + meanLayerPwStr.font = font10; + meanLayerPwStr.horizontalAlignment = HorizontalAlignment.LEFT; + meanLayerPwStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight;; + meanLayerPwStr.setCoordinates(xpos, ypos); + strList.add(meanLayerPwStr); + + DrawableString meanLayerOmegaStr = new DrawableString(meanLayerOmega.trim(), NsharpConstants.color_white); + meanLayerOmegaStr.font = font10; + meanLayerOmegaStr.horizontalAlignment = HorizontalAlignment.LEFT; + meanLayerOmegaStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + meanLayerOmegaStr.setCoordinates(xpos, ypos); + strList.add(meanLayerOmegaStr); + + DrawableLine line1 = new DrawableLine(); + line1.lineStyle = LineStyle.SOLID; + line1.basics.color = NsharpConstants.color_white; + line1.width = 1; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight; + line1.setCoordinates(xpos, ypos); + line1.addPoint(xend - charWidth, ypos); + lineList.add(line1); + + DrawableString initPhaseStr = new DrawableString(initPhase.trim(), NsharpConstants.color_white); + initPhaseStr.font = font10; + initPhaseStr.horizontalAlignment = HorizontalAlignment.LEFT; + initPhaseStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 0.5*charHeight; + initPhaseStr.setCoordinates(xpos, ypos); + strList.add(initPhaseStr); + + DrawableLine line2 = new DrawableLine(); + line2.lineStyle = LineStyle.SOLID; + line2.basics.color = NsharpConstants.color_white; + line2.width = 1; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight; + line2.setCoordinates(xpos, ypos); + line2.addPoint(xend - charWidth, ypos); + lineList.add(line2); + + DrawableLine line3 = new DrawableLine(); + line3.lineStyle = LineStyle.SOLID; + line3.basics.color = NsharpConstants.color_white; + line3.width = 1; + xpos = xstart + 0.5 *spcFrameWidth; + line3.setCoordinates(xpos, ypos); + double line3End = ypos+6.5*charHeight; + line3.addPoint(xpos, line3End); + lineList.add(line3); + + DrawableString tempProfileTitleStr = new DrawableString("TEMPERATURE PROFILE", NsharpConstants.color_white); + tempProfileTitleStr.font = font10; + tempProfileTitleStr.horizontalAlignment = HorizontalAlignment.LEFT; + tempProfileTitleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 0.5* charHeight; + tempProfileTitleStr.setCoordinates(xpos, ypos); + strList.add(tempProfileTitleStr); + + DrawableString wetbulbTitleStr = new DrawableString("WETBULB PROFILE", NsharpConstants.color_white); + wetbulbTitleStr.font = font10; + wetbulbTitleStr.horizontalAlignment = HorizontalAlignment.LEFT; + wetbulbTitleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + wetbulbTitleStr.setCoordinates(xpos, ypos); + strList.add(wetbulbTitleStr); + + DrawableString temp1Str = new DrawableString(temp1.trim(), NsharpConstants.color_white); + temp1Str.font = font10; + temp1Str.horizontalAlignment = HorizontalAlignment.LEFT; + temp1Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight; + temp1Str.setCoordinates(xpos, ypos); + strList.add(temp1Str); + + DrawableString wetbulb1Str = new DrawableString(wetbulb1.trim(), NsharpConstants.color_white); + wetbulb1Str.font = font10; + wetbulb1Str.horizontalAlignment = HorizontalAlignment.LEFT; + wetbulb1Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + wetbulb1Str.setCoordinates(xpos, ypos); + strList.add(wetbulb1Str); + + DrawableString temp2Str = new DrawableString(temp2.trim(), NsharpConstants.color_white); + temp2Str.font = font10; + temp2Str.horizontalAlignment = HorizontalAlignment.LEFT; + temp2Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight; + temp2Str.setCoordinates(xpos, ypos); + strList.add(temp2Str); + + DrawableString wetbulb2Str = new DrawableString(wetbulb2.trim(), NsharpConstants.color_white); + wetbulb2Str.font = font10; + wetbulb2Str.horizontalAlignment = HorizontalAlignment.LEFT; + wetbulb2Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + wetbulb2Str.setCoordinates(xpos, ypos); + strList.add(wetbulb2Str); + + DrawableString temp3Str = new DrawableString(temp3.trim(), NsharpConstants.color_white); + temp3Str.font = font10; + temp3Str.horizontalAlignment = HorizontalAlignment.LEFT; + temp3Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.3 *charWidth; + ypos = ypos + 1.5* charHeight; + temp3Str.setCoordinates(xpos, ypos); + strList.add(temp3Str); + + DrawableString wetbulb3Str = new DrawableString(wetbulb3.trim(), NsharpConstants.color_white); + wetbulb3Str.font = font10; + wetbulb3Str.horizontalAlignment = HorizontalAlignment.LEFT; + wetbulb3Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.5 *charWidth + 0.5 *spcFrameWidth; + wetbulb3Str.setCoordinates(xpos, ypos); + strList.add(wetbulb3Str); + + DrawableLine line4 = new DrawableLine(); + line4.lineStyle = LineStyle.SOLID; + line4.basics.color = NsharpConstants.color_white; + line4.width = 1; + xpos = xstart + 0.3 *charWidth; + line4.setCoordinates(xpos, line3End); + line4.addPoint(xend - charWidth, line3End); + lineList.add(line4); + + DrawableString bestGuessTitleStr = new DrawableString("* * * BEST GUESS PRECIP TYPE * * *", NsharpConstants.color_white); + bestGuessTitleStr.font = font10; + bestGuessTitleStr.horizontalAlignment = HorizontalAlignment.LEFT; + bestGuessTitleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.25 *spcFrameWidth; + ypos = ypos + 2* charHeight; + bestGuessTitleStr.setCoordinates(xpos, ypos); + strList.add(bestGuessTitleStr); + + DrawableString bestGuess1Str = new DrawableString(bestGuess1.trim(), NsharpConstants.color_white); + bestGuess1Str.font = font12; + bestGuess1Str.horizontalAlignment = HorizontalAlignment.LEFT; + bestGuess1Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.45 *spcFrameWidth; + ypos = ypos + 1.5* charHeight; + bestGuess1Str.setCoordinates(xpos, ypos); + strList.add(bestGuess1Str); + + DrawableString bestGuess2Str = new DrawableString(bestGuess2.trim(), NsharpConstants.color_white); + bestGuess2Str.font = font10; + bestGuess2Str.horizontalAlignment = HorizontalAlignment.LEFT; + bestGuess2Str.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.25 *spcFrameWidth; + ypos = ypos + 1.5* charHeight; + bestGuess2Str.setCoordinates(xpos, ypos); + strList.add(bestGuess2Str); + + + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + } + /* + * This function is based on show_ship_stats() in xwvid3.c of BigNsharp + */ + private void plotSHIP(int side) throws VizException{ + List lineList = new ArrayList(); + List strList = new ArrayList(); + this.font12.setSmoothing(false); + this.font12.setScaleFont(false); + this.font10.setSmoothing(false); + //this.font10.setScaleFont(false); + setXyStartingPosition(side); + DrawableString titleStr = new DrawableString("Significant Hail Parameter (SHIP)", NsharpConstants.color_white); + titleStr.font = font12; + titleStr.horizontalAlignment = HorizontalAlignment.LEFT; + titleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.1 *spcFrameWidth; + ypos = ystart; + titleStr.setCoordinates(xpos, ypos); + strList.add(titleStr); + + //Plot Y-Coord hash marks + int maxSHIPValue = 7; + //shipDist = one unit of SHIP distance in Y-axis + // 7 SHIP unit in total at Y axis + ypos = ypos + 2* charHeight; + double shipDist = (spcYEnd - 2 * charHeight- ypos)/7.0; + double ship7Ypos = ypos; + for (int i = maxSHIPValue; i >=0; i--) { + DrawableString lb = new DrawableString(Integer.toString(i), NsharpConstants.color_white); + lb.font = font10; + lb.horizontalAlignment = HorizontalAlignment.LEFT; + lb.verticallAlignment = VerticalAlignment.MIDDLE; + xpos = xstart; + lb.setCoordinates(xpos, ypos); + strList.add(lb); + DrawableLine line = new DrawableLine(); + line.lineStyle = LineStyle.DASHED; + line.basics.color = NsharpConstants.temperatureColor; + line.width = 1; + xpos = xpos + 2 *charWidth; + line.setCoordinates(xpos, ypos); + line.addPoint(xend, ypos); + lineList.add(line); + ypos = ypos + shipDist; + } + //plot hail box and whiskers + double ship0Ypos = ypos-shipDist; + double shipHeight= ship0Ypos - ship7Ypos; + double boxWidth = (xend - xstart)/ 5.0; + // nonsig hail box and whiskers values + //s90th = 1.6; + //s75th = 1.0; + //s25th = 0.4; + //s10th = 0.3; + // sig hail box and whiskers values + //s90th = 3.2; + //s75th = 2.5; + //s25th = 1.3; + //s10th = 1.0; + String boxName[] = {"< 2in",">= 2in"}; + double boxWhiskerValue[][] = { {1.6,1.0,0.4,0.3}, {3.2,2.5,1.3,1.0}}; + for (int i = 0; i <2; i++) { + DrawableString lb = new DrawableString(boxName[i], NsharpConstants.color_white); + lb.font = font10; + lb.horizontalAlignment = HorizontalAlignment.CENTER; + lb.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + (xend - xstart)/ 3.0* (i+1); + lb.setCoordinates(xpos, ship0Ypos+0.5*charWidth); + strList.add(lb); + DrawableLine upWhiskerline = new DrawableLine(); + upWhiskerline.lineStyle = LineStyle.SOLID; + upWhiskerline.basics.color = NsharpConstants.color_lawngreen; + upWhiskerline.width = 3; + double s90Ypos = ship0Ypos - (boxWhiskerValue[i][0]/7.0*shipHeight); + upWhiskerline.setCoordinates(xpos, s90Ypos); + double s75Ypos = ship0Ypos - (boxWhiskerValue[i][1]/7.0*shipHeight); + upWhiskerline.addPoint(xpos, s75Ypos); + lineList.add(upWhiskerline); + + double s25Ypos = ship0Ypos - (boxWhiskerValue[i][2]/7.0*shipHeight); + PixelExtent pixExt1 = new PixelExtent(xpos-boxWidth/2.0, xpos+boxWidth/2.0,s75Ypos,s25Ypos); + target.drawRect(pixExt1, NsharpConstants.color_lawngreen, 3.0f, 1.0f); + DrawableLine lowWiskerline = new DrawableLine(); + lowWiskerline.lineStyle = LineStyle.SOLID; + lowWiskerline.basics.color = NsharpConstants.color_lawngreen; + lowWiskerline.width = 3; + lowWiskerline.setCoordinates(xpos, s25Ypos); + double s10Ypos = ship0Ypos - (boxWhiskerValue[i][3]/7.0*shipHeight); + lowWiskerline.addPoint(xpos, s10Ypos); + lineList.add(lowWiskerline); + } + float ship = nsharpNative.nsharpLib.cave_ship(); + if(nsharpNative.nsharpLib.qc(ship)==1){ + double shipcY = ship0Ypos - (ship/7.0*shipHeight); + RGB shipColor; + if (ship >= 5) + shipColor = NsharpConstants.color_magenta; //setcolor(7); + else if (ship >= 2) + shipColor = NsharpConstants.color_red;//setcolor(2); + else if (ship >= 1) + shipColor = NsharpConstants.color_gold;//setcolor(19); + else if (ship >= .5) + shipColor = NsharpConstants.color_white;//setcolor(31); + else + shipColor = NsharpConstants.color_brown; //(ship < .5) setcolor(8); + + DrawableLine shipline = new DrawableLine(); + shipline.lineStyle = LineStyle.SOLID; + shipline.basics.color = shipColor; + shipline.width = 3; + shipline.setCoordinates(xstart, shipcY); + shipline.addPoint(xend, shipcY); + lineList.add(shipline); + } + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + } + /* + * This function is based on show_stp_stats() in xwvid3.c of BigNsharp + */ + private void plotSTP(int side) throws VizException{ + List lineList = new ArrayList(); + List strList = new ArrayList(); + this.font12.setSmoothing(false); + this.font12.setScaleFont(false); + this.font10.setSmoothing(false); + this.font10.setScaleFont(false); + setXyStartingPosition(side); + DrawableString titleStr = new DrawableString("Significant Tornado Parameter (with CIN)", NsharpConstants.color_white); + titleStr.font = font12; + titleStr.horizontalAlignment = HorizontalAlignment.LEFT; + titleStr.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + 0.1 *spcFrameWidth; + ypos = ystart; + titleStr.setCoordinates(xpos, ypos); + strList.add(titleStr); + + //Plot Y-Coord hash marks + int maxSTPValue = 11; + //stpDist = one STP unit distance in Y-axis + // 11 STP unit in total at Y axis + ypos = ypos + 1.5* charHeight; + double stpDist = (spcYEnd - 2 * charHeight- ypos)/11.0; + double stp11Ypos = ypos; + for (int i = maxSTPValue; i >=0; i--) { + DrawableString lb = new DrawableString(Integer.toString(i), NsharpConstants.color_white); + lb.font = font10; + lb.horizontalAlignment = HorizontalAlignment.LEFT; + lb.verticallAlignment = VerticalAlignment.MIDDLE; + xpos = xstart; + lb.setCoordinates(xpos, ypos); + strList.add(lb); + DrawableLine line = new DrawableLine(); + line.lineStyle = LineStyle.DASHED; + line.basics.color = NsharpConstants.temperatureColor; + line.width = 1; + xpos = xpos + 2 *charWidth; + line.setCoordinates(xpos, ypos); + line.addPoint(xend, ypos); + lineList.add(line); + ypos = ypos + stpDist; + } + + //plot tor box and whiskers + double stp0Ypos = ypos-stpDist; + double stpHeight= stp0Ypos - stp11Ypos; + double boxWidth = (xend - xstart)/ 7.0; + // sigtor box and whiskers values, see show_stp_stats() + //s90th = 6.3; + //s75th = 4.5; + //s50th = 2.2; + //s25th = 1.1; + //s10th = 0.3; + // weaktor box and whiskers values , see show_stp_stats() + //s90th = 3.4; + //s75th = 1.9; + //s50th = 0.8; + //s25th = 0.2; + //s10th = 0.0; + // nontor box and whiskers values , see show_stp_stats() + //s90th = 2.2; + //s75th = 1.0; + //s50th = 0.3; + //s25th = 0.1; + //s10th = 0.0; + String boxName[] = {"SIGTOR","WEAKTOR","NONTOR"}; + double boxWhiskerValue[][] = { {6.3,4.5,2.2,1.1,0.3}, {3.4,1.9,0.8,0.2,0.0},{2.2,1.0,0.3,0.1,0.0}}; + for (int i = 0; i <3; i++) { + DrawableString lb = new DrawableString(boxName[i], NsharpConstants.color_white); + lb.font = font10; + lb.horizontalAlignment = HorizontalAlignment.CENTER; + lb.verticallAlignment = VerticalAlignment.TOP; + xpos = xstart + (xend - xstart)/ 4.0* (i+1); + lb.setCoordinates(xpos, stp0Ypos+0.5*charWidth); + strList.add(lb); + DrawableLine upWhiskerline = new DrawableLine(); + upWhiskerline.lineStyle = LineStyle.SOLID; + upWhiskerline.basics.color = NsharpConstants.color_lawngreen; + upWhiskerline.width = 3; + double s90Ypos = stp0Ypos - (boxWhiskerValue[i][0]/11.0*stpHeight); + upWhiskerline.setCoordinates(xpos, s90Ypos); + double s75Ypos = stp0Ypos - (boxWhiskerValue[i][1]/11.0*stpHeight); + upWhiskerline.addPoint(xpos, s75Ypos); + lineList.add(upWhiskerline); + double s50Ypos = stp0Ypos - (boxWhiskerValue[i][2]/11.0*stpHeight); + PixelExtent pixExt = new PixelExtent(xpos-boxWidth/2.0, xpos+boxWidth/2.0,s75Ypos,s50Ypos); + target.drawRect(pixExt, NsharpConstants.color_lawngreen, 3.0f, 1.0f); + double s25Ypos = stp0Ypos - (boxWhiskerValue[i][3]/11.0*stpHeight); + PixelExtent pixExt1 = new PixelExtent(xpos-boxWidth/2.0, xpos+boxWidth/2.0,s50Ypos,s25Ypos); + target.drawRect(pixExt1, NsharpConstants.color_lawngreen, 3.0f, 1.0f); + DrawableLine lowWiskerline = new DrawableLine(); + lowWiskerline.lineStyle = LineStyle.SOLID; + lowWiskerline.basics.color = NsharpConstants.color_lawngreen; + lowWiskerline.width = 3; + lowWiskerline.setCoordinates(xpos, s25Ypos); + double s10Ypos = stp0Ypos - (boxWhiskerValue[i][4]/11.0*stpHeight); + lowWiskerline.addPoint(xpos, s10Ypos); + lineList.add(lowWiskerline); + } + // plot sounding value of STPC + /*_lplvalues lpvls; + _parcel pcl; + lpvls = new _lplvalues(); + nsharpNative.nsharpLib.get_lpvaluesData(lpvls); + float sfctemp, sfcdwpt, sfcpres; + sfctemp = lpvls.temp; + sfcdwpt = lpvls.dwpt; + sfcpres = lpvls.pres; + // get parcel data by calling native nsharp parcel() API. value is returned in pcl + pcl = new _parcel(); + nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl);*/ + // "STP (CIN)" + float smdir = rscHandler.getSmWindDir();//bkRsc.getSmDir(); #10438 + float smspd = rscHandler.getSmWindSpd(); + float cin = nsharpNative.nsharpLib.sigtorn_cin(smdir, smspd); + if(cin> maxSTPValue) { + cin = maxSTPValue; + } + //System.out.println("cin ="+cin); + double stpcY = stp0Ypos - (cin/11.0*stpHeight); + RGB cinColor; + if (cin >= 5.95) cinColor = NsharpConstants.color_magenta; //setcolor(7); + else if (cin >= 3.95) cinColor = NsharpConstants.color_red;//setcolor(2); + else if (cin >= 1.95) cinColor = NsharpConstants.color_gold;//setcolor(19); + else if (cin >= .45) cinColor = NsharpConstants.color_white;//setcolor(31); + else cinColor = NsharpConstants.color_brown; //(cin < .45) setcolor(8); + DrawableLine STPCline = new DrawableLine(); + STPCline.lineStyle = LineStyle.SOLID; + STPCline.basics.color = cinColor; + STPCline.width = 3; + STPCline.setCoordinates(xstart, stpcY); + STPCline.addPoint(xend, stpcY); + lineList.add(STPCline); + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + + // Calculates and plots the probability of an F2+ tornado + // (given a supercell) based on MLCAPE alone. Probabilities + // are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_mlcape() of xwvid3.c + + //tornado probability inset box + PixelExtent tboxExt; + double tboxStart = xstart + (xend-xstart)* 5.0/9.0; + double tboxValueStart; + tboxExt = new PixelExtent(tboxStart,xend,stp11Ypos, stp11Ypos + stpHeight * 4.8/11.0); + target.drawShadedRect(tboxExt, NsharpConstants.color_black, 1f, null); + target.drawRect(tboxExt, NsharpConstants.color_white, 1f, 1f); // box border line + strList.clear(); + lineList.clear(); + DrawableString lb = new DrawableString("Prob F2+ Torn with a supercell", NsharpConstants.color_white); + lb.font = font10; + lb.horizontalAlignment = HorizontalAlignment.LEFT; + lb.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = stp11Ypos; + lb.setCoordinates(xpos, ypos); + strList.add(lb); + DrawableString lb1 = new DrawableString("Sounding CLIMO = .14 sigtor", NsharpConstants.color_white); + lb1.font = font10; + lb1.horizontalAlignment = HorizontalAlignment.LEFT; + lb1.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + charHeight; + lb1.setCoordinates(xpos, ypos); + strList.add(lb1); + DrawableLine divline = new DrawableLine(); + divline.lineStyle = LineStyle.SOLID; + divline.basics.color = NsharpConstants.color_white; + divline.width = 1; + ypos = ypos + 1.2* charHeight; + divline.setCoordinates(tboxStart, ypos); + divline.addPoint(xend, ypos); + lineList.add(divline); + + short oldlplchoice; + _parcel pcl = new _parcel();; + _lplvalues lpvls = new _lplvalues(); + nsharpNative.nsharpLib.get_lpvaluesData(lpvls); + oldlplchoice = lpvls.flag; + //lift ML parcel + nsharpNative.nsharpLib.define_parcel(NsharpNativeConstants.PARCELTYPE_MEAN_MIXING, NsharpNativeConstants.MML_LAYER); + float sfctemp, sfcdwpt, sfcpres; + sfctemp = lpvls.temp; + sfcdwpt = lpvls.dwpt; + sfcpres = lpvls.pres; + // get parcel data by calling native nsharp parcel() API. value is returned in pcl + pcl = new _parcel(); + nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); + float mlcape = pcl.bplus; + String psigt_mlcape; + RGB mlcapeColor; + if (mlcape >= 4500){ + psigt_mlcape="0.31"; + mlcapeColor= NsharpConstants.color_gold;//setcolor(19); + } + else if (mlcape >= 3500 ){ + psigt_mlcape="0.23"; + mlcapeColor= NsharpConstants.color_gold;//setcolor(19); + } + else if (mlcape >= 2500 ){ + psigt_mlcape="0.25"; + mlcapeColor= NsharpConstants.color_gold;//setcolor(19); + } + else if (mlcape >= 1500 ){ + psigt_mlcape="0.14"; + mlcapeColor= NsharpConstants.color_white;//setcolor(31); + } + else if ( mlcape >= 50){ + psigt_mlcape="0.08"; + mlcapeColor= NsharpConstants.color_darkorange;//setcolor(18); + } + else { + psigt_mlcape="0.00"; + mlcapeColor= NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbCAPE = new DrawableString("based on CAPE: ",NsharpConstants.color_white); + lbCAPE.font = font10; + lbCAPE.horizontalAlignment = HorizontalAlignment.LEFT; + lbCAPE.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + lbCAPE.setCoordinates(xpos, ypos); + tboxValueStart = tboxStart + target.getStringsBounds(lbCAPE).getWidth()+ 8* charWidth; + strList.add(lbCAPE); + DrawableString valueCAPE = new DrawableString(psigt_mlcape,mlcapeColor); + valueCAPE.font = font10; + valueCAPE.horizontalAlignment = HorizontalAlignment.LEFT; + valueCAPE.verticallAlignment = VerticalAlignment.TOP; + valueCAPE.setCoordinates(tboxValueStart, ypos); + strList.add(valueCAPE); + + // (given a supercell) based on MLLCL alone. Probabilities + // are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_mllcl() of xwvid3.c + float mllcl = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres)); + String psigt_mllcl; + RGB mllclColor; + if (mllcl < 500 ){ + psigt_mllcl="0.20"; + mllclColor = NsharpConstants.color_white;//setcolor(31); + } + else if ( mllcl <= 750){ + psigt_mllcl="0.18"; + mllclColor = NsharpConstants.color_white;//setcolor(31); + } + else if ( mllcl <=1000){ + psigt_mllcl="0.23"; + mllclColor = NsharpConstants.color_gold;//setcolor(19); + } + else if ( mllcl <= 1250){ + psigt_mllcl="0.17"; + mllclColor = NsharpConstants.color_white;//setcolor(31); + } + else if ( mllcl <= 1500){ + psigt_mllcl="0.07"; + mllclColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if ( mllcl <= 1750){ + psigt_mllcl="0.07"; + mllclColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if (mllcl <= 2000){ + psigt_mllcl="0.03"; + mllclColor = NsharpConstants.color_brown;//setcolor(8); + } + else { + psigt_mllcl="0.00"; + mllclColor = NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbLCL = new DrawableString("based on LCL: ",NsharpConstants.color_white); + lbLCL.font = font10; + lbLCL.horizontalAlignment = HorizontalAlignment.LEFT; + lbLCL.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + charHeight; + lbLCL.setCoordinates(xpos, ypos); + strList.add(lbLCL); + DrawableString valueLCL = new DrawableString(psigt_mllcl,mllclColor); + valueLCL.font = font10; + valueLCL.horizontalAlignment = HorizontalAlignment.LEFT; + valueLCL.verticallAlignment = VerticalAlignment.TOP; + valueLCL.setCoordinates(tboxValueStart, ypos); + strList.add(valueLCL); + + float pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + nsharpNative.nsharpLib.define_parcel(oldlplchoice,pres); + //Calculates and plots the probability of an F2+ tornado + // (given a supercell) based on effective SRH alone. + // Probabilities are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_esrh() of xwvid3.c + FloatByReference topPF= new FloatByReference(0); + FloatByReference botPF= new FloatByReference(0); + float jh1=-999, jh2=-999; + nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); + float esrh =0f; + if (botPF.getValue() > 0) + { + jh1 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(botPF.getValue() )); + jh2 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(topPF.getValue() )); + + if(jh1!=-999&& jh2!=-999){ + FloatByReference fValue= new FloatByReference(0); + FloatByReference fValue1= new FloatByReference(0); + esrh = nsharpNative.nsharpLib.helicity(jh1, jh2, smdir, smspd, fValue, fValue1); + } + } + String psigt_esrh; + RGB esrhColor; + if (esrh > 450) { + psigt_esrh="0.37"; + esrhColor = NsharpConstants.color_red;//setcolor(2); + } + else if (esrh >= 350 ){ + psigt_esrh="0.42"; + esrhColor = NsharpConstants.color_red;//setcolor(2); + } + else if (esrh >= 250 ){ + psigt_esrh="0.21"; + esrhColor = NsharpConstants.color_gold;//setcolor(19); + } + else if (esrh >= 150){ + psigt_esrh="0.17"; + esrhColor = NsharpConstants.color_white;//setcolor(31); + } + else if (esrh >= 100){ + psigt_esrh="0.11"; + esrhColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if (esrh >= 50 ){ + psigt_esrh="0.06"; + esrhColor = NsharpConstants.color_brown;//setcolor(8); + } + else if (esrh > .01){ + psigt_esrh="0.01"; + esrhColor = NsharpConstants.color_brown;//setcolor(8); + } + else { + psigt_esrh="0.00"; + esrhColor = NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbesrh = new DrawableString("based on ESRH:",NsharpConstants.color_white); + lbesrh.font = font10; + lbesrh.horizontalAlignment = HorizontalAlignment.LEFT; + lbesrh.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + charHeight; + lbesrh.setCoordinates(xpos, ypos); + strList.add(lbesrh); + DrawableString valueEsrh = new DrawableString(psigt_esrh,esrhColor); + valueEsrh.font = font10; + valueEsrh.horizontalAlignment = HorizontalAlignment.LEFT; + valueEsrh.verticallAlignment = VerticalAlignment.TOP; + valueEsrh.setCoordinates(tboxValueStart, ypos); + strList.add(valueEsrh); + + // (given a supercell) based on effective bulk shear alone. + // Probabilities are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_eshear() of xwvid3.c + nsharpNative.nsharpLib.get_lpvaluesData(lpvls); + oldlplchoice = lpvls.flag; + //lift MU parcel + nsharpNative.nsharpLib.define_parcel(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE, NsharpNativeConstants.MU_LAYER); + + float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres)); + //float base=jh1 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(p_bot)); + float depth = (el - jh1); + FloatByReference ix1= new FloatByReference(0); + FloatByReference ix2= new FloatByReference(0); + FloatByReference ix3= new FloatByReference(0); + FloatByReference ix4= new FloatByReference(0); + nsharpNative.nsharpLib.wind_shear(botPF.getValue(), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(jh1 + (depth * 0.5f))), ix1, ix2, ix3, ix4); + float eshear = ix4.getValue(); + /* case of missing EL but effective inflow base exists - default to 0-6 km bulk shear */ + if (eshear < -99) { + eshear = 0.0f; + } + if (el < 0) { + nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), ix1, ix2, ix3, ix4); + eshear = ix4.getValue(); + } + String psigt_eshear; + RGB eshearColor; + if (eshear >=70){ + psigt_eshear="0.20"; + eshearColor = NsharpConstants.color_gold;//setcolor(19); + } + else if (eshear >=60 ){ + psigt_eshear="0.24"; + eshearColor = NsharpConstants.color_white;//setcolor(31); + } + else if (eshear >=50 ){ + psigt_eshear="0.19"; + eshearColor = NsharpConstants.color_white;//setcolor(31); + } + else if (eshear >=40 ){ + psigt_eshear="0.12"; + eshearColor = NsharpConstants.color_white;//setcolor(31); + } + else if (eshear >=30){ + psigt_eshear="0.10"; + eshearColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if (eshear >= 20){ + psigt_eshear="0.06"; + eshearColor = NsharpConstants.color_brown;//setcolor(8); + } + else { + psigt_eshear="0.00"; + eshearColor = NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbEshear= new DrawableString("based on EBS:",NsharpConstants.color_white); + lbEshear.font = font10; + lbEshear.horizontalAlignment = HorizontalAlignment.LEFT; + lbEshear.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + charHeight; + lbEshear.setCoordinates(xpos, ypos); + strList.add(lbEshear); + DrawableString valueEshear = new DrawableString(psigt_eshear,eshearColor); + valueEshear.font = font10; + valueEshear.horizontalAlignment = HorizontalAlignment.LEFT; + valueEshear.verticallAlignment = VerticalAlignment.TOP; + valueEshear.setCoordinates(tboxValueStart, ypos); + strList.add(valueEshear); + + DrawableLine dashDivline = new DrawableLine(); + dashDivline.lineStyle = LineStyle.DASHED; + dashDivline.basics.color = NsharpConstants.color_white; + dashDivline.width = 1; + ypos = ypos + 1.2* charHeight; + dashDivline.setCoordinates(tboxStart, ypos); + dashDivline.addPoint(xend, ypos); + lineList.add(dashDivline); + pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + nsharpNative.nsharpLib.define_parcel(oldlplchoice,pres); + + // (given a supercell) based on the Sigtor Parameter. + // Probabilities are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_stp() of xwvid3.c + float stp_nocin = nsharpNative.nsharpLib.sigtorn(smdir, smspd); + String psigt_stp; + RGB stpColor; + if (stp_nocin >= 8){ + psigt_stp="0.67"; + stpColor = NsharpConstants.color_magenta;//setcolor(7); + } + else if (stp_nocin >= 6){ + psigt_stp="0.48"; + stpColor = NsharpConstants.color_red;//setcolor(2); + } + else if (stp_nocin >= 4 ){ + psigt_stp="0.39"; + stpColor = NsharpConstants.color_red;//setcolor(2); + } + else if (stp_nocin >= 2 ){ + psigt_stp="0.32"; + stpColor = NsharpConstants.color_gold;//setcolor(19); + } + else if (stp_nocin >= 1){ + psigt_stp="0.20"; + stpColor = NsharpConstants.color_white;//setcolor(31); + } + else if (stp_nocin >= .5 ){ + psigt_stp="0.12"; + stpColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if (stp_nocin >= .01 ){ + psigt_stp="0.04"; + stpColor = NsharpConstants.color_brown;//setcolor(8); + } + else { + psigt_stp="0.00"; + stpColor = NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbStp= new DrawableString("based on STP:",NsharpConstants.color_white); + lbStp.font = font10; + lbStp.horizontalAlignment = HorizontalAlignment.LEFT; + lbStp.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + 0.1* charHeight; + lbStp.setCoordinates(xpos, ypos); + strList.add(lbStp); + DrawableString valueStp = new DrawableString(psigt_stp,stpColor); + valueStp.font = font10; + valueStp.horizontalAlignment = HorizontalAlignment.LEFT; + valueStp.verticallAlignment = VerticalAlignment.TOP; + valueStp.setCoordinates(tboxValueStart, ypos); + strList.add(valueStp); + + // (given a supercell) based on the Sigtor Parameter that + // includes CIN. Probabilities are derived from Thompson et al. 2005 RUC soundings + // based on prob_sigt_stpc() of xwvid3.c + String psigt_stpcin; + RGB stpcColor; + + if (cin >= 8){ + psigt_stpcin="0.78"; + stpcColor = NsharpConstants.color_magenta;//setcolor(7); + } + else if (cin >= 6){ + psigt_stpcin="0.53"; + stpcColor = NsharpConstants.color_magenta;//setcolor(7); + } + else if (cin >= 4 ){ + psigt_stpcin="0.41"; + stpcColor = NsharpConstants.color_red;//setcolor(2); + } + else if (cin >= 2 ){ + psigt_stpcin="0.27"; + stpcColor = NsharpConstants.color_gold;//setcolor(19); + } + else if (cin >= 1 ){ + psigt_stpcin="0.17"; + stpcColor = NsharpConstants.color_white;//setcolor(31); + } + else if (cin >= .5 ){ + psigt_stpcin="0.11"; + stpcColor = NsharpConstants.color_darkorange;//setcolor(18); + } + else if ( cin > .01){ + psigt_stpcin="0.03"; + stpcColor = NsharpConstants.color_brown;//setcolor(8); + } + else { + psigt_stpcin="0.00"; + stpcColor = NsharpConstants.color_brown;//setcolor(8); + } + DrawableString lbStpc= new DrawableString("based on STPC:",NsharpConstants.color_white); + lbStpc.font = font10; + lbStpc.horizontalAlignment = HorizontalAlignment.LEFT; + lbStpc.verticallAlignment = VerticalAlignment.TOP; + xpos = tboxStart + 0.5*charWidth; + ypos = ypos + charHeight; + lbStpc.setCoordinates(xpos, ypos); + strList.add(lbStpc); + DrawableString valueStpc = new DrawableString(psigt_stpcin,stpcColor); + valueStpc.font = font10; + valueStpc.horizontalAlignment = HorizontalAlignment.LEFT; + valueStpc.verticallAlignment = VerticalAlignment.TOP; + valueStpc.setCoordinates(tboxValueStart, ypos); + strList.add(valueStpc); + //reset parcel to previous "oldlplchoice" , TBD + /*float pres; + if(oldlplchoice == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){ + if(NsharpParcelDialog.getAccess() != null){ + pres = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); + } + else + pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + } + else + pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + nsharpNative.nsharpLib.define_parcel(oldlplchoice,pres); + */ + target.drawStrings(strList.toArray(new DrawableString[strList.size()])); + target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); + } /* * This function is based on show_ebs_stats() in xwvid3.c of BigNsharp */ - /* - private void createEbsShapes(){ - if(ebsBkgLblShape == null) - ebsBkgLblShape = target.createWireframeShape(false,descriptor ); - if(ebsBkgLineShape == null) - ebsBkgLineShape = target.createWireframeShape(false,descriptor ); - if(ebsSupercellShape == null) - ebsSupercellShape = target.createWireframeShape(false,descriptor ); - if(ebsMrglSupShape == null) - ebsMrglSupShape = target.createWireframeShape(false,descriptor ); - if(ebsNonSupSgape == null) - ebsNonSupSgape = target.createWireframeShape(false,descriptor ); - ypos = ystart+ 3 * charHeight; - //----- Plot Y-Coordinate hash marks, 0 - 70 kt ----- - double [][] dummyline = {{0,0}, {0,0}}; - ebsBkgLblShape.addLineSegment(dummyline); - int maxval = 70; - double ygap = (spcYEnd - 2 * charHeight- ypos)/7.0; - for (int i = maxval; i >=0; i = i - 10) { - xpos = xstart; - double [] lblXy = {xpos, ypos}; - ebsBkgLblShape.addLabel(Integer.toString(i), lblXy); - xpos = xpos + 2 *charWidth; - double [][] line = {{xpos, ypos},{xend, ypos}}; - ebsBkgLineShape.addLineSegment(line); - ypos = ypos + ygap; - } - }*/ private void plotEBS(int side) throws VizException{ List lineList = new ArrayList(); List strList = new ArrayList(); @@ -270,9 +1454,16 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ FloatByReference botPF= new FloatByReference(0); nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); float base = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(botPF.getValue())); + + short oldlplchoice; + _parcel pcl = new _parcel();; + _lplvalues lpvls = new _lplvalues(); + nsharpNative.nsharpLib.get_lpvaluesData(lpvls); + oldlplchoice = lpvls.flag; + nsharpNative.nsharpLib.define_parcel(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE,400f); - _lplvalues lpvls; - _parcel pcl; + + lpvls = new _lplvalues(); nsharpNative.nsharpLib.get_lpvaluesData(lpvls); float sfctemp, sfcdwpt, sfcpres; @@ -280,7 +1471,6 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ sfcdwpt = lpvls.dwpt; sfcpres = lpvls.pres; // get parcel data by calling native nsharp parcel() API. value is returned in pcl - pcl = new _parcel(); nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres)); if(botPF.getValue() < 0 || pcl.bplus < 100.0 || el == NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA){ @@ -313,6 +1503,17 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ } lineList.add(ebsline); } + float pres; + /*if(oldlplchoice == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){ + if(NsharpParcelDialog.getAccess() != null){ + pres = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); + } + else + pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + } + else*/ + pres = NsharpNativeConstants.parcelToLayerMap.get(oldlplchoice); + nsharpNative.nsharpLib.define_parcel(oldlplchoice,pres); target.drawStrings(strList.toArray(new DrawableString[strList.size()])); // x-axis mark number target.drawLine(lineList.toArray(new DrawableLine[lineList.size()])); } @@ -333,6 +1534,8 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ line.setCoordinates(spcRightXOrig, spcYOrig); line.addPoint(spcRightXOrig, spcYOrig+spcHeight); target.drawLine(line); + PixelExtent spcExt = new PixelExtent(new Rectangle((int)spcLeftXOrig, (int)spcYOrig,(int)spcWidth,(int)spcHeight )); + target.drawRect(spcExt, NsharpConstants.color_white, 1f, 1f); // box border line PixelExtent extent = new PixelExtent(new Rectangle((int)spcLeftXOrig, (int)spcYOrig,(int)spcFrameWidth,(int)spcHeight )); target.setupClippingPlane(extent); switch(leftGraph){ @@ -340,22 +1543,22 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ plotEBS(left); break; case STP: - underDevelopment(0); + plotSTP(left); break; case SHIP: - underDevelopment(0); + plotSHIP(left); break; case FIRE: - underDevelopment(0); + underDevelopment(0); //plotFire(left); break; case WINTER: - underDevelopment(0); + underDevelopment(0); //plotWinter(left); break; case HAIL: underDevelopment(0); break; case SARS: - underDevelopment(0); + underDevelopment(0); //plotSars(left); break; } target.clearClippingPlane(); @@ -366,22 +1569,22 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ plotEBS(right); break; case STP: - underDevelopment(1); + plotSTP(right); break; case SHIP: - underDevelopment(1); + plotSHIP(right); break; case FIRE: - underDevelopment(1); + underDevelopment(1);//plotFire(right);//underDevelopment(1); break; case WINTER: - underDevelopment(1); + underDevelopment(1);//plotWinter(right); break; case HAIL: underDevelopment(1); break; case SARS: - underDevelopment(1); + underDevelopment(1);//plotSars(right); break; } target.clearClippingPlane(); @@ -414,6 +1617,10 @@ public class NsharpSpcGraphsPaneResource extends NsharpAbstractPaneResource{ super.handleResize(); IExtent ext = getDescriptor().getRenderableDisplay().getExtent(); ext.reset(); + this.rectangle = new Rectangle((int)ext.getMinX(), (int) ext.getMinY(), + (int) ext.getWidth(), (int) ext.getHeight()); + pe = new PixelExtent(this.rectangle); + getDescriptor().setNewPe(pe); defineCharHeight(font10); spcLeftXOrig = (ext.getMinX()); spcYOrig = ext.getMinY(); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpTimeStnPaneResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpTimeStnPaneResource.java index 9ffb087f50..9df922421d 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpTimeStnPaneResource.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/display/rsc/NsharpTimeStnPaneResource.java @@ -193,7 +193,8 @@ public class NsharpTimeStnPaneResource extends NsharpAbstractPaneResource{ numTimeLineToShowPerPage=1; } int startIndex = (curTimeLinePage-1) * numTimeLineToShowPerPage; - + if(startIndex<0) + startIndex =0; if(timeLineStateList!= null){ int compIndex= 1; int colorIndex; @@ -325,6 +326,8 @@ public class NsharpTimeStnPaneResource extends NsharpAbstractPaneResource{ numStnToShow=1; } int startIndex = (rscHandler.getCurStnIdPage()-1) * numStnToShow; + if(startIndex<0) + startIndex =0; int compIndex= 1; int colorIndex; boolean compareStnIsOn = rscHandler.isCompareStnIsOn(); @@ -472,8 +475,8 @@ public class NsharpTimeStnPaneResource extends NsharpAbstractPaneResource{ getDescriptor().setNewPe(pe); defineCharHeight(font10); //rscHandler.setCharHeight(charHeight); - float prevHeight = paneHeight; - float prevWidth = paneWidth; + //float prevHeight = paneHeight; + //float prevWidth = paneWidth; paneHeight = (int) ext.getHeight(); paneWidth = (int) (ext.getWidth()); //xRatio = xRatio* paneWidth/prevWidth; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapMouseHandler.java deleted file mode 100644 index 36079d6f9d..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapMouseHandler.java +++ /dev/null @@ -1,696 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapMouseHandler - * - * This java class performs the NSHARP Modal functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; - - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.SurfaceStationPointData; -import gov.noaa.nws.ncep.ui.nsharp.menu.ModelSoundingDialogContents; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.ui.pgen.tools.InputHandlerDefaultImpl; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.progress.UIJob; -import org.geotools.referencing.GeodeticCalculator; - -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.vividsolutions.jts.geom.Coordinate; - - -//@SuppressWarnings("unchecked") -public class NsharpMapMouseHandler extends InputHandlerDefaultImpl { - - public NsharpMapMouseHandler() { - instance = this; - } - //private NsharpSkewTDisplay renderableDisplay=null; - - private static final double NctextuiPointMinDistance = 45000; - //private int prevMouseX, prevMouseY; - private static NsharpMapMouseHandler instance; - - private double lat, lon; - - /** - * Index of the selected point. - */ - private NsharpSkewTResource skewRsc=null; - //private List userSelectedTimeList = null; - - public double getLat() { - return lat; - } - - - public double getLon() { - return lon; - } - - - public void setSkewRsc(NsharpSkewTResource skewRsc) { - this.skewRsc = skewRsc; - } - - - public static NsharpMapMouseHandler getAccess(){ - return instance; - } - - //public void setSelectedTimeList(List selectedTimeList) { - // this.userSelectedTimeList = selectedTimeList; - //} - /** - * For single point element, the original location is needed for undo. - */ - //Coordinate oldLoc = null; - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.input.IInputHandler#handleMouseDown(int, - * int, int) - */ - @Override - public boolean handleMouseDown(int x, int y, int button) { - //System.out.println("nsharp map mouse down"); - //prevMouseX = x; - //prevMouseY = y; - return false; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.input.IInputHandler#handleMouseDownMove(int, - * int, int) - * handle left button, so user be able to shift map while it is down - */ - @Override - public boolean handleMouseDownMove(int x, int y, int button) { - /*if (button == 1 ){ - NCMapEditor mapEditor = NsharpMapResource.getMapEditor(); - if(mapEditor != null){ - IDisplayPane[] panes = ( mapEditor.arePanesGeoSynced() ? - mapEditor.getDisplayPanes() : mapEditor.getSelectedPanes() ); - - for( IDisplayPane p : panes ) { - p.shiftExtent(new double[] { x, y }, new double[] { - prevMouseX, prevMouseY }); - } - - mapEditor.refresh(); - - prevMouseX = x; - prevMouseY = y; - } - - }*/ - return false; - - } - @Override - public boolean handleMouseMove(int x, int y) { - // TODO Auto-generated method stub - return false; - } - - /* - private List readDataFromH5File(String fname, long validtime) { - - List soundLyLst = new ArrayList(); - - // retrieve an instance of H5File - FileFormat fileFormat = FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5); - - if (fileFormat == null) - { - System.out.print("Cannot find HDF5 FileFormat."); - return null; - } - - // open the file with read access - FileFormat h5File; - try { - h5File = fileFormat.open(fname, FileFormat.READ); - if (h5File == null) - { - System.out.print("Failed to open file: "+fname); - return null; - } - - - // open the file and retrieve the file structure - h5File.open(); - //Group root = (Group)((javax.swing.tree.DefaultMutableTreeNode)testFile.getRootNode()).getUserObject(); - //all data time line is stored in validTime table - Dataset dataset = (Dataset)h5File.get("validTime"); - dataset.init(); - //long rank = dataset.getRank(); Note: rank is defined to get dimension, e,g rank=2 means a 2 dimension table - long[] dim = dataset.getDims(); - - //for (int i=0; i selectedTimeIndex) - { - for (int i=0; i stnPtDataLineLst, Map> soundingLysLstMap) { -using hdf5 obj lib - String pickedStnInfo = ""; - SoundingSite sndSite = new SoundingSite(); - sndSite.setPluginName("modelsounding"); - System.out.println("snd site plug in name = "+sndSite.getPluginName()); - - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(stnPtDataLineLst.get(0).getReftime().getTime()); - - DataTime dataTime = new DataTime(cal); - sndSite.setDataTime(dataTime); - sndSite.setDataURI(stnPtDataLineLst.get(0).getDatauri()); - File hdf5loc = NsharpHD5PathProvider.findHDF5Location(sndSite); - - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - - - - //IDataStore dataStore = DataStoreFactory.getDataStore(hdf5loc); - - //System.out.println("snd site hdf5 path = " + hdf5loc.getAbsolutePath()); - System.out.println(" validtime= "+StnPt.getRangestarttime().getTime()/1000); - - List sndLyList = readDataFromH5File(hdf5loc.getAbsolutePath(), StnPt.getRangestarttime().getTime()/1000); - if(sndLyList != null && sndLyList.size() > 0){ - if(pickedStnInfo == ""){ - //use as first stn to show - pickedStnInfo = StnPt.getStnDisplayInfo(); - } - //update sounding data so they can be used by Skewt Resource and PalletWindow - //soundLyLst = dataHandling.updateObsSoundingDataForShow(soundLyLst, (float)StnPt.getElevation()); - //if(soundLyLst.size() >0)//Chin..check this later... - soundingLysLstMap.put(StnPt.getStnDisplayInfo(), sndLyList); - //System.out.println(StnPt.getStnDisplayInfo() + " with sound layer size of "+ soundLyLst.size()); - } - } // end for loop of stnPtsLst -*/ -/**/ - - - - /* Another way to read H5 file..... - String hdf5File = hdf5loc.getAbsolutePath(); - //String group = sndSite.getDataURI(); - String dataset = "omega";//TBD - IDataRecord dr; - - - int file_id = -1; - int dataset_id = -1; - float[][] dset_data = new float[182][64]; - // Open file using the default properties. - try { - file_id = H5.H5Fopen(hdf5File, HDF5Constants.H5F_ACC_RDONLY, - HDF5Constants.H5P_DEFAULT); - } - catch (Exception e) { - e.printStackTrace(); - } - - // Open dataset using the default properties. - try { - if (file_id >= 0) - dataset_id = H5.H5Dopen(file_id, dataset); - } - catch (Exception e) { - e.printStackTrace(); - } - - // Read the data using the default properties. - try { - if (dataset_id >= 0) - - H5.H5Dread(dataset_id, HDF5Constants.H5T_NATIVE_FLOAT, - HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, - HDF5Constants.H5P_DEFAULT, dset_data); - } - catch (Exception e) { - e.printStackTrace(); - } - - // Output the data to the screen. - System.out.println(dataset + ":"); - for (int indx = 0; indx < 182; indx++) { - System.out.print(" [ "); - for (int jndx = 0; jndx < 64; jndx++) - System.out.print(dset_data[indx][jndx] + " "); - System.out.println("]"); - } - System.out.println(); - - - // Close the dataset. - try { - if (dataset_id >= 0) - H5.H5Dclose(dataset_id); - } - catch (Exception e) { - e.printStackTrace(); - } -*/ - //get all dataset names - /* - String[] retVal; - int group_id = -1; - try { - group_id = H5.H5Gopen(file_id, "/"); - - long[] numObjs = new long[1]; - H5.H5Gget_num_objs(group_id, numObjs); - - retVal = new String[(int) numObjs[0]]; - - for (int i = 0; i < retVal.length; i++) { - String[] tmp = new String[1]; - H5.H5Gget_objname_by_idx(group_id, i, tmp, 255); - retVal[i] = tmp[0]; - System.out.println(retVal[i]); - } - - - } catch (HDF5LibraryException e) { - - } finally { - - if (group_id >= 0) { - try { - H5.H5Gclose(group_id); - } catch (HDF5LibraryException e) { - // Ignore - } - } - - } - - // Close the file. - try { - if (file_id >= 0) - H5.H5Fclose(file_id); - } - catch (Exception e) { - e.printStackTrace(); - } - */ - - - - /* - - - try { - dr = dataStore.retrieve("", dataset, Request.ALL); - System.out.println("name = " +dr.getName()); - System.out.println("SizeInBytes = " +dr.getSizeInBytes()); - System.out.println("getDimension = " +dr.getDimension()); - System.out.println("getFillValue = " +dr.getFillValue()); - System.out.println("group = " +dr.getGroup()); - System.out.println("getMaxSizes = " +dr.getMaxSizes()); - System.out.println("getMinIndex = " +dr.getMinIndex()); - - - ///System.out.println(dr.getDataObject()); - } catch (FileNotFoundException e) { - - e.printStackTrace(); - return; - } catch (StorageException e) { - - e.printStackTrace(); - return; - } - - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - List soundLyLst = new ArrayList(); - //query database - String queryStr; - soundLyLst.clear(); - - if(soundLyLst.size() > 0){ - if(pickedStnInfo == ""){ - //use as first stn to show - pickedStnInfo = StnPt.getStnDisplayInfo(); - } - //update sounding data so they can be used by Skewt Resource and PalletWindow - //do we have to do this for pfc sounding? - //soundLyLst = dataHandling.updateObsSoundingDataForShow(soundLyLst, (float)StnPt.getElevation()); - if(soundLyLst.size() >0)//Chin..check this later... - soundingLysLstMap.put(StnPt.getStnDisplayInfo(), soundLyLst); - //System.out.println(StnPt.getStnDisplayInfo() + " with sound layer size of "+ soundLyLst.size()); - } - } // end for loop of stnPtsLst - } -*/ - /* - private List convertToSoundingLayerList(List sndLst){ - List newLst = new ArrayList(); - for(NcSoundingLayer inLayer: sndLst){ - SoundingLayer outLayer = new SoundingLayer(); - outLayer.setDewpoint(inLayer.getDewpoint()); - outLayer.setTemperature(inLayer.getTemperature()); - outLayer.setPressure(inLayer.getPressure()); - outLayer.setGeoHeight(inLayer.getGeoHeight()); - outLayer.setWindDirection(inLayer.getWindDirection()); - outLayer.setWindSpeed(inLayer.getWindSpeed()); - outLayer.setOmega(inLayer.getOmega()); - newLst.add(outLayer); - } - return newLst; - } - */ - /* - private void getPfcSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - String pickedStnInfo = ""; - SoundingSite sndSite = new SoundingSite(); - sndSite.setPluginName("modelsounding"); - //System.out.println("snd site plug in name = "+sndSite.getPluginName()); - - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(stnPtDataLineLst.get(0).getReftime().getTime()); - - DataTime refTime = new DataTime(cal); - sndSite.setDataTime(refTime); - sndSite.setDataURI(stnPtDataLineLst.get(0).getDatauri()); - //File hdf5loc = NsharpHD5PathProvider.findHDF5Location(sndSite); - - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - NcSoundingProfile sndPf= PfcSoundingQuery.getPfcSndData(StnPt.getDatauri(),(float)StnPt.getLatitude(), (float)StnPt.getLongitude(), StnPt.getReftime(), - StnPt.getRangestarttime(), PfcSoundingQuery.PfcSndType.NAMSND); - - List rtnSndLst = sndPf.getSoundingLyLst(); - List sndLyList = convertToSoundingLayerList(rtnSndLst); - if(sndLyList != null && sndLyList.size() > 0){ - if(pickedStnInfo == ""){ - //use as first stn to show - pickedStnInfo = StnPt.getStnDisplayInfo(); - } - //update sounding data so they can be used by Skewt Resource and PalletWindow - //soundLyLst = dataHandling.updateObsSoundingDataForShow(soundLyLst, (float)StnPt.getElevation()); - //if(soundLyLst.size() >0)//Chin..check this later... - soundingLysLstMap.put(StnPt.getStnDisplayInfo(), sndLyList); - //System.out.println(StnPt.getStnDisplayInfo() + " with sound layer size of "+ soundLyLst.size()); - } - //System.out.println(" validtime= "+StnPt.getRangestarttime().getTime()/1000); - } - } - */ - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.input.IInputHandler#handleMouseUp(int, int, - * int) - * handle right button, so user be able to pick stn and print text report - */ - @Override - public boolean handleMouseUp(int x, int y, int button) { - //System.out.println("NsharpMapMouseHandler handleMouseUp called"); - // button 1 is left mouse button - if (button == 1 ){ - NCMapEditor mapEditor = NsharpMapResource.getMapEditor(); - if(mapEditor != null){ - //for(int i=0; i< mapEditor.getDescriptor().getResourceList().size(); i++) - // System.out.println( "C resourcename="+mapEditor.getDescriptor().getResourceList().get(i).getResource().getName()); - - // Check if mouse is in geographic extent - Coordinate loc = mapEditor.translateClick(x, y); - if ( loc == null ) - return false; - NsharpLoadDialog loadDia = NsharpLoadDialog.getAccess(); - if(loadDia!=null){ - if(loadDia.getActiveLoadSoundingType() == NsharpLoadDialog.MODEL_SND && loadDia.getMdlDialog()!=null&& loadDia.getMdlDialog().getLocationText()!=null){ - - if(loadDia.getMdlDialog().getCurrentLocType() == ModelSoundingDialogContents.LocationType.STATION){ - //System.out.println("mouse up 1 loc.x "+ loc.x+ " loc.y="+ loc.y); - String stnName = SurfaceStationPointData.calculateNearestPoint(loc); - //System.out.println("mouse up 2 loc.x "+ loc.x+ " loc.y="+ loc.y); - //System.out.println("stn name = "+ stnName); - if(stnName == null) - stnName = ""; - loadDia.getMdlDialog().getLocationText().setText(stnName); - } - else { - String latLonStr = String.format("%6.2f;%7.2f",loc.y,loc.x); - //System.out.println("mouse up 2 loc.x "+ loc.x+ " loc.y="+ loc.y + " latlonStr=" +latLonStr); - loadDia.getMdlDialog().getLocationText().setText(latLonStr); - } - - } - else { - //get the stn (point) list - int activeLoadType = loadDia.getActiveLoadSoundingType(); - List points = NsharpMapResource.getOrCreateNsharpMapResource().getPoints();//loadDia.getNsharpMapResource().getPoints(); - if(points.isEmpty() == false){ - - //get the stn close to loc "enough" and retrieve report for it - // Note::One stn may have more than one dataLine, if user picked multiple data time lines - List stnPtDataLineLst = getPtWithinMinDist(points, loc); - if(stnPtDataLineLst!= null && stnPtDataLineLst.size() > 0){ - //System.out.println("MapMouseHandler creating NsharpSkewTDisplay"); - //hash map, use stn display info as key - Map> soundingLysLstMap = new HashMap>(); - - //String soundingType; - if(activeLoadType == NsharpLoadDialog.OBSER_SND){ - NsharpMapResource.startWaitCursor(); - NsharpObservedSoundingQuery.getObservedSndData(stnPtDataLineLst,loadDia.getObsDialog().isRawData(),soundingLysLstMap); - NsharpMapResource.stopWaitCursor(); - } - else if (activeLoadType == NsharpLoadDialog.PFC_SND){ - NsharpMapResource.startWaitCursor(); - NsharpPfcSoundingQuery.getPfcSndDataBySndTmRange(stnPtDataLineLst,soundingLysLstMap); - NsharpMapResource.stopWaitCursor(); - } - else - return false; - //System.out.println("MAP size/" +soundingLysLstMap.size()); - if(soundingLysLstMap.size() <=0){ - //win.setAndOpenMb("Invalid sounding data returned from DB for this station!"); - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - mb.setMessage("Invalid sounding data returned from DB for this station!!"); - mb.open(); - loadDia.closeDiaOnly(); - return false; - } - loadDia.closeDiaOnly(); - // create an editor NsharpSkewTEditor - NsharpSkewTEditor skewtEdt = NsharpSkewTEditor.createOrOpenSkewTEditor(); - NsharpSkewTDisplay renderableDisplay = (NsharpSkewTDisplay) skewtEdt - .getActiveDisplayPane() - .getRenderableDisplay(); - - renderableDisplay.setEditorNum(skewtEdt - .getEditorNum()); - skewRsc = renderableDisplay.getDescriptor().getSkewtResource(); - skewRsc.addRsc(soundingLysLstMap, stnPtDataLineLst.get(0)); - mapEditor = NsharpMapResource.getMapEditor(); - if (mapEditor != null) { - mapEditor.refresh(); - } - bringSkewTEdToTop(); - } - else - { - //System.out.println("Mouse point too far from stn"); - } - } - else - { //debug - //System.out.println("points is null"); - } - } - } - } - - - } - else if(button == 3){ - //NsharpSkewTEditor.bringSkewTEditorToTop(); - bringSkewTEdToTop(); - } - - return false; - } - /* - * Chin Note: If calling NsharpSkewTEditor.bringSkewTEditorToTop() directly in mouse handler API, e.g. - * handleMouseUp(), then handleMouseUp() will be called one more time by System. Do not know the root cause of it. - * To avoid handling such event twice (e.g. query sounding data twice), we will call NsharpSkewTEditor.bringSkewTEditorToTop() - * from another Job (thread). - */ - private void bringSkewTEdToTop(){ - Job uijob = new UIJob("clear source selection"){ //$NON-NLS-1$ - public IStatus runInUIThread( - IProgressMonitor monitor) { - NsharpSkewTEditor.bringSkewTEditorToTop(); - return Status.OK_STATUS; - } - - }; - uijob.setSystem(true); - uijob.schedule(); - } - - /** - * Gets the nearest point of an selected element to the input point - * @param el element - * @param pt input point - * @return - */ - private List getPtWithinMinDist( List points , Coordinate pt ){ - - NsharpStationInfo thePoint = null; - double minDistance = NctextuiPointMinDistance; - GeodeticCalculator gc; - List thePoints = new ArrayList(); - NCMapEditor mapEditor = NsharpMapResource.getMapEditor(); - if(mapEditor != null){ - IMapDescriptor desc = (IMapDescriptor) mapEditor.getActiveDisplayPane().getRenderableDisplay().getDescriptor(); - gc = new GeodeticCalculator(desc.getCRS()); - gc.setStartingGeographicPoint(pt.x, pt.y); - //int textDispIndex = 1;//debug - for ( NsharpStationInfo point : points){ - - gc.setDestinationGeographicPoint( point.getLongitude(),point.getLatitude()); - double dist; - try{ - dist = gc.getOrthodromicDistance(); - //System.out.println("dist to point " + textDispIndex++ + " is " + dist); - if ( dist < minDistance ) { - - minDistance = dist; - thePoint = point; - } - } - catch (Exception e) { - - //e.printStackTrace(); - //System.out.println("getOrthodromicDistance exception happened!"); - } - - - } - // Chin, there may be more than one point for a selected stn. As user may selected more than one data time, - // For same stn, each data time will have one point to represent it. So, a stn may have more than one points - if(thePoint != null){ - for ( NsharpStationInfo point : points){ - if ((thePoint.getLatitude() == point.getLatitude())&& (thePoint.getLongitude() == point.getLongitude())){ - thePoints.add(point); - } - } - - //marked X on selected point - NsharpMapResource.getOrCreateNsharpMapResource().setPickedPoint(thePoint); - - } - - } - return thePoints; - - } - -} - diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResource.java deleted file mode 100644 index 2048960897..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResource.java +++ /dev/null @@ -1,549 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.rsc.NsharpMapResource - * - * This java class performs the NSHARP Resource functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 08/17/2012	655			B. Hebbard	Added paintProps as parameter to IDisplayable draw (2)
- * 
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; - - -import java.awt.Color; -import java.io.File; -import java.util.List; -import java.util.ArrayList; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PlatformUI; -import org.opengis.referencing.crs.CoordinateReferenceSystem; - -import com.vividsolutions.jts.geom.Coordinate; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.VizApp; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.ResourcePair; -import com.raytheon.uf.viz.core.map.IMapDescriptor; -import com.raytheon.uf.viz.core.map.MapDescriptor; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.IInputHandler; -import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.ResourceProperties; -import com.raytheon.uf.viz.core.rsc.ResourceList.RemoveListener; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.ui.EditorUtil; - -import gov.noaa.nws.ncep.viz.localization.NcPathManager; -import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; -import gov.noaa.nws.ncep.viz.resources.manager.RbdBundle; -import gov.noaa.nws.ncep.viz.resources.manager.ResourceBndlLoader; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaletteWindow; -import gov.noaa.nws.ncep.ui.pgen.display.DisplayElementFactory; -import gov.noaa.nws.ncep.ui.pgen.display.IDisplayable; -import gov.noaa.nws.ncep.ui.pgen.elements.SymbolLocationSet; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; -import gov.noaa.nws.ncep.viz.ui.display.NmapUiUtils; - - -public class NsharpMapResource extends AbstractVizResource - implements RemoveListener{ - private static NsharpMapResource mapRsc=null; - private static NCMapEditor mapEditor=null; - private static NsharpMapMouseHandler mouseHandler; - private static Cursor waitCursor=null; - private static Control cursorControl; - private static boolean mouseHandlerRegistered=false; - public static void bringMapEditorToTop(){ - try{ - if(mapEditor!=null&& PlatformUI.getWorkbench()!=null && PlatformUI.getWorkbench().getActiveWorkbenchWindow()!=null - && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()!=null){ - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().bringToTop(mapEditor); - mapEditor.refresh(); - } - } - catch (Exception e) { - } - - } - public static NCMapEditor getMapEditor() { - return mapEditor; - } - - public static NsharpMapResource getMapRsc() { - return mapRsc; - } - private NsharpMapResourceData nsharpMapResourceData; - /** The set of symbols with similar attributes across many locations */ - private SymbolLocationSet symbolSet = null; - private SymbolLocationSet symbolToMark = null; - private List points = new ArrayList(); - private List pickedPoint = new ArrayList(); - public void setPickedPoint(NsharpStationInfo point) { - this.pickedPoint.add(point); - } - public List getPoints() { - return points; - } - - public void setPoints(List points) { - if (points == null){ - this.pickedPoint.clear(); - symbolToMark= null; - symbolSet=null; - this.points.clear(); - } - else{ - this.points = points; - } - } - - public void addPoint(NsharpStationInfo point) { - points.add(point); - } - - /** - * Default constructor - */ - protected NsharpMapResource(NsharpMapResourceData resourceData, - LoadProperties loadProperties) { - super(resourceData, loadProperties); - this.nsharpMapResourceData = resourceData; - //System.out.println("NsharpMapResource constructed"); - - } - public static void startWaitCursor(){ - waitCursor = new Cursor( Display.getCurrent(), SWT.CURSOR_WAIT); - cursorControl = Display.getCurrent().getCursorControl(); - if(cursorControl!=null && waitCursor!=null) - cursorControl.setCursor(waitCursor); - } - public static void stopWaitCursor(){ - if(cursorControl!=null&& waitCursor!=null){ - cursorControl.setCursor(null); - } - if(waitCursor!=null){ - waitCursor.dispose(); - waitCursor= null; - } - } - /* - private static void createMapEditor(){ - // create an editor MapEditor - File rbdFile = NcPathManager.getInstance().getStaticFile( - NcPathConstants.DFLT_RBD ); - try { - - IEditorPart ep = EditorUtil.getActiveEditor(); - if (ep instanceof NCMapEditor) { - mapEditor= (NCMapEditor) ep; - }else { - mapEditor = NmapUiUtils.createNatlCntrsEditor("BasicWX-US","NSHARP" ); - } - - - for(int i=0; i< mapEditor.getDescriptor().getResourceList().size(); i++) - System.out.println( "A resourcename="+mapEditor.getDescriptor().getResourceList().get(i).getResource().getName()); - RbdBundle rbd = RbdBundle.unmarshalRBD( rbdFile, null ); - ResourceBndlLoader rbdLoader = new ResourceBndlLoader("DefaultMap"); - rbdLoader.addRBD( rbd, mapEditor ); - VizApp.runSync( rbdLoader ); - //System.out.println("NsharpMapResource create editor "+ mapEditor.toString()); - for(int i=0; i< mapEditor.getDescriptor().getResourceList().size(); i++) - System.out.println( "B resourcename="+mapEditor.getDescriptor().getResourceList().get(i).getResource().getName()); - - } - catch ( Exception ve ) { - System.out.println("NsharpMapResource Could not load initial editor: " + ve.getMessage()); - ve.printStackTrace(); - } - }*/ - private static void createMapEditorTest(){ - // create an editor MapEditor - try { - - IEditorPart ep = EditorUtil.getActiveEditor(); - if (ep instanceof NCMapEditor) { - mapEditor= (NCMapEditor) ep; - System.out.println("NsharpMapResource using existing editor "); - }else { - mapEditor = NmapUiUtils.createNatlCntrsEditor("BasicWX-US","NSHARP" ); - - - RbdBundle rbd = RbdBundle.getDefaultRBD(); - ResourceBndlLoader rbdLoader = new ResourceBndlLoader("DefaultMap"); - rbdLoader.addRBD( rbd, mapEditor ); - VizApp.runSync( rbdLoader ); - System.out.println("NsharpMapResource create new editor "+ mapEditor.toString()); - } - - for(int i=0; i< mapEditor.getDescriptor().getResourceList().size(); i++) - System.out.println( "Editor resource "+ i+" name="+mapEditor.getDescriptor().getResourceList().get(i).getResource().getName()); - - } - catch ( Exception ve ) { - System.out.println("NsharpMapResource Could not load initial editor: " + ve.getMessage()); - ve.printStackTrace(); - } - } - public static void registerMouseHandler(){ - if(mouseHandlerRegistered) - return; - - mouseHandler = getMouseHandler(); - if(mapEditor!=null && mouseHandler!=null){ - mapEditor.registerMouseHandler((IInputHandler) mouseHandler ); - mouseHandlerRegistered = true; - } - } - public static void unregisterMouseHandler(){ - if(!mouseHandlerRegistered) - return; - mouseHandler = getMouseHandler(); - if(mapEditor!=null && mouseHandler!=null){ - mapEditor.unregisterMouseHandler((IInputHandler) mouseHandler ); - mouseHandlerRegistered= false; - } - } - /** - * Create a new MapResource and add it to the current editor. - * @return the MapResource - */ - public static NsharpMapResource getOrCreateNsharpMapResource() { - if(mapRsc == null ){ - if(mapEditor == null) - createMapEditorTest();//createMapEditor(); - if(mapEditor!=null){ - IMapDescriptor desc = (IMapDescriptor) mapEditor.getActiveDisplayPane().getRenderableDisplay().getDescriptor(); - try { - mapRsc = new NsharpMapResourceData().construct(new LoadProperties(), desc); - desc.getResourceList().add( mapRsc ); - mapRsc.init( mapEditor.getActiveDisplayPane().getTarget()); - - //register mouse handler - mouseHandler = getMouseHandler(); - mapEditor.registerMouseHandler((IInputHandler) mouseHandler ); - - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - return mapRsc; - } - - public static void deleteNsharpMapResource() { - //System.out.println("NsharpMapResource:deleteNsharpMapResource "); - if(mapRsc != null ){ - mapRsc.dispose(); - mapRsc = null; - } - } - - /** - * Called when resource is disposed - * @see com.raytheon.viz.core.rsc.IVizResource#dispose() - */ - @Override - public void disposeInternal() { - //System.out.println("NsharpMapResource:disposeInternal "+ this.toString()); - - if(mapEditor != null ){ - mapEditor.unregisterMouseHandler( mouseHandler ); - mouseHandler = null; - //close editor - /*if((PlatformUI.getWorkbench()!= null)&&(PlatformUI.getWorkbench().getActiveWorkbenchWindow()!= null) - && (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()!=null)) - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeEditor(mapEditor, false);*/ - mapEditor = null; - - } - pickedPoint = null; - points = null; - symbolSet = null; - symbolToMark = null; - mapRsc = null; - if(waitCursor!=null) - waitCursor.dispose(); - waitCursor=null; - mouseHandlerRegistered= false; - } - - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.IVizResource#getCoordinateReferenceSystem() - */ - public CoordinateReferenceSystem getCoordinateReferenceSystem() { - - if (descriptor == null) - return null; - - return descriptor.getCRS(); - - } - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.IVizResource#getName() - */ - @Override - public String getName() { - - return "NSHARP Resource"; - - } - - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.IVizResource#getShortName() - */ - public String getShortName() { - - return null; - - } - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.IVizResource#init(com.raytheon.viz.core.IGraphicsTarget) - */ - @Override - public void initInternal(IGraphicsTarget target) throws VizException { - //System.out.println("NsharpMapResource:initInternal called"); - //mapfont = target.initializeFont("Monospace", - // (float) (12 * nsharpMapResourceData.getMarkerTextSize().getSoftwareSize()), null); - } - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.IVizResource#isApplicable(com.raytheon.viz.core.PixelExtent) - */ - public boolean isApplicable(PixelExtent extent) { - - return true; - - } - - private void generateSymbolForDrawing() - { - String type; - float lineWidth = nsharpMapResourceData.getMarkerWidth(); - Boolean clear= false;; - String category = new String("Marker"); - double sizeScale = nsharpMapResourceData.getMarkerSize(); - - - if (points.isEmpty() == true) { - symbolSet = null; - } - else { - // SymbolLocationSet constructor requires a positive-length array of Coordinate - Coordinate[] locations = new Coordinate[points.size()]; - Color[] colors = new Color[] {new Color(NsharpConstants.color_green.red, - NsharpConstants.color_green.green, - NsharpConstants.color_green.blue)}; - //System.out.println( "generateSymbolSet: size ="+ points.size()); - int i = 0; - for (NsharpStationInfo p : points) { - double lon, lat; - lon = p.getLongitude(); - lat = p.getLatitude(); - locations[i++] = new Coordinate(lon,lat); - } - type = nsharpMapResourceData.getMarkerType().toString(); - //System.out.println( "generateSymbolSet done size ="+ i); - symbolSet = new SymbolLocationSet ( - null, - colors, - lineWidth, - sizeScale, - clear, - locations, - category, - type); - - - } - //generate symbol for picked stn to mark X - if(pickedPoint!= null && pickedPoint.size()>0){ - Coordinate[] locations = new Coordinate[pickedPoint.size()]; - int i = 0; - for (NsharpStationInfo p : pickedPoint) { - double lon, lat; - lon = p.getLongitude(); - lat = p.getLatitude(); - locations[i++] = new Coordinate(lon,lat); - } - type = nsharpMapResourceData.getStnMarkerType().toString(); - Color[] colors = new Color[] {new Color(NsharpConstants.color_red.red, - NsharpConstants.color_red.green, - NsharpConstants.color_red.blue)}; - symbolToMark = new SymbolLocationSet(null, - colors, - lineWidth, - sizeScale*2, - clear, - locations, - category, - type); - } - else - symbolToMark= null; - } - - /* (non-Javadoc) - * @see com.raytheon.viz.core.drawables.IRenderable#paint(com.raytheon.viz.core.IGraphicsTarget, com.raytheon.viz.core.drawables.PaintProperties) - */ - @Override - public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - //System.out.println("paintInternal called!"); - //IFont font = target.initializeFont("Monospace", - // (float) (12 * nsharpMapResourceData.getMarkerTextSize().getSoftwareSize()), null); - - generateSymbolForDrawing(); - DisplayElementFactory df = new DisplayElementFactory (target, this.descriptor); - if (symbolSet != null) - { - ArrayList elements = df.createDisplayElements(symbolSet, paintProps); - for (IDisplayable each : elements) - { - try { - each.draw(target, paintProps); - each.dispose(); - } - catch (Exception e) { - e.printStackTrace(); - //System.out.println("paintInternal caught draw exception!"); - } - } - } - if(symbolToMark != null){ - ArrayList elements = df.createDisplayElements(symbolToMark, paintProps); - for (IDisplayable each : elements) - { - try { - each.draw(target, paintProps); - each.dispose(); - } - catch (Exception e) { - e.printStackTrace(); - //System.out.println("paintInternal caught draw exception!"); - } - } - } - //font.dispose(); - } - - - - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.capabilities.IProjectableResource#isProjectable(org.opengis.referencing.crs.CoordinateReferenceSystem) - */ - public boolean isProjectable(CoordinateReferenceSystem mapData) { - - return true; - - } - - /* (non-Javadoc) - * @see com.raytheon.viz.core.rsc.capabilities.IProjectableResource#project(org.opengis.referencing.crs.CoordinateReferenceSystem) - */ - @Override - public void project(CoordinateReferenceSystem mapData) throws VizException { - //System.out.println("NctextuiResource: project "); - } - - /** - * Returns the current mouse handler. - * @return - */ - private static NsharpMapMouseHandler getMouseHandler() { - - if ( mouseHandler == null ) { - - mouseHandler = new NsharpMapMouseHandler(); - - } - - return mouseHandler; - - } - - @Override - public boolean okToUnload() { - /* - * DisAllow unloading of Resource - */ - - return false; - - - } - @Override - public void notifyRemove(ResourcePair rp) throws VizException { - // TODO Auto-generated method stub - - } - @Override - public void propertiesChanged(ResourceProperties updatedProps) { - if ( updatedProps.isVisible() ) { - reopenTextView (); - } - else { - hideTextView (); - } - } - - private void hideTextView () { - IWorkbenchPage wpage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - - IViewPart vpart = wpage.findView( "gov.noaa.nws.ncep.ui.nsharp" ); - if ( wpage.isPartVisible(vpart) ) { - NsharpPaletteWindow paletteWin = NsharpPaletteWindow.getInstance(); - if(paletteWin!=null){ - paletteWin.setEditorVisible(false); - wpage.hideView(vpart); - } - } - } - - private void reopenTextView () { - IWorkbenchPage wpage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - - IViewPart vpart = wpage.findView( "gov.noaa.nws.ncep.ui.nsharp" ); - if ( !wpage.isPartVisible(vpart) ) { - NsharpPaletteWindow paletteWin = NsharpPaletteWindow.getInstance(); - if(paletteWin!=null){ - paletteWin.setEditorVisible(true); - try { - vpart = wpage.showView( "gov.noaa.nws.ncep.ui.nsharp" ); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } -} - diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResourceData.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResourceData.java deleted file mode 100644 index 6603430f45..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpMapResourceData.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.rsc.NsharpMapResourceData - * - * This java class performs the NSHARP ResourceData functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; - -import gov.noaa.nws.ncep.viz.overlays.IPointOverlayResourceData.*; -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.LoadProperties; - -public class NsharpMapResourceData extends AbstractResourceData { - - private MarkerState markerState = MarkerState.MARKER_ONLY; - private MarkerType markerType = MarkerType.DIAMOND; - private Float markerSize = 1f; - private Integer markerWidth = 2; - private MarkerTextSize markerTextSize = MarkerTextSize.MEDIUM; - private String mapName = "NSHARP"; - private MarkerType stnMarkerType = MarkerType.LARGE_X; - - public MarkerType getStnMarkerType() { - return stnMarkerType; - } - - public NsharpMapResourceData() { - super(); - } - - /* (non-Javadoc) - * @see com.raytheon.uf.viz.core.rsc.AbstractResourceData#construct(com.raytheon.uf.viz.core.comm.LoadProperties, com.raytheon.uf.viz.core.drawables.IDescriptor) - */ - @Override - public NsharpMapResource construct(LoadProperties loadProperties, - IDescriptor descriptor) throws VizException { - // TODO Auto-generated method stub - return new NsharpMapResource(this, loadProperties); - } - - /* (non-Javadoc) - * @see com.raytheon.uf.viz.core.rsc.AbstractResourceData#update(java.lang.Object) - */ - @Override - public void update(Object updateData) { - // TODO Auto-generated method stub - - } - - @Override - public boolean equals(Object obj) { - // TODO Auto-generated method stub - return false; - } - - public MarkerState getMarkerState() { - return markerState; - } - - public void setMarkerState(MarkerState markerState) { - this.markerState = markerState; - } - - public MarkerType getMarkerType() { - return markerType; - } - - public void setMarkerType(MarkerType markerType) { - this.markerType = markerType; - } - - public Float getMarkerSize() { - return markerSize; - } - - public void setMarkerSize(Float markerSize) { - this.markerSize = markerSize; - } - - public Integer getMarkerWidth() { - return markerWidth; - } - - public void setMarkerWidth(Integer markerWidth) { - this.markerWidth = markerWidth; - } - - public MarkerTextSize getMarkerTextSize() { - return markerTextSize; - } - - public void setMarkerTextSize(MarkerTextSize markerTextSize) { - this.markerTextSize = markerTextSize; - } - - public String getMapName() { - return mapName; - } - - public void setMapName(String mapName) { - this.mapName = mapName; - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpObservedSoundingQuery.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpObservedSoundingQuery.java deleted file mode 100644 index 8d3e75d949..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpObservedSoundingQuery.java +++ /dev/null @@ -1,189 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; -/** - * - * - * - * This java class performs the NSHARP observed sounding data query functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 11/1/2010	362			Chin Chen	Initial coding
- * 12/16/2010   362         Chin Chen   add support of BUFRUA observed sounding and PFC (NAM and GFS) model sounding data
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpDataHandling; -import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -//Chin-T import com.raytheon.uf.common.sounding.SoundingLayer; - -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpObservedSoundingQuery { - //private static final String METADATA_DB_NAME = "metadata"; - //private static final String UAIR_OBS_TBL_NAME = "uair_obslevels"; - //private static final String UAIR_MAXWIND_TBL_NAME = "uair_maxwind"; - //private static final String UAIR_TROPO_TBL_NAME = "uair_tropopause"; - //private static final UnitConverter metersPerSecondToKnots = SI.METERS_PER_SECOND.getConverterTo(NonSI.KNOT); - - /* - * Create python script to query data from edex - * Example: - * import NcSoundingDataRequest - * sndRq = NcSoundingDataRequest.NcSoundingDataRequest() - * sndRq.setSndType('UAIR') - * sndRq.setDataType('ALLDATA') - * sndRq.setDbIdList([1002248,1003668]) - * return sndRq.execute() - */ - /* - private static String scriptCreator(List dbIds, NcSoundingProfile.ObsSndType sndType) { - - StringBuilder query = new StringBuilder(); - if(dbIds.size()>0){ - query.append("import NcSoundingDataRequest\n"); - query.append("sndRq = NcSoundingDataRequest.NcSoundingDataRequest()\n"); - query.append("sndRq.setSndType('" +sndType + "')\n"); - query.append("sndRq.setDataType('ALLDATA')\n"); - query.append("sndRq.setDbIdList(["); - for(int i =0; i < dbIds.size()-1; i++){ - query.append(dbIds.get(i) + ","); - } - query.append(dbIds.get(dbIds.size()-1)); - query.append("])\n"); - - query.append("return sndRq.execute()"); - System.out.println(query.toString()); - } - return query.toString(); - }*/ - /* use lat/lon/synoptictime for query - private static String scriptCreator(NsharpStationInfo stn, NcSoundingProfile.ObsSndType sndType) { - - StringBuilder query = new StringBuilder(); - - query.append("import NcSoundingDataRequest\n"); - query.append("sndRq = NcSoundingDataRequest.NcSoundingDataRequest()\n"); - query.append("sndRq.setSndType('" +sndType + "')\n"); - //query.append("sndRq.setDataType('ALLDATA')\n"); - //query.append("sndRq.setLat("+ stn.getLatitude()+ ")\n"); - //query.append("sndRq.setLon(" + stn.getLongitude() + ")\n"); - query.append("sndRq.setRefTime(" +stn.getReftime().getTime() + "L)\n"); - query.append("sndRq.setMerge(1)\n"); - //query.append("return sndRq.execute()"); - query.append("return sndRq.getSoundingDataByLatLonArray([["+stn.getLatitude()+","+stn.getLongitude()+"]])"); - System.out.println(query.toString()); - - return query.toString(); - }*/ - /* - private static List queryDb(String queryStr){ - List list = null; - try { - list = DirectDbQuery.executeQuery( queryStr, METADATA_DB_NAME, QueryLanguage.SQL); - } - catch (Exception e ){ - System.out.println("DB exception: this query--"+queryStr+ " error msg: "+e.getMessage()); - } - return list; - } - */ - - //Chin-T public static void getObservedSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - //Chin: note that Nsharp currently GUI only allow user pick one stn at one time, but could be many refTimes. - public static void getObservedSndData(List stnPtDataLineLst, boolean rawData, Map> soundingLysLstMap) { - //String pickedStnInfo = ""; - List coords= new ArrayList(); - List refTimeLst = new ArrayList(); - //create refTime array and lat/lon array - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - //List Ids = StnPt.getDbId(); - System.out.println("stn lat ="+StnPt.getLatitude()+ " lon="+StnPt.getLongitude()); - boolean exist = false; - for(Coordinate c: coords){ - if(c.x == StnPt.getLongitude() && c.y == StnPt.getLatitude()){ - exist= true; - break; - } - } - if(exist==false) { - Coordinate coord = new Coordinate(StnPt.getLongitude(),StnPt.getLatitude()); - coords.add(coord); - } - exist = false; - for(long t: refTimeLst){ - if(t == StnPt.getReftime().getTime()){ - exist= true; - break; - } - } - if(exist==false) { - refTimeLst.add(StnPt.getReftime().getTime()); - } - - - } - double[][] latLon = new double[coords.size()][2]; - for (int i=0; i< coords.size(); i++){ - latLon[i][0]= coords.get(i).y; //lat - latLon[i][1]= coords.get(i).x; //lon - } - NcSoundingCube cube = NcSoundingQuery.uaGenericSoundingQuery(refTimeLst.toArray(new Long[0]), latLon, stnPtDataLineLst.get(0).getSndType(), - NcSoundingLayer.DataType.ALLDATA, !rawData, "-1"); - //NcSoundingCube cube = NcSoundingQuery.soundingQueryByLatLon(stnPtDataLineLst.get(0).getReftime().getTime(), coords, stnPtDataLineLst.get(0).getSndType(), - // NcSoundingLayer.DataType.ALLDATA, !rawData, "-1"); - if(cube != null && cube.getSoundingProfileList().size()>0 && cube.getRtnStatus()==NcSoundingCube.QueryStatus.OK){ - for(NcSoundingProfile sndPf : cube.getSoundingProfileList()){ - List rtnSndLst = sndPf.getSoundingLyLst(); - //if(rtnSndLst != null && rtnSndLst.size() > 0){ - - //NcSoundingProfile sndPf = cube.getSoundingProfileList().get(0); - //System.out.println("size of profile = "+ cube.getSoundingProfileList().size()); - //debug - //for(NcSoundingProfile pf: cube.getSoundingProfileList()){ - // System.out.println("sounding profile: lat="+pf.getStationLatitude()+" lon="+pf.getStationLongitude()+ " stnId="+ pf.getStationId() ); - //} - //List rtnSndLst = sndPf.getSoundingLyLst(); - // Chin-T List sndLyList = NsharpSoundingQueryCommon.convertToSoundingLayerList(rtnSndLst); - if(rtnSndLst != null && rtnSndLst.size() > 0){ - //update sounding data so they can be used by Skewt Resource and PalletWindow - if(rawData) - rtnSndLst = NsharpDataHandling.sortObsSoundingDataForShow(rtnSndLst, sndPf.getStationElevation()); - else - rtnSndLst = NsharpDataHandling.organizeSoundingDataForShow(rtnSndLst, sndPf.getStationElevation()); - //minimum rtnSndList size will be 2 (50 & 75 mb layers), but that is not enough - // We need at least 2 regular layers for plotting - if(rtnSndLst != null && rtnSndLst.size() > 4){ - String dispInfo=""; - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - if(StnPt.getReftime().getTime() == sndPf.getFcsTime()){ - dispInfo = StnPt.getStnDisplayInfo(); - break; - } - } - soundingLysLstMap.put(dispInfo, rtnSndLst); - } - } - } - //} - } - - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpPfcSoundingQuery.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpPfcSoundingQuery.java deleted file mode 100644 index 18935e96aa..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpPfcSoundingQuery.java +++ /dev/null @@ -1,148 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; -/** - * - * - * - * This java class performs the NSHARP pfc sounding data query functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 11/1/2010	362			Chin Chen	Initial coding
- * 12/16/2010   362         Chin Chen   add support of BUFRUA observed sounding and PFC (NAM and GFS) model sounding data
- * 02/15/2012               Chin Chen   add  PFC sounding query algorithm for better performance getPfcSndDataBySndTmRange()
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpDataHandling; -import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; -import java.util.List; -import java.util.Map; -import java.sql.Timestamp; - - -// Chin-T import com.raytheon.uf.common.sounding.SoundingLayer; - -public class NsharpPfcSoundingQuery { - /* - * Create python script to query data from edex - */ - /* - private static String scriptCreator( double lat, double lon, Timestamp refTime, Timestamp validTime, NcSoundingProfile.PfcSndType sndType) { - - StringBuilder query = new StringBuilder(); - query.append("import NcSoundingDataRequest\n"); - query.append("sndRq = NcSoundingDataRequest.NcSoundingDataRequest()\n"); - //query.append("sndRq.setLat(" +lat+ ")\n"); - //query.append("sndRq.setLon(" + lon + ")\n"); - query.append("sndRq.setRefTime(" +refTime.getTime() + "L)\n"); - query.append("sndRq.setValidTime(" +validTime.getTime() + "L)\n"); - query.append("sndRq.setSndType('" +sndType + "')\n"); - //query.append("return sndRq.execute()"); - query.append("return sndRq.getSoundingDataByLatLonArray([["+lat+","+lon+"]])"); - System.out.println(query.toString()); - return query.toString(); - } */ - - //Chin-T public static void getPfcSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - /*public static void getPfcSndData(List stnPtDataLineLst, Map> soundingLysLstMap) { - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - //NcSoundingProfile sndPf= PfcSoundingQuery.getPfcSndData(StnPt.getDatauri(),(float)StnPt.getLatitude(), (float)StnPt.getLongitude(), StnPt.getReftime(), - // StnPt.getRangestarttime(), PfcSoundingQuery.PfcSndType.NAMSND); - - //query using NcSoundingQuery class - double[][] latLon = {{StnPt.getLatitude(), StnPt.getLongitude()}}; - for(NsharpStationInfo.timeLineSpecific tmlinSpc: StnPt.getTimeLineSpList() ){ - Timestamp rangeTime = tmlinSpc.getTiemLine(); - String stnDispInfo = tmlinSpc.getDisplayInfo(); - NcSoundingCube cube = NcSoundingQuery.pfcSoundingQueryByLatLon(StnPt.getReftime().getTime(),rangeTime.getTime(), latLon, StnPt.getSndType(), NcSoundingLayer.DataType.ALLDATA, false, "-1"); - //System.out.println(stnDispInfo + " "+ rangeTime); - if(cube != null&& cube.getSoundingProfileList().size()>0){ - NcSoundingProfile sndPf = cube.getSoundingProfileList().get(0); - - List rtnSndLst = sndPf.getSoundingLyLst(); - // Chin-T List sndLyList = NsharpSoundingQueryCommon.convertToSoundingLayerList(rtnSndLst); - if(rtnSndLst != null && rtnSndLst.size() > 0){ - //update sounding data so they can be used by Skewt Resource and PalletWindow - //we should not have to do this, if EDEX has done this correctly.... - //sndLyList = NsharpDataHandling.updateObsSoundingDataForShow(sndLyList, (float)StnPt.getElevation()); - - //Remove sounding layers that not used by NSHARP - rtnSndLst = NsharpDataHandling.organizeSoundingDataForShow(rtnSndLst, sndPf.getStationElevation()); - //minimum rtnSndList size will be 2 (50 & 75 mb layers), but that is not enough - // We need at least 2 regular layers for plotting - if(rtnSndLst != null && rtnSndLst.size() > 4) - //TBD soundingLysLstMap.put(StnPt.getStnDisplayInfo(), rtnSndLst); - soundingLysLstMap.put(stnDispInfo, rtnSndLst); - //System.out.println(stnDispInfo + " with sound layer size of "+ rtnSndLst.size()); - } - } - } - } - }*/ - /* - * Chin, use sounding time range array to query. - * 2/14/2012 - */ - public static void getPfcSndDataBySndTmRange(List stnPtDataLineLst, Map> soundingLysLstMap) { - String stnDispInfo = ""; - NcSoundingCube cube; - for(NsharpStationInfo StnPt : stnPtDataLineLst){ - //one StnPt represent one data time line - //NcSoundingProfile sndPf= PfcSoundingQuery.getPfcSndData(StnPt.getDatauri(),(float)StnPt.getLatitude(), (float)StnPt.getLongitude(), StnPt.getReftime(), - // StnPt.getRangestarttime(), PfcSoundingQuery.PfcSndType.NAMSND); - - long[] rangeTimeArray = new long[StnPt.getTimeLineSpList().size()]; - int i=0; - for(NsharpStationInfo.timeLineSpecific tmlinSpc: StnPt.getTimeLineSpList() ){ - Timestamp rangeTime = tmlinSpc.getTiemLine(); - rangeTimeArray[i]=rangeTime.getTime(); - i++; - } - //chin for testing pfcSoundingQueryByLatLon() - //double[][] latLon = new double [1][2]; - //latLon[0][0]=StnPt.getLatitude(); - //latLon[0][1]=StnPt.getLongitude(); - //cube = NcSoundingQuery.pfcSoundingQueryByLatLon(StnPt.getReftime().getTime(), rangeTimeArray[0],latLon , StnPt.getSndType(), NcSoundingLayer.DataType.ALLDATA, false, "-1"); - //end test - cube = NcSoundingQuery.pfcSoundingQueryByRangeTimeArray(StnPt.getReftime().getTime(), - rangeTimeArray, StnPt.getLatitude(),StnPt.getLongitude(), StnPt.getSndType(), NcSoundingLayer.DataType.ALLDATA, false, "-1"); - if(cube != null&& cube.getSoundingProfileList().size()>0){ - for(NcSoundingProfile sndPf : cube.getSoundingProfileList()){ - List rtnSndLst = sndPf.getSoundingLyLst(); - if(rtnSndLst != null && rtnSndLst.size() > 0){ - rtnSndLst = NsharpDataHandling.organizeSoundingDataForShow(rtnSndLst, sndPf.getStationElevation()); - //minimum rtnSndList size will be 2 (50 & 75 mb layers), but that is not enough - // We need at least 2 regular layers for plotting - if(rtnSndLst != null && rtnSndLst.size() > 4){ - stnDispInfo="NA"; - for(int j=0; j < StnPt.getTimeLineSpList().size(); j++ ){ - NsharpStationInfo.timeLineSpecific tmlinSpcj = StnPt.getTimeLineSpList().get(j); - //System.out.println("rtnSndTIme="+ sndPf.getFcsTime() + " requestTime"+j+"="+tmlinSpcj.getTiemLine().getTime()); - if(tmlinSpcj.getTiemLine().getTime()== sndPf.getFcsTime()){ - stnDispInfo = tmlinSpcj.getDisplayInfo(); - break; - } - } - soundingLysLstMap.put(stnDispInfo, rtnSndLst); - - //System.out.println(stnDispInfo + " with sound layer size of "+ rtnSndLst.size()); - } - } - } - } - } - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpSoundingQueryCommon.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpSoundingQueryCommon.java deleted file mode 100644 index ab39fc9252..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/maprsc/NsharpSoundingQueryCommon.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.maprsc; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpSoundingQueryCommon - * - * This java class performs the NSHARP Modal functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 10/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; - -import java.util.ArrayList; -import java.util.List; - -import com.raytheon.uf.common.sounding.SoundingLayer; - -public class NsharpSoundingQueryCommon { - public static List convertToSoundingLayerList(List sndLst){ - List newLst = new ArrayList(); - for(NcSoundingLayer inLayer: sndLst){ - SoundingLayer outLayer = new SoundingLayer(); - outLayer.setDewpoint(inLayer.getDewpoint()); - outLayer.setTemperature(inLayer.getTemperature()); - outLayer.setPressure(inLayer.getPressure()); - outLayer.setGeoHeight(inLayer.getGeoHeight()); - outLayer.setWindDirection(inLayer.getWindDirection()); - outLayer.setWindSpeed(inLayer.getWindSpeed()); - outLayer.setOmega(inLayer.getOmega()); - - newLst.add(outLayer); - } - return newLst; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ModelSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ModelSoundingDialogContents.java deleted file mode 100644 index b50d4e4c34..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ModelSoundingDialogContents.java +++ /dev/null @@ -1,729 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.ModelSoundingDialogContents - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 01/2011	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.menu; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingModel; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingTimeLines; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.SurfaceStationPointData; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpDataHandling; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; -import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; - -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Text; - -import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; -import com.vividsolutions.jts.geom.Coordinate; - -public class ModelSoundingDialogContents { - private Composite parent; - private org.eclipse.swt.widgets.List modelTypeList=null, availableFileList=null, sndTimeList=null; - //timeLineToFileMap maps time line (rangeStart time in sndTimeList) to available file (reftime in availableFileList) - private Map timeLineToFileMap = new HashMap(); - //soundingLysLstMap maps "lat;lon timeline" string to its queried sounding layer list - private Map> soundingLysLstMap = new HashMap> (); - private Group modelTypeGp, bottomGp, availableFileGp, sndTimeListGp, topGp, locationMainGp; - private Button timeBtn, latlonBtn, stationBtn, loadBtn; - private Text locationText; - private Label locationLbl; - private boolean timeLimit = false; - private NsharpLoadDialog ldDia; - private Font newFont; - private List selectedFileList = new ArrayList(); - private List selectedTimeList = new ArrayList(); - //private NcSoundingProfile.MdlSndType currentSndType = NcSoundingProfile.MdlSndType.NONE; - private float lat, lon; - private String stnStr=""; - private final String GOOD_LATLON_STR = " A good input looked like this:\n 38.95;-77.45 or 38.95,-77.45"; - private final String GOOD_STN_STR = " A good input looked like this:\n GAI or gai"; - String gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - private String selectedModel=null; - private DBType currentDb = DBType.NCGRIB; - - public enum LocationType { - LATLON, STATION - } - public enum DBType { - GRIB, NCGRIB - } - private LocationType currentLocType=LocationType.LATLON; - - public LocationType getCurrentLocType() { - return currentLocType; - } - - public Text getLocationText() { - return locationText; - } - - - public ModelSoundingDialogContents (Composite parent) { - this.parent = parent; - ldDia = NsharpLoadDialog.getAccess(); - newFont = ldDia.getNewFont(); - if( VizPerspectiveListener.getCurrentPerspectiveManager()!= null){ - if(VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId().equals(NmapCommon.NatlCntrsPerspectiveID)) - gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - else - gribDecoderName = NcSoundingQuery.GRIB_PLUGIN_NAME; - - - //for testing - //gribDecoderName = NcSoundingQuery.GRIB_PLUGIN_NAME; - //System.out.println("perspective id = " + VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId()); - } - } - private void createMDLAvailableFileList() { - if(sndTimeList!=null) - sndTimeList.removeAll(); - if(availableFileList!=null) - availableFileList.removeAll(); - - //query using NcSoundingQuery class to query - NcSoundingTimeLines timeLines = NcSoundingQuery.mdlSoundingTimeLineQuery(selectedModel, gribDecoderName); - if(timeLines!= null && timeLines.getTimeLines() != null){ - ldDia.startWaitCursor(); - for(Object timeLine : timeLines.getTimeLines()){ - Timestamp reftime = (Timestamp)timeLine; - if(reftime != null){ - //need to format reftime to GMT time string. Timestamp.toString produce a local time Not GMT time - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(reftime.getTime()); - String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH", cal); - //System.out.println("GMT time " + gmtTimeStr); - availableFileList.add(gmtTimeStr); - - } - - } - ldDia.stopWaitCursor(); - } - else - System.out.println("SQL: query return null"); - } - private void createMDLSndTimeList(List selectedFlLst) { - if(selectedFlLst.size() <=0 ) - return; - if(sndTimeList!=null) - sndTimeList.removeAll(); - if(timeLineToFileMap!=null) - timeLineToFileMap.clear(); - int nameLen= Math.min(4, selectedModel.length()); - String modelName= selectedModel.substring(0,nameLen); - //query using NcSoundingQuery to query - ldDia.startWaitCursor(); - for(int i=0; i< selectedFlLst.size(); i++){ - String fl = selectedFlLst.get(i); - long reftimeMs= NcSoundingQuery.convertRefTimeStr(fl); - NcSoundingTimeLines timeLines = NcSoundingQuery.mdlSoundingRangeTimeLineQuery(selectedModel, fl, gribDecoderName); - if(timeLines != null && timeLines.getTimeLines().length >0) { - for(Object obj : timeLines.getTimeLines()){ - Timestamp rangestart = (Timestamp)obj; - - //need to format rangestart to GMT time string. Timestamp.toString produce a local time Not GMT time - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(rangestart.getTime()); - long vHour = (cal.getTimeInMillis()- reftimeMs)/3600000; - String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tH%1$tMV%2$03d %3$s", cal, vHour,modelName); - //String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); - if(sndTimeList.indexOf(gmtTimeStr) != -1){ - // this indicate that gmtTimeStr is laready in the sndTimeList, then we dont need to add it to list again. - continue; - } - - //System.out.println("GMT time " + gmtTimeStr); - if(!timeLimit){ - sndTimeList.add(gmtTimeStr); - timeLineToFileMap.put(gmtTimeStr, fl); - } - else { - int hour = cal.get(Calendar.HOUR_OF_DAY); - if((hour == 0) || (hour == 12)){ - sndTimeList.add(gmtTimeStr); - timeLineToFileMap.put(gmtTimeStr, fl); - } - } - - } - } - } - ldDia.stopWaitCursor(); - } - - private void queryAndLoadData(boolean stnQuery) { - soundingLysLstMap.clear(); - ldDia.startWaitCursor(); - //Chin Note: Since NcGrib/Grib HDF5 data file is created based on a forecast time line, we can not query - // more than one time line at one time as Edex server just could not support such query at one shot. - //This is not the case of PFC sounding (modelsounding db). It has all time lines of one forecast report - // saved in one file. Therefore, PFC query is much faster. - for(String timeLine: selectedTimeList){ - // avail file, ie. its refTime - String selectedFileStr = timeLineToFileMap.get(timeLine); - String rangeStartStr = NcSoundingQuery.convertSoundTimeDispStringToRangeStartTimeFormat(timeLine); - float[][] latLon = {{lat, lon}}; - NcSoundingCube cube = NcSoundingQuery.mdlSoundingQueryByLatLon(selectedFileStr+":00:00",rangeStartStr, latLon, gribDecoderName,selectedModel, false, "-1"); - if(cube != null && cube.getRtnStatus()== NcSoundingCube.QueryStatus.OK){ - //System.out.println("mdlSoundingQueryByLatLon returnd ok"); - - NcSoundingProfile sndPf = cube.getSoundingProfileList().get(0); - - List rtnSndLst = sndPf.getSoundingLyLst(); - if(rtnSndLst != null && rtnSndLst.size() > 1){ - //Remove sounding layers that not used by NSHARP - //System.out.println("numbe of layer returned from query ="+ rtnSndLst.size()); - rtnSndLst = NsharpDataHandling.organizeSoundingDataForShow(rtnSndLst, sndPf.getStationElevation()); - //minimum rtnSndList size will be 2 (50 & 75 mb layers), but that is not enough - // We need at least 2 regular layers for plotting - if(rtnSndLst != null && rtnSndLst.size() > 4) - { //after organized, if size is still good - if(!stnQuery){ - soundingLysLstMap.put(lat+";"+lon+" "+timeLine, rtnSndLst); - //System.out.println(lat+";"+lon+" "+timeLine); - } - else{ - soundingLysLstMap.put(stnStr+" "+timeLine, rtnSndLst); - //System.out.println(stnStr+" "+timeLine); - } - continue; - } - - } - //code to this point means query result is not good - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - if(!stnQuery){ - ldDia.setAndOpenMb("Sounding query with lat/lon ("+lat+"/"+lon+") at "+timeLine+": Returned\n But without vlaid data"); - } - else{ - ldDia.setAndOpenMb("Sounding query with stn "+ stnStr+ "at lat/lon ("+lat+"/"+lon+") at "+timeLine+": Returned\n But without vlaid data"); - } - //return; - } - else - { - if(!stnQuery){ - System.out.println("mdlsoundingQueryByLatLon failed"); - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - if(cube != null) - ldDia.setAndOpenMb("Sounding query with lat/lon ("+lat+"/"+lon+") at "+timeLine+": failed\nError status:"+ cube.getRtnStatus().toString()); - else - ldDia.setAndOpenMb("Sounding query with lat/lon ("+lat+"/"+lon+") at "+timeLine+": failed\nError status: NULL returned"); - } - else{ - System.out.println("mdlsoundingQueryByStn failed"); - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - if(cube != null) - ldDia.setAndOpenMb("Sounding query with stn "+ stnStr+ "at lat/lon ("+lat+"/"+lon+") at "+timeLine+": failed\nError status:"+ cube.getRtnStatus().toString()); - else - ldDia.setAndOpenMb("Sounding query with stn "+ stnStr+ "at lat/lon ("+lat+"/"+lon+") at "+timeLine+": failed\nError status: NULL returned"); - } - //return; - } - } - ldDia.stopWaitCursor(); - NsharpSkewTDisplay renderableDisplay; - NsharpSkewTEditor skewtEdt = NsharpSkewTEditor.createOrOpenSkewTEditor(); - renderableDisplay = (NsharpSkewTDisplay) skewtEdt.getActiveDisplayPane().getRenderableDisplay(); - renderableDisplay.setEditorNum(skewtEdt.getEditorNum()); - NsharpSkewTResource skewRsc = renderableDisplay.getDescriptor().getSkewtResource(); - //create station info structure - NsharpStationInfo stnInfo = new NsharpStationInfo(); - stnInfo.setSndType(selectedModel); - stnInfo.setLatitude(lat); - stnInfo.setLongitude(lon); - skewRsc.addRsc(soundingLysLstMap, stnInfo); - skewRsc.setSoundingType(selectedModel); - NsharpSkewTEditor.bringSkewTEditorToTop(); - } - private void createModelTypeList(){ - if(modelTypeList!=null) - modelTypeList.removeAll(); - if(sndTimeList!=null) - sndTimeList.removeAll(); - if(availableFileList!=null) - availableFileList.removeAll(); - ldDia.startWaitCursor(); - NcSoundingModel mdlNames = NcSoundingQuery.soundingModelNameQuery(gribDecoderName); - //System.out.println("return from NcSoundingQuery "); - if(mdlNames != null) - for(String MdlStr: mdlNames.getMdlList()){ - //System.out.println("model name:"+MdlStr); - modelTypeList.add(MdlStr); - } - ldDia.stopWaitCursor(); - } - /* - private void createModelTypeListOld(){ - if(modelTypeList!=null) - modelTypeList.removeAll(); - if(sndTimeList!=null) - sndTimeList.removeAll(); - if(availableFileList!=null) - availableFileList.removeAll(); - ldDia.startWaitCursor(); - Object[] mdlNames = NcSoundingQuery.soundingModelNameQueryOld(gribDecoderName); - //System.out.println("return from NcSoundingQuery "); - if(mdlNames != null) - for(Object MdlStr: mdlNames){ - //System.out.println("model name:"+MdlStr); - modelTypeList.add((String)MdlStr); - } - ldDia.stopWaitCursor(); - }*/ - public void createMdlDialogContents(){ - selectedFileList.clear(); - topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - topGp.setLayout( new GridLayout( 2, false ) ); - - ldDia.createSndTypeList(topGp); - - modelTypeGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); - modelTypeGp.setText("Model Type"); - modelTypeGp.setFont(newFont); - modelTypeList = new org.eclipse.swt.widgets.List(modelTypeGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - modelTypeList.setBounds(modelTypeGp.getBounds().x, modelTypeGp.getBounds().y + NsharpConstants.labelGap , NsharpConstants.filelistWidth, NsharpConstants.listHeight ); - //query to get and add available sounding models from DB - modelTypeList.setFont(newFont); - createModelTypeList(); - /* - Object[] mdlNames = NcSoundingQuery.soundingModelNameQuery(gribDecoderName); - //System.out.println("return from NcSoundingQuery "); - if(mdlNames != null) - for(Object MdlStr: mdlNames){ - //System.out.println("model name:"+MdlStr); - modelTypeList.add((String)MdlStr); - }*/ - //create a selection listener to handle user's selection on list - modelTypeList.addListener ( SWT.Selection, new Listener () { - public void handleEvent (Event e) { - if (modelTypeList.getSelectionCount() > 0 ) { - selectedModel = modelTypeList.getSelection()[0]; - //System.out.println("selected sounding model is " + selectedModel); - createMDLAvailableFileList(); - } - } - } ); - Group gribGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); - gribGp.setText("Database"); - gribGp.setFont(newFont); - gribGp.setLayout( new GridLayout( 2, false ) ); - Button ncgribBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - ncgribBtn.setText("NCGrib"); - ncgribBtn.setEnabled( true ); - if(currentDb == DBType.NCGRIB) - ncgribBtn.setSelection(true); - ncgribBtn.setFont(newFont); - ncgribBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - currentDb = DBType.NCGRIB; - createModelTypeList(); - } - } ); - Button gribBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - gribBtn.setText("Grib"); - gribBtn.setFont(newFont); - gribBtn.setEnabled( true ); - if(currentDb == DBType.GRIB) - gribBtn.setSelection(true); - gribBtn.setBounds(modelTypeGp.getBounds().x+ NsharpConstants.btnGapX, ncgribBtn.getBounds().y + ncgribBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - gribBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.GRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - currentDb = DBType.GRIB; - createModelTypeList(); - - } - } ); - /* - Button ncgribTestBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - ncgribTestBtn.setText("NCGribTest"); - ncgribTestBtn.setEnabled( true ); - ncgribTestBtn.setSelection(false); - ncgribTestBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - createModelTypeListOld(); - } - } ); */ - timeBtn = new Button(topGp, SWT.CHECK | SWT.BORDER); - timeBtn.setText("00Z and 12Z only"); - timeBtn.setEnabled( true ); - timeBtn.setFont(newFont); - //timeBtn.setBounds(modelTypeGp.getBounds().x+ NsharpConstants.btnGapX, modelTypeGp.getBounds().y + modelTypeGp.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - - timeBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(timeLimit) - timeLimit = false; - else - timeLimit = true; - - //refresh sounding list if file type is selected already - if(selectedModel!=null && selectedFileList.size() > 0){ - createMDLSndTimeList(selectedFileList); - } - - } - } ); - - //bottomGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); - //bottomGp.setLayout( new GridLayout( 2, false ) ); - - availableFileGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); - availableFileGp.setText("Available Grid files:"); - availableFileGp.setFont(newFont); - availableFileList = new org.eclipse.swt.widgets.List(availableFileGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - availableFileList.setBounds(availableFileGp.getBounds().x, availableFileGp.getBounds().y + NsharpConstants.labelGap , NsharpConstants.filelistWidth, NsharpConstants.listHeight*32/5 ); - availableFileList.setFont(newFont); - //create a selection listener to handle user's selection on list - availableFileList.addListener ( SWT.Selection, new Listener () { - private String selectedFile=null; - - public void handleEvent (Event e) { - if (availableFileList.getSelectionCount() > 0 ) { - selectedFileList.clear(); - for(int i=0; i < availableFileList.getSelectionCount(); i++) { - selectedFile = availableFileList.getSelection()[i]; - //System.out.println("selected sounding file is " + selectedFile); - selectedFileList.add(selectedFile); - } - createMDLSndTimeList(selectedFileList); - } - } - } ); - - //create Sounding Times widget list - sndTimeListGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); - sndTimeListGp.setText("Sounding Times:"); - sndTimeListGp.setFont(newFont); - sndTimeList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - sndTimeList.removeAll(); - sndTimeList.setFont(newFont); - sndTimeList.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight *32/5); - sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - - selectedTimeList.clear(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - //System.out.println("selected sounding time is " + selectedSndTime); - selectedTimeList.add(selectedSndTime); - } - NsharpMapResource.bringMapEditorToTop(); - } - } - }); - locationMainGp= new Group(parent,SWT.SHADOW_ETCHED_IN); - locationMainGp.setLayout( new GridLayout( 5, false ) ); - locationMainGp.setText("Location"); - locationMainGp.setFont(newFont); - latlonBtn = new Button(locationMainGp, SWT.RADIO | SWT.BORDER); - latlonBtn.setText("Lat/Lon"); - latlonBtn.setFont(newFont); - latlonBtn.setEnabled(true); - //latlonBtn.setBounds(locationMainGp.getBounds().x+ NsharpConstants.btnGapX, locationMainGp.getBounds().y + NsharpConstants.labelGap, 10, NsharpConstants.btnHeight); - latlonBtn.setSelection(true); - latlonBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentLocType = LocationType.LATLON; - locationText.setText(""); - } - } ); - stationBtn = new Button(locationMainGp, SWT.RADIO | SWT.BORDER); - stationBtn.setText("Station"); - stationBtn.setEnabled(true); - stationBtn.setFont(newFont); - stationBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentLocType = LocationType.STATION; - locationText.setText(""); - } - } ); - //locationInputGp = new Group(locationMainGp,SWT.SHADOW_ETCHED_IN); - locationLbl = new Label(locationMainGp, SWT.NONE | SWT.BORDER); - //locationLbl.setBounds(latlonBtn.getBounds().x, latlonBtn.getBounds().y + latlonBtn.getBounds().height+ NsharpConstants.btnGapY, bottomGp.getBounds().width/2,NsharpConstants.btnHeight); - locationLbl.setText("Location:"); - locationLbl.setFont(newFont); - locationText = new Text(locationMainGp, SWT.BORDER | SWT.SINGLE); - GridData data1 = new GridData (SWT.FILL,SWT.FILL, true, true); - locationText.setLayoutData (data1); - //locationText.setBounds(stationBtn.getBounds().x, locationLbl.getBounds().y,450,NsharpConstants.btnHeight); - locationText.setTextLimit(15); - locationText.setFont(newFont); - locationText.addListener (SWT.Verify, new Listener () { - public void handleEvent (Event e) { - String userInputStr = e.text; - if(userInputStr.length()>0){ - - if(currentLocType == LocationType.LATLON){ - //to make sure user enter digits and separated by ";" or ","only, if lat/lon is used - //System.out.println("user input str" + userInputStr); - if(userInputStr.length() ==1){ - char inputChar = userInputStr.charAt(0); - if (!('0' <= inputChar && inputChar <= '9') && inputChar != ';' && inputChar != ',' && inputChar != '-'&& inputChar != '.') { - e.doit = false; - return; - } - } - } else { - //do nothing when station type - - } - } - } - }); - - loadBtn = new Button(locationMainGp, SWT.PUSH); - loadBtn.setText("Load "); - loadBtn.setFont(newFont); - loadBtn.setEnabled( true ); - loadBtn.setBounds(locationMainGp.getBounds().x+ NsharpConstants.btnGapX, locationLbl.getBounds().y + locationLbl.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - loadBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - if(selectedTimeList != null && selectedTimeList.size() == 0){ - ldDia.setAndOpenMb("Time line(s) is not selected!\n Can not load data!"); - return; - } - String textStr = locationText.getText(); - if((textStr != null) && !(textStr.isEmpty())){ - //textStr = textStr.trim(); - if(currentLocType == LocationType.LATLON){ - //to make sure user enter digits and separated by ";" or ","only, if lat/lon is used - int dividerIndex = textStr.indexOf(';'); - boolean indexFound = false; - if(dividerIndex != -1 ) - indexFound = true; - if(indexFound == false){ - dividerIndex = textStr.indexOf(','); - if(dividerIndex != -1 ) - indexFound = true; - } - if(indexFound == true) { - try{ - lat = Float.parseFloat(textStr.substring(0, dividerIndex)); - lon = Float.parseFloat(textStr.substring(dividerIndex+1)); - if(lat >90 || lat < -90 || lon >180 || lon <-180){ - //System.out.println("bad lat/lon entered =" + textStr); - ldDia.setAndOpenMb("lat/lon out of range ("+textStr+") entered!\n"+GOOD_LATLON_STR); - locationText.setText(""); - return; - } - //System.out.println("user enter lat " + lat+ " lon " + lon); - queryAndLoadData(false); - - } catch (Exception e) { - System.out.println("queryAndLoadData failed at " + textStr); - //ldDia.setAndOpenMb("Bad lat/lon ("+textStr+") entered!\n"+GOOD_LATLON_STR); - //locationText.setText(""); - return; - } - - } - else { - //System.out.println("2 bad lat/lon entered =" + textStr); - ldDia.setAndOpenMb("Bad lat/lon ("+textStr+") entered!\n"+GOOD_LATLON_STR); - locationText.setText(""); - return; - } - } else if(currentLocType == LocationType.STATION){ - //query station lat /lon - textStr = textStr.trim(); // user may start with a space before enter a station id - stnStr = textStr.toUpperCase(Locale.getDefault()); - Coordinate co = SurfaceStationPointData.getStnCoordinate(stnStr); - lat = (float) co.y; - lon = (float) co.x; - //System.out.println("user enter station ="+ stnStr+" length="+ stnStr.length()+" lat " + lat+ " lon " + lon); - if(lat == SurfaceStationPointData.DEFAULT_LATLON){ - //System.out.println("bad stn id entered =" + textStr); - ldDia.setAndOpenMb("Bad station id ("+textStr+") entered!\n"+GOOD_STN_STR); - locationText.setText(""); - return; - } - queryAndLoadData(true); - } - - //ldDia.close(); - } - } - } ); - /*newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; - else - newtab = false; - - } - } ); - */ - } - - public void cleanup(){ - /* - if(gfsBtn != null){ - gfsBtn.removeListener(SWT.MouseUp, gfsBtn.getListeners(SWT.MouseUp)[0]); - gfsBtn.dispose(); - gfsBtn = null; - } - if(namBtn != null){ - namBtn.removeListener(SWT.MouseUp, namBtn.getListeners(SWT.MouseUp)[0]); - namBtn.dispose(); - namBtn = null; - } - if(ngmBtn != null){ - ngmBtn.removeListener(SWT.MouseUp, ngmBtn.getListeners(SWT.MouseUp)[0]); - ngmBtn.dispose(); - ngmBtn = null; - } - if(ruc2Btn != null){ - ruc2Btn.removeListener(SWT.MouseUp, ruc2Btn.getListeners(SWT.MouseUp)[0]); - ruc2Btn.dispose(); - ruc2Btn = null; - } - if(ukmetBtn != null){ - ukmetBtn.removeListener(SWT.MouseUp, ukmetBtn.getListeners(SWT.MouseUp)[0]); - ukmetBtn.dispose(); - ukmetBtn = null; - } */ - if(modelTypeList!=null){ - modelTypeList.removeListener(SWT.Selection, modelTypeList.getListeners(SWT.Selection)[0]); - modelTypeList.dispose(); - modelTypeList = null; - } - if(modelTypeGp!= null){ - modelTypeGp.dispose(); - modelTypeGp = null; - } - if(timeBtn != null){ - timeBtn.removeListener(SWT.MouseUp, timeBtn.getListeners(SWT.MouseUp)[0]); - timeBtn.dispose(); - timeBtn = null; - } - - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.cleanSndTypeList(); - - - - - if(availableFileList!= null){ - availableFileList.removeListener(SWT.Selection, availableFileList.getListeners(SWT.Selection)[0]); - availableFileList.dispose(); - availableFileList = null; - } - - if(availableFileGp!= null){ - availableFileGp.dispose(); - availableFileGp = null; - } - if(sndTimeList!= null){ - sndTimeList.removeListener(SWT.Selection, sndTimeList.getListeners(SWT.Selection)[0]); - sndTimeList.dispose(); - sndTimeList = null; - } - if(sndTimeListGp!= null){ - sndTimeListGp.dispose(); - sndTimeListGp = null; - } - if(bottomGp!= null){ - bottomGp.dispose(); - bottomGp = null; - } - if(topGp!= null){ - topGp.dispose(); - topGp = null; - } - - if(loadBtn != null){ - loadBtn.removeListener(SWT.MouseUp, loadBtn.getListeners(SWT.MouseUp)[0]); - loadBtn.dispose(); - loadBtn = null; - } - if(stationBtn != null){ - stationBtn.removeListener(SWT.MouseUp, stationBtn.getListeners(SWT.MouseUp)[0]); - stationBtn.dispose(); - stationBtn = null; - } - if(latlonBtn != null){ - latlonBtn.removeListener(SWT.MouseUp, latlonBtn.getListeners(SWT.MouseUp)[0]); - latlonBtn.dispose(); - latlonBtn = null; - } - if(locationText != null){ - locationText.removeListener(SWT.Verify, locationText.getListeners(SWT.Verify)[0]); - locationText.dispose(); - locationText = null; - } - - if(locationLbl!= null){ - locationLbl.dispose(); - locationLbl = null; - } - if(locationMainGp!= null){ - locationMainGp.dispose(); - locationMainGp = null; - } - /*if(newTabBtn != null){ - newTabBtn.removeListener(SWT.MouseUp, newTabBtn.getListeners(SWT.MouseUp)[0]); - newTabBtn.dispose(); - newTabBtn = null; - }*/ - - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpHandleArchiveFile.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpHandleArchiveFile.java deleted file mode 100644 index 32f6eab56c..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpHandleArchiveFile.java +++ /dev/null @@ -1,269 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.menu; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.NsharpHandleArchiveFile - * - * This java class performs the NSHARP loading archived files functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 12/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpDataHandling; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; - -public class NsharpHandleArchiveFile { - public static void openArchiveFile(Shell shell){ - /* - * A typical saved file contents is as following.... - * PFC NAMSND KSWF 2010-12-12 11:00:00 LAT=41.52 LON=-74.19 - * PRESSURE HGHT TEMP DWPT WDIR WSPD OMEG - * 997.500000 129.000000 -3.250006 -3.381190 10.619656 1.627882 0.000000 - * ........ - */ - FileDialog fd = new FileDialog(shell, SWT.MULTI);//SWT.OPEN); - fd.setText("Open"); - fd.setFilterPath("C:/"); - String[] filterExt = { "*.nsp", "*","*.txt", "*.doc", ".rtf", "*.*" }; - fd.setFilterExtensions(filterExt); - String selected; - String code= fd.open(); - if(code == null){ - return; - } - String [] selecteds = fd.getFileNames(); - - //if(selected!= null){ - if(selecteds!= null && selecteds.length > 0){ - Map> soundingLysLstMap = new HashMap>(); - //List timeList = new ArrayList(); - String timeLine ; - String stnDispInfoStr; - //read in archive file - InputStream is = null; - NsharpStationInfo stninfo = new NsharpStationInfo(); - String sndType="N/A"; - try { - for( int j = 0; j < selecteds.length; j++){ - selected = ""; - StringBuilder strContent = new StringBuilder(""); - selected = selected + fd.getFilterPath(); - if (selected.charAt(selected.length() - 1) != File.separatorChar) { - selected = selected + (File.separatorChar); - } - selected = selected + selecteds[j]; - //System.out.println(selected); - - is = new FileInputStream(selected); - int byteread; - while((byteread = is.read()) != -1){ - strContent.append((char)byteread); - //System.out.println((char)byteread); - } - //System.out.println(strContent); - - //hash map, use stn display info as key - //Chin-T Map> soundingLysLstMap = new HashMap>(); - timeLine = new String(""); - stnDispInfoStr = new String(""); - List sndLyList = new ArrayList(); - NcSoundingLayer sndLy = null; - StringTokenizer st = new StringTokenizer(strContent.toString()); - int i =0; - int loadSndTypeIndex = 1; - int sndTypeIndex = 2; - int dataStartIndex = 15; - int stnInfoIndexEnd = 5; - int stnLatIndex = 6; - int stnLonIndex = 7; - int latlonTokenHdrLength = 4; // either "LAT=" or "LON=" - int dataCycleLength = 7; - while (st.hasMoreTokens()) { - i++; - //System.out.println(st.nextToken()); - //Chin's NOTE: Our input file should have the same format as the text information shown with "Show Text" - // button. The "Save" Button will save text data in same format as well. - //first token is stn display info string, - //2nd and 3rd token are time line. - //4th and 5th tokens are LAT=xxx, LON=xxx of stn - //token 6 to 12 are PRESSURE, HGHT, TEMP, DWPT, WDIR, WSPD, OMEG words. We don't need to read them. - //From token 13, we have pressure, height, temp,..., omega, pressure, height,..omega. - //These weather data will be repeated every 7 tokens. - String tok = st.nextToken(); - if(i == loadSndTypeIndex){ - if(NsharpLoadDialog.getAccess()!= null ){ - if(tok.equals("PFC")) - NsharpLoadDialog.getAccess().setActiveLoadSoundingType(NsharpLoadDialog.PFC_SND); - else if(tok.equals("MDL")) - NsharpLoadDialog.getAccess().setActiveLoadSoundingType(NsharpLoadDialog.MODEL_SND); - else - NsharpLoadDialog.getAccess().setActiveLoadSoundingType(NsharpLoadDialog.OBSER_SND); - } - //System.out.println("loadsnd type "+ tok); - } - else if(i == sndTypeIndex){ - sndType = tok; - stninfo.setSndType(sndType); - //System.out.println("snd type "+ sndType); - } - else if (i > sndTypeIndex && i<= stnInfoIndexEnd){ - - //stn display info - stnDispInfoStr = stnDispInfoStr + tok + " "; - if( i >=3){ - //time line - timeLine = timeLine + tok + " "; - } - } else if (i == stnLatIndex){ - float lat=0; - if(tok.length() > latlonTokenHdrLength) { - lat = Float.parseFloat(tok.substring(latlonTokenHdrLength)); - } - stninfo.setLatitude(lat); - } else if (i == stnLonIndex){ - float lon=0; - if(tok.length() > latlonTokenHdrLength) { - lon = Float.parseFloat(tok.substring(latlonTokenHdrLength)); - } - stninfo.setLongitude(lon); - } else if (i >=dataStartIndex){ - - if((i-dataStartIndex)%dataCycleLength ==0){ - sndLy = new NcSoundingLayer(); - sndLyList.add(sndLy); - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setPressure(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setPressure(Float.parseFloat(tok)); - - }else if((i-dataStartIndex)%dataCycleLength ==1){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setGeoHeight(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setGeoHeight(Float.parseFloat(tok)); - }else if((i-dataStartIndex)%dataCycleLength ==2){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setTemperature(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setTemperature(Float.parseFloat(tok)); - }else if((i-dataStartIndex)%dataCycleLength ==3){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setDewpoint(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setDewpoint(Float.parseFloat(tok)); - }else if((i-dataStartIndex)%dataCycleLength ==4){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setWindDirection(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setWindDirection(Float.parseFloat(tok)); - }else if((i-dataStartIndex)%dataCycleLength ==5){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setWindSpeed(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setWindSpeed(Float.parseFloat(tok)); - }else if((i-dataStartIndex)%dataCycleLength ==6){ - if( Float.isNaN(Float.parseFloat(tok) )) - sndLy.setOmega(NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA); - else - sndLy.setOmega(Float.parseFloat(tok)); - - } - - } - //System.out.println("line " + i + "="+ tok); - - } - //System.out.println("total line " + i); - //System.out.println("time line " + timeLine + " stn disp info = " + stnDispInfo); - if(sndLyList.size()> 0) - //Remove sounding layers that not used by NSHARP, and assume first layer is sfc layer from input data - sndLyList = NsharpDataHandling.organizeSoundingDataForShow(sndLyList, sndLyList.get(0).getGeoHeight()); - //minimum rtnSndList size will be 2 (50 & 75 mb layers), but that is not enough - // We need at least 2 regular layers for plotting - if(sndLyList != null && sndLyList.size() > 4) - soundingLysLstMap.put(stnDispInfoStr, sndLyList); - } - if(soundingLysLstMap.size()>0){ - - NsharpSkewTDisplay renderableDisplay;// = new NsharpSkewTDisplay(); - - // create an editor NsharpSkewTEditor - NsharpSkewTEditor skewtEdt = NsharpSkewTEditor.createOrOpenSkewTEditor(); - - renderableDisplay = (NsharpSkewTDisplay) skewtEdt.getActiveDisplayPane().getRenderableDisplay(); - - renderableDisplay.setEditorNum(skewtEdt.getEditorNum()); - NsharpSkewTResource skewRsc = renderableDisplay.getDescriptor().getSkewtResource(); - skewRsc.addRsc(soundingLysLstMap, stninfo); - skewRsc.setSoundingType(sndType); - } - else { - //Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - mb.setMessage("Invalid sounding data retrieved from archive file!!"); - mb.open(); - } - //test - //textToShow=""; - //for (NcSoundingLayer layer: sndLyList){ - // tempText = String.format("%7.2f\t%8.2f %7.2f %7.2f %6.2f %6.2f %9.6f\n", layer.getPressure(), - // layer.getGeoHeight(),layer.getTemperature(),layer.getDewpoint(), layer.getWindDirection(), - // layer.getWindSpeed(), layer.getOmega()); - // textToShow = textToShow + tempText; - //} - //System.out.println("Endof openArchiveFile"); - //end test - } catch (FileNotFoundException e) { - - e.printStackTrace(); - } catch (IOException e) { - - e.printStackTrace(); - } catch (NumberFormatException e) { - System.out.println("number format exception happened"); - e.printStackTrace(); - } - finally { - if (is != null) { - try { - is.close(); - } catch (IOException ioe) { - System.out.println("Could not close input file "); - } - } - } - } - - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpLoadDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpLoadDialog.java deleted file mode 100644 index 3b697675f8..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpLoadDialog.java +++ /dev/null @@ -1,431 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.menu; - - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpLoadDialog extends Dialog { - - private final static int DIALOG_WIDTH = 350; - private final static int DIALOG_HEIGHT = 920; - - protected Composite top; - private static Composite dialogParent; - private static NsharpLoadDialog INSTANCE = null; - private static Shell shell; - private org.eclipse.swt.widgets.List soundingTypeList; - public static final String[] soundingTypeStringArray = { - "Observed Soundings" , "Model Soundings", "PFC Soundings", "Archive Files","ACARS Soundings" - }; - // define index to loadStringArray - public static final int OBSER_SND = 0; - public static final int MODEL_SND = 1; - public static final int PFC_SND = 2; - public static final int ARCHIVE = 3; - public static final int ACARS_SND = 4; - private ObservedSoundingDialogContents obsDialog; - private PfcSoundingDialogContents pfcDialog; - private ModelSoundingDialogContents mdlDialog; - private Group soundingTypeGp, acarsGp; - private int activeLoadSoundingType; - private Text text1; - private MessageBox mb; - private Cursor waitCursor=null; - private Font newFont; - - public Font getNewFont() { - return newFont; - } - public ObservedSoundingDialogContents getObsDialog() { - return obsDialog; - } - public PfcSoundingDialogContents getPfcDialog() { - return pfcDialog; - } - public void setAndOpenMb(String msg) { - if (mb != null) { - mb.setMessage(msg); - try { - mb.open(); - }catch (Exception e) { - mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - mb.setMessage(msg); - mb.open(); - //e.printStackTrace(); - } - } - } - public ModelSoundingDialogContents getMdlDialog() { - return mdlDialog; - } - public void createSndTypeList(Group TopLoadGp) { - soundingTypeGp = new Group(TopLoadGp,SWT.SHADOW_ETCHED_IN); - soundingTypeGp.setText("Sounding Type"); - soundingTypeGp.setFont(newFont); - soundingTypeList = new org.eclipse.swt.widgets.List(soundingTypeGp, SWT.SINGLE | SWT.V_SCROLL ); - soundingTypeList.setBounds(soundingTypeGp.getBounds().x + NsharpConstants.btnGapX, soundingTypeGp.getBounds().y +NsharpConstants.labelGap, NsharpConstants.filelistWidth, NsharpConstants.listHeight); - soundingTypeList.setFont(newFont); - for(String loadStr : soundingTypeStringArray){ - soundingTypeList.add( loadStr ); - } - //create a selection listener to handle user's selection on list - soundingTypeList.addListener ( SWT.Selection, new Listener () { - private String selectedProduct=null; - public void handleEvent (Event e) { - if (soundingTypeList.getSelectionCount() > 0 ) { - - selectedProduct = soundingTypeList.getSelection()[0]; - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor!=null) - editor.refresh(); - //shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - if(selectedProduct.equals(soundingTypeStringArray[OBSER_SND])){ - //System.out.println("OBSER_SND enter"); - - if(activeLoadSoundingType != OBSER_SND){ - cleanupDialog(activeLoadSoundingType); //clean up before resetting activeLoadType - activeLoadSoundingType = OBSER_SND; - obsDialog.createObsvdDialogContents(); - //shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - soundingTypeList.setSelection(OBSER_SND); - } - } - else if(selectedProduct.equals(soundingTypeStringArray[MODEL_SND])){ - //System.out.println("MODEL_SND enter"); - if(activeLoadSoundingType != MODEL_SND) { - cleanupDialog(activeLoadSoundingType);//clean up before resetting activeLoadType - activeLoadSoundingType = MODEL_SND; - mdlDialog.createMdlDialogContents(); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - soundingTypeList.setSelection(MODEL_SND); - - } - } - else if(selectedProduct.equals(soundingTypeStringArray[PFC_SND])){ - //System.out.println("PFC_SND enter"); - if(activeLoadSoundingType != PFC_SND){ - cleanupDialog(activeLoadSoundingType); //clean up before resetting activeLoadType - activeLoadSoundingType = PFC_SND; - pfcDialog.createPfcDialogContents(); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - soundingTypeList.setSelection(PFC_SND); - - } - - } - else if(selectedProduct.equals(soundingTypeStringArray[ARCHIVE])){ - //System.out.println("ARCHIVE enter"); - - if(activeLoadSoundingType != ARCHIVE) { - cleanupDialog(activeLoadSoundingType);//clean up before resetting activeLoadType - activeLoadSoundingType = ARCHIVE; - NsharpHandleArchiveFile.openArchiveFile(shell); - close(); - } - - } - else if(selectedProduct.equals(soundingTypeStringArray[ACARS_SND])){ - //System.out.println("ACARS_SND enter"); - if(activeLoadSoundingType != ACARS_SND) { - cleanupDialog(activeLoadSoundingType);//clean up before resetting activeLoadType - activeLoadSoundingType = ACARS_SND; - //setShellSize(false); - acarsGp = new Group(dialogParent,SWT.SHADOW_ETCHED_IN); - acarsGp.setLayout( new GridLayout( 1, false ) ); - createSndTypeList(acarsGp); - text1 = new Text(acarsGp, SWT.MULTI | SWT.BORDER | SWT.WRAP ); - text1.setText("Acars Soundings\nis still under\ndevelopment!"); - dialogParent.pack(); - dialogParent.layout(true); - dialogParent.redraw(); - soundingTypeList.setSelection(ACARS_SND); - - } - } - } - } - }); - } - public void cleanSndTypeList(){ - if(soundingTypeList!= null){ - soundingTypeList.removeListener(SWT.Selection, soundingTypeList.getListeners(SWT.Selection)[0]); - soundingTypeList.dispose(); - soundingTypeList = null; - } - if(soundingTypeGp!=null){ - soundingTypeGp.dispose(); - soundingTypeGp=null; - } - } - - private void cleanSelf(){ - - if(text1 != null){ - text1.dispose(); - text1 = null; - } - } - - private void cleanupDialog(int activeLoadType){ - switch (activeLoadType) { - case OBSER_SND: - obsDialog.cleanup(); - break; - case MODEL_SND: - mdlDialog.cleanup(); - break; - case PFC_SND: - pfcDialog.cleanup(); - break; - case ACARS_SND: - if(text1 != null){ - text1.dispose(); - text1 = null; - } - if(acarsGp!= null){ - acarsGp.dispose(); - acarsGp = null; - } - break; - case ARCHIVE: - break; - default: - break; - } - - } - - public void setActiveLoadSoundingType(int activeLoadSoundingType) { - this.activeLoadSoundingType = activeLoadSoundingType; - } - public int getActiveLoadSoundingType() { - return activeLoadSoundingType; - } - - - - static int count = 0; - - public static NsharpLoadDialog getAccess() { - return INSTANCE; - } - - public NsharpLoadDialog(Shell parentShell)throws VizException { - super(parentShell); - // set modeless, so mouse button can be used by others - this.setShellStyle(SWT.TITLE | SWT.MODELESS | SWT.CLOSE ); - - //System.out.println("loadDia constructed"); - activeLoadSoundingType = OBSER_SND; - - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) - */ - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - NsharpLoadDialog.shell = shell; - shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); - shell.setText( "Load" ); - mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - - mb.setMessage( "User Input Error!"); - Font font = shell.getFont(); - FontData[] fontData = font.getFontData(); - for (int i = 0; i < fontData.length; i++) { - fontData[i].setHeight(7); - //fontData[i].setName("courier"); - } - newFont = new Font(font.getDevice(), fontData); - shell.setFont(newFont); - } - - private void createLoadContents(Composite parent) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor().getSkewtResource(); - rsc.cleanUpRsc(); - editor.refresh(); - } - dialogParent = parent; - obsDialog = new ObservedSoundingDialogContents(dialogParent); - pfcDialog = new PfcSoundingDialogContents(dialogParent); - mdlDialog = new ModelSoundingDialogContents(dialogParent); - switch(activeLoadSoundingType){ - case MODEL_SND: - mdlDialog.createMdlDialogContents(); - break; - case PFC_SND: - pfcDialog.createPfcDialogContents(); - break; - default: //OBSER_SND is default for all other cases, also set activeLoadSoundingType to OBSER_SND - obsDialog.createObsvdDialogContents(); - activeLoadSoundingType = OBSER_SND; - break; - } - - soundingTypeList.setSelection(activeLoadSoundingType); - - } - - /** - * Creates the dialog area - */ - @Override - public Control createDialogArea(Composite parent) { - - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - - //top.setLayout(mainLayout); - //System.out.println("createDialogArea called"); - // Initialize all of the menus, controls, and layouts - createLoadContents(top); - shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT); - if(waitCursor==null) - waitCursor = new Cursor( top.getDisplay(), SWT.CURSOR_WAIT); - return top; - } - - - @Override - public int open( ) { - //System.out.println("loadDia opened"); - - if ( this.getShell() == null ){ - this.create(); - } - this.getShell().setLocation(this.getShell().getParent().getLocation().x+1100, - this.getShell().getParent().getLocation().y+200); - NsharpMapResource.bringMapEditorToTop(); - return super.open(); - - } - @Override - public boolean close() { - NsharpMapResource nsharpMapResource = NsharpMapResource.getMapRsc(); - if(nsharpMapResource!=null) - nsharpMapResource.setPoints(null); - //System.out.println("loadDia closed"); - cleanSelf(); - cleanupDialog(activeLoadSoundingType); - //INSTANCE = null; - if(waitCursor!=null) - waitCursor.dispose(); - waitCursor=null; - newFont.dispose(); - return (super.close()); - } - - public boolean closeDiaOnly() { - cleanSelf(); - return (super.close()); - } - - //Only use Cancel button but NOT ok button - @Override - public void createButtonsForButtonBar(Composite parent) { - - // create Cancel buttons by default, but use close label - Button cancelBtn = createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CLOSE_LABEL, false); - - - //cancelBtn.setBounds(cancelBtn.getBounds().x, cancelBtn.getBounds().y+DIALOG_HEIGHT, 20, 10); - //System.out.println("createButtonsForButtonBar cancelBtn bound"+cancelBtn.getBounds()); - } - - - - public static NsharpLoadDialog getInstance( Shell parShell){ - //System.out.println("getInstance called"); - if ( INSTANCE == null ){ - try { - INSTANCE = new NsharpLoadDialog( parShell ); - //System.out.println("new load dialog INSTANCE created"); - } catch (VizException e) { - e.printStackTrace(); - } - - } - return INSTANCE; - - } - - //public void setShellSize(boolean big){ - // if(big == true) { - - // } - // else { - // shell.setSize(DIALOG_WIDTH, DIALOG_HEIGHT-100); - // } - //} - public void startWaitCursor(){ - if(waitCursor!=null) - top.setCursor(waitCursor); - } - public void stopWaitCursor(){ - top.setCursor(null); - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpUnloadDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpUnloadDialog.java deleted file mode 100644 index 25c1ba4c23..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/NsharpUnloadDialog.java +++ /dev/null @@ -1,205 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.NsharpUnloadDialog - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code is developed by NCEP-SIB for AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 04/21/2011	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.menu; - -import java.util.ArrayList; -import java.util.List; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpSoundingElementStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; - -public class NsharpUnloadDialog extends Dialog { - private static NsharpUnloadDialog INSTANCE = null; - private org.eclipse.swt.widgets.List sndTimeList; - private List selectedTimeList = new ArrayList(); - protected Composite top; - protected NsharpUnloadDialog(Shell parentShell) { - super(parentShell); - } - public static NsharpUnloadDialog getInstance( Shell parShell){ - - if ( INSTANCE == null ){ - INSTANCE = new NsharpUnloadDialog( parShell ); //System.out.println("new unload dialog INSTANCE created"); - - } - return INSTANCE; - - } - - @Override - public int open() { - return super.open(); - } - @Override - public boolean close() { - - if(sndTimeList!=null){ - sndTimeList.removeListener(SWT.Selection, sndTimeList.getListeners(SWT.Selection)[0]); - sndTimeList.dispose(); - sndTimeList = null; - } - if(selectedTimeList!= null){ - selectedTimeList.clear(); - selectedTimeList = null; - } - INSTANCE = null; - return super.close(); - } - - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Unload" ); - } - @Override - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); - - } - - - @Override - protected Control createDialogArea(Composite parent) { - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDiaContents(top); - - return top; - } - - - private void createDiaContents(Composite parent) { - //create file widget list - Group sndTimeListGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - //sndTimeListGp.setText("Loaded Sounding Times:"); - sndTimeList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - sndTimeList.setBounds(0,0, 2*NsharpConstants.listWidth, NsharpConstants.listHeight * 8); - createSndList(); - //create a selection listener to handle user's selection on list - sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - selectedTimeList.clear(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - selectedTimeList.add(selectedSndTime); - } - - } - } - }); - - Group buttonGp = new Group(parent,SWT.SHADOW_OUT); - buttonGp.setLayout( new GridLayout(2, false) ); - - Button unloadAllBtn = new Button(buttonGp, SWT.PUSH); - unloadAllBtn.setText(" Unload All "); - unloadAllBtn.setEnabled( true ); - unloadAllBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO); - messageBox.setText("Warning"); - messageBox.setMessage("Unloading ALL sounding data?"); - int response = messageBox.open(); - if(response == SWT.YES) { - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - rsc.deleteRscAll(); - selectedTimeList.clear(); - close(); - } - - } - - } ); - Button unloadSelectedBtn = new Button(buttonGp, SWT.PUSH); - unloadSelectedBtn.setText("Unload Selected"); - unloadSelectedBtn.setEnabled( true ); - unloadSelectedBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("Unload Selected"); - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - if(selectedTimeList.size() == sndTimeList.getItemCount()){ - rsc.deleteRscAll(); - }else { - rsc.deleteRsc(selectedTimeList); - } - selectedTimeList.clear(); - close(); - } - } ); - } - private boolean checkLoadedRsc() { - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor == null) { - return false; - } - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor() - .getSkewtResource(); - if (rsc == null || rsc.getSoundingLys() == null) { - return false; - } - return true; - } - private void createSndList(){ - if(checkLoadedRsc()== false) - return; - //after checking, rsc is not null guaranteed. - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - //List timeLineElementList = rsc.getDataTimelineList(); - List> stnTmTable = rsc.getStnTimeTable(); - //for(ElementStateProperty elm: timeLineElementList){ - // sndTimeList.add(elm.getElementDescription()); - //} - for(List stnTmList: stnTmTable){ - for(NsharpSoundingElementStateProperty tm: stnTmList){ - if(tm.getElementState() != NsharpConstants.State.NOTAVAIL){ - sndTimeList.add(tm.getElementDescription()); - } - } - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ObservedSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ObservedSoundingDialogContents.java deleted file mode 100644 index 7df60c1309..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/ObservedSoundingDialogContents.java +++ /dev/null @@ -1,393 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.ObservedSoundingDialogContents - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 01/2011	    229			Chin Chen	Initial coding
- * 09/14/2011   457         S. Gurung   Renamed H5UAIR to NCUAIR
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.menu; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfo; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfoCollection; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingTimeLines; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; - -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.TimeZone; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; - -public class ObservedSoundingDialogContents { - private Composite parent; - private org.eclipse.swt.widgets.List sndTimeList; - private Group btnGp, sndTimeListGp, topGp, midGp; - private boolean timeLimit = false; - private boolean rawData = false; - private Button timeBtn, bufruaBtn, uairBtn, rawBtn; - private String FILE_UAIR = "UAIR"; - private String FILE_BUFRUA = "BUFRUA"; - //private String FILE_DROP = "DROP"; - private NcSoundingProfile.ObsSndType currentSndType = NcSoundingProfile.ObsSndType.NONE; - private NsharpLoadDialog ldDia; - private List selectedTimeList = new ArrayList(); - private Font newFont; - public boolean isRawData() { - return rawData; - } - public NcSoundingProfile.ObsSndType getCurrentSndType() { - return currentSndType; - } - public ObservedSoundingDialogContents(Composite parent) { - this.parent = parent; - ldDia = NsharpLoadDialog.getAccess(); - newFont = ldDia.getNewFont(); - } - private void createObsvdSndUairList() { - sndTimeList.removeAll(); - - // use NcSoundingQuery to query - NcSoundingTimeLines timeLines = NcSoundingQuery.soundingTimeLineQuery(currentSndType.toString()); - - if(timeLines!= null && timeLines.getTimeLines() != null){ - ldDia.startWaitCursor(); - for(Object timeLine : timeLines.getTimeLines()){ - Timestamp synoptictime = (Timestamp)timeLine; - if(synoptictime != null){ - //need to format synoptictime to GMT time string. Timestamp.toString produce a local time Not GMT time - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(synoptictime.getTime()); - String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tH%1$tM %2$s", cal, currentSndType.toString()); - //String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); - //System.out.println("GMT time " + gmtTimeStr + " msec="+ synoptictime.getTime() + " local time "+synoptictime.toString()); - if(!timeLimit){ - //System.out.println("not 00z and 12z only"); - sndTimeList.add(gmtTimeStr); - } - else { - int hour = cal.get(Calendar.HOUR_OF_DAY); - //System.out.println("00z and 12z only hour = "+ hour); - if((hour == 0) || (hour == 12)) - sndTimeList.add(gmtTimeStr); - } - } - } - ldDia.stopWaitCursor(); - } - else - System.out.println("EDEX timeline query return null"); - - } - private void queryAndMarkStn(String selectedSndTime) { - String selectTimetr = NcSoundingQuery.convertSoundTimeDispStringToRangeStartTimeFormat(selectedSndTime); - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource(); - //Chin float lat, lon; - double lat, lon; - String stnInfoStr; - - //use NcSoundingQuery to query stn info - NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(currentSndType.toString(),selectTimetr); - if(sndStnInfoCol != null && sndStnInfoCol.getStationInfo() != null){ - - NcSoundingStnInfo[] stnInfoAry = sndStnInfoCol.getStationInfo(); - //System.out.println("queryAndMarkStn called mapresource = "+ nsharpMapResource.toString()); - //Note: A same station may have many reports - for(int i=0; i < stnInfoAry.length; i++){ - NcSoundingStnInfo stnInfo = stnInfoAry[i]; - Timestamp synoptictime=null; - stnInfoStr= stnInfo.getStnId(); - if(stnInfoStr== null || stnInfoStr.length() < 1) - stnInfoStr = "*"; - lat = stnInfo.getStationLatitude(); - lon = stnInfo.getStationLongitude(); - //elv = stnInfo.getStationElevation(); - synoptictime = (Timestamp)stnInfo.getSynopTime(); - - //convert to Nsharp's own station info struct - NsharpStationInfo stn = new NsharpStationInfo(); - stn.setStnDisplayInfo(stnInfoStr + " " + selectedSndTime+ " "+currentSndType.toString()); - stn.setLongitude(lon); - stn.setLatitude(lat); - //stn.setElevation(elv); - stn.setReftime(synoptictime); - stn.setRangestarttime(synoptictime); - stn.setSndType(currentSndType.toString()); - //System.out.println("sndType= "+currentSndType); - //System.out.println("stn lat ="+stn.getLatitude() + " lon="+stn.getLongitude()); - nsharpMapResource.addPoint(stn); - } - - NsharpMapResource.bringMapEditorToTop(); - /* Chin test if(NsharpMapResource.getMapEditor() != null){ - - //NmapUiUtils.getActiveNatlCntrsEditor().refresh(); - NsharpMapResource.getMapEditor().refresh(); - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().bringToTop(NsharpMapResource.getMapEditor()); - } - else{ - //bring the MAP editor back to top - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().bringToTop(NmapUiUtils.findDisplayByName("Map")); - - }*/ - } - //NsharpMapModalTool.setModal(); - } - public void createObsvdDialogContents(){ - currentSndType = NcSoundingProfile.ObsSndType.NONE; - timeLimit =false; - rawData = false; - topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - topGp.setLayout( new GridLayout( 2, false ) ); - - //ldDia.setShellSize(false); - ldDia.createSndTypeList(topGp); - - btnGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); - btnGp.setText("File Type"); - btnGp.setFont(newFont); - uairBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - uairBtn.setText(FILE_UAIR); - uairBtn.setEnabled( true ); - uairBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, btnGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - uairBtn.setFont(newFont); - uairBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.NCUAIR; - createObsvdSndUairList(); - //System.out.println("new obvSnd dialog uair btn"); - } - } ); - - bufruaBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - bufruaBtn.setText(FILE_BUFRUA); - bufruaBtn.setEnabled( true ); - bufruaBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, uairBtn.getBounds().y + uairBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - bufruaBtn.setFont(newFont); - bufruaBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.BUFRUA; - createObsvdSndUairList(); - } - } ); - /*/NCUAIR - ncuairBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - ncuairBtn.setText("NCUAIR"); - ncuairBtn.setEnabled( true ); - ncuairBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - - ncuairBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - //CHIN HDF5 test - currentSndType = NcSoundingProfile.ObsSndType.NCUAIR; - createObsvdSndUairList(); - //System.out.println("new obvSnd dialog uair btn"); - } - } ); - - dropBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - dropBtn.setText(FILE_DROP); - dropBtn.setEnabled( false ); - dropBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - - dropBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.DROP; - } - } ); - tamBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - tamBtn.setText(FILE_TAMDAR); - tamBtn.setEnabled( false ); - tamBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - //tamBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, ncuairBtn.getBounds().y + ncuairBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - tamBtn.setFont(newFont); - tamBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.TAMDAR; - } - } ); - browseBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - browseBtn.setText(FILE_BROWSE); - browseBtn.setEnabled( false ); - browseBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, tamBtn.getBounds().y + tamBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - browseBtn.setFont(newFont); - browseBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.BROWSE; - } - } ); */ - midGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - midGp.setLayout( new GridLayout( 2, false ) ); - timeBtn = new Button(midGp, SWT.CHECK | SWT.BORDER); - timeBtn.setText("00Z and 12Z only"); - timeBtn.setEnabled( true ); - //timeBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - timeBtn.setFont(newFont); - timeBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(timeBtn.getSelection()) - timeLimit = true; - else - timeLimit = false; - - //refresh sounding list if file type is selected already - if(currentSndType== NcSoundingProfile.ObsSndType.NCUAIR /*|| currentSndType == NcSoundingProfile.ObsSndType.UAIR*/|| currentSndType == NcSoundingProfile.ObsSndType.BUFRUA){ - createObsvdSndUairList(); - } - - - } - } ); - rawBtn = new Button(midGp, SWT.CHECK | SWT.BORDER); - rawBtn.setText("raw data"); - rawBtn.setEnabled( true ); - rawBtn.setBounds(timeBtn.getBounds().x+timeBtn.getBounds().width, timeBtn.getBounds().y, - timeBtn.getBounds().width, timeBtn.getBounds().height); - rawBtn.setFont(newFont); - rawBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(rawBtn.getSelection()) - rawData = true; - else - rawData = false;; - } - } ); - //create file widget list - sndTimeListGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - sndTimeListGp.setText("Sounding Times:"); - sndTimeListGp.setFont(newFont); - sndTimeList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - sndTimeList.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight*7 ); - sndTimeList.setFont(newFont); - //create a selection listener to handle user's selection on list - sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - selectedTimeList.clear(); - ldDia.startWaitCursor(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - //System.out.println("selected sounding time is " + selectedSndTime); - int endIndex = selectedSndTime.indexOf(" "); - selectedSndTime = selectedSndTime.substring(0, endIndex); - queryAndMarkStn(selectedSndTime); - selectedTimeList.add(selectedSndTime); - } - ldDia.stopWaitCursor(); - - //NsharpMapMouseHandler.getAccess().setSelectedTimeList(selectedTimeList); - } - } - }); - /*newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; - else - newtab = false; - } - } ); */ - } - public void cleanup(){ - if(sndTimeList != null){ - sndTimeList.removeListener(SWT.Selection, sndTimeList.getListeners(SWT.Selection)[0]); - sndTimeList.dispose(); - sndTimeList = null; - } - if(sndTimeListGp!= null){ - sndTimeListGp.dispose(); - sndTimeListGp = null; - } - if(timeBtn != null){ - timeBtn.removeListener(SWT.MouseUp, timeBtn.getListeners(SWT.MouseUp)[0]); - timeBtn.dispose(); - timeBtn= null; - } - if(rawBtn != null){ - rawBtn.removeListener(SWT.MouseUp, rawBtn.getListeners(SWT.MouseUp)[0]); - rawBtn.dispose(); - rawBtn= null; - } - if(midGp!= null){ - midGp.dispose(); - midGp = null; - } - /*if(browseBtn != null){ - browseBtn.removeListener(SWT.MouseUp, browseBtn.getListeners(SWT.MouseUp)[0]); - browseBtn.dispose(); - browseBtn = null; - } - - - if(tamBtn != null){ - tamBtn.removeListener(SWT.MouseUp, tamBtn.getListeners(SWT.MouseUp)[0]); - tamBtn.dispose(); - tamBtn = null; - } - */ - if(bufruaBtn != null){ - bufruaBtn.removeListener(SWT.MouseUp, bufruaBtn.getListeners(SWT.MouseUp)[0]); - bufruaBtn.dispose(); - bufruaBtn = null; - } - if(uairBtn != null){ - uairBtn.removeListener(SWT.MouseUp, uairBtn.getListeners(SWT.MouseUp)[0]); - uairBtn.dispose(); - uairBtn = null; - } - if(btnGp!= null){ - btnGp.dispose(); - btnGp = null; - } - /*if(newTabBtn != null){ - newTabBtn.removeListener(SWT.MouseUp, newTabBtn.getListeners(SWT.MouseUp)[0]); - newTabBtn.dispose(); - newTabBtn = null; - }*/ - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.cleanSndTypeList(); - if(topGp!= null){ - topGp.dispose(); - topGp = null; - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/PfcSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/PfcSoundingDialogContents.java deleted file mode 100644 index 4095dcdaa5..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/menu/PfcSoundingDialogContents.java +++ /dev/null @@ -1,437 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.menu.PfcSoundingDialogContents - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 01/2011	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.menu; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfo; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingStnInfoCollection; -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingTimeLines; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; - -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.TimeZone; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; - -public class PfcSoundingDialogContents { - private Composite parent; - private org.eclipse.swt.widgets.List availablefileList, sndTimeList; - private Group topGp, fileTypeGp, bottomGp, availableFileGp, sndTimeListGp; - private Button namBtn, gfsBtn, timeBtn; - private boolean timeLimit = false; - private List selectedFileList = new ArrayList(); - private List queriedTimeList = new ArrayList(); - private List stnPoints = new ArrayList(); - private NcSoundingProfile.PfcSndType currentSndType = NcSoundingProfile.PfcSndType.NONE; - private NsharpLoadDialog ldDia; - private Font newFont; - public NcSoundingProfile.PfcSndType getCurrentSndType() { - return currentSndType; - } - public PfcSoundingDialogContents() { - } - public PfcSoundingDialogContents (Composite parent) { - this.parent = parent; - ldDia = NsharpLoadDialog.getAccess(); - newFont = ldDia.getNewFont(); - } - private void createPFCAvailableFileList() { - sndTimeList.removeAll();; - availablefileList.removeAll(); - //query using NcSoundingQuery class to query - NcSoundingTimeLines timeLines = NcSoundingQuery.soundingTimeLineQuery(currentSndType.toString()); - if(timeLines!= null && timeLines.getTimeLines() != null){ - ldDia.startWaitCursor(); - for(Object timeLine : timeLines.getTimeLines()){ - Timestamp reftime = (Timestamp)timeLine; - if(reftime != null){ - //need to format reftime to GMT time string. Timestamp.toString produce a local time Not GMT time - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(reftime.getTime()); - String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH", cal); - //System.out.println("GMT time " + gmtTimeStr); - availablefileList.add(gmtTimeStr); - - } - - } - ldDia.stopWaitCursor(); - } - else - System.out.println("SQL: query return null"); - } - private void createPFCSndTimeList(List selectedFlLst) { - if(selectedFlLst.size() <=0 ) - return; - //currentDBTblName = MODELSOUNDING_TBL_NAME; - sndTimeList.removeAll(); - //query using NcSoundingQuery to query - ldDia.startWaitCursor(); - String sndStr = currentSndType.toString(); - int endIndex= Math.min(3, sndStr.length()); - String dispSndStr = sndStr.substring(0, endIndex); - for(int i=0; i< selectedFlLst.size(); i++){ - String fl = selectedFlLst.get(i); - long reftimeMs= NcSoundingQuery.convertRefTimeStr(fl); - //System.out.println("reftime="+fl + " in ms="+reftimeMs); - NcSoundingTimeLines timeLines = NcSoundingQuery.soundingRangeTimeLineQuery(sndStr, fl); - if(timeLines != null && timeLines.getTimeLines().length >0) { - for(Object obj : timeLines.getTimeLines()){ - Timestamp rangestart = (Timestamp)obj; - - //need to format rangestart to GMT time string. Timestamp.toString produce a local time Not GMT time - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.setTimeInMillis(rangestart.getTime()); - long vHour = (cal.getTimeInMillis()- reftimeMs)/3600000; - //String sndType = currentSndType.toString().substring(0, 3); //use max of 3 char for sounding type - //String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); - String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tH%1$tMV%2$03d %3$s", cal, vHour,dispSndStr); - //gmtTimeStr = gmtTimeStr+ String.format("V%03d", vHour); - if(sndTimeList.indexOf(gmtTimeStr) != -1){ - // this indicate that gmtTimeStr is already in the sndTimeList, then we dont need to add it to list again. - continue; - } - - //System.out.println("GMT time " + gmtTimeStr); - if(!timeLimit) - sndTimeList.add(gmtTimeStr); - else { - int hour = cal.get(Calendar.HOUR_OF_DAY); - if((hour == 0) || (hour == 12)) - sndTimeList.add(gmtTimeStr); - } - - } - } - } - ldDia.stopWaitCursor(); - } - public void createPfcDialogContents(){ - selectedFileList.clear(); - topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - topGp.setLayout( new GridLayout( 2, false ) ); - - //ldDia.setShellSize(false); - ldDia.createSndTypeList(topGp); - - fileTypeGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); - fileTypeGp.setText("File Type"); - fileTypeGp.setFont(newFont); - namBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - namBtn.setText("NAMSND"); - namBtn.setEnabled( true ); - namBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, fileTypeGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - namBtn.setFont(newFont); - namBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.NAMSND; - createPFCAvailableFileList(); - } - } ); - gfsBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - gfsBtn.setText("GFSSND"); - gfsBtn.setEnabled( true ); - gfsBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, namBtn.getBounds().y + namBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - gfsBtn.setFont(newFont); - gfsBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.GFSSND; - createPFCAvailableFileList(); - } - } ); - /* - ruc2Btn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - ruc2Btn.setText("RUC2SND"); - ruc2Btn.setEnabled( false ); - ruc2Btn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, gfsBtn.getBounds().y + gfsBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - ruc2Btn.setFont(newFont); - ruc2Btn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.RUC2SND; - createPFCAvailableFileList(); - } - } ); - rucpBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - rucpBtn.setText("RUCPTYPSND"); - rucpBtn.setEnabled( false ); - rucpBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, ruc2Btn.getBounds().y + ruc2Btn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - rucpBtn.setFont(newFont); - rucpBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.RUCPTYPSND; - createPFCAvailableFileList(); - } - } ); - browseBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - browseBtn.setText("BROWSE"); - browseBtn.setEnabled( false ); - browseBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, rucpBtn.getBounds().y + rucpBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - browseBtn.setFont(newFont); - browseBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.BROWSE; - } - } ); */ - - - timeBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - timeBtn.setText("00Z and 12Z only"); - timeBtn.setEnabled( true ); - //timeBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - timeBtn.setFont(newFont); - timeBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(timeLimit) - timeLimit = false; - else - timeLimit = true; - - //refresh sounding list if file type is selected already - if(!currentSndType.equals("NA") && selectedFileList.size() > 0 ){ - createPFCSndTimeList(selectedFileList); - } - - } - } ); - - bottomGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - bottomGp.setLayout( new GridLayout( 2, false ) ); - - availableFileGp = new Group(bottomGp,SWT.SHADOW_ETCHED_IN); - availableFileGp.setText("Available PFC files:"); - availableFileGp.setFont(newFont); - availablefileList = new org.eclipse.swt.widgets.List(availableFileGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - availablefileList.setBounds(availableFileGp.getBounds().x, availableFileGp.getBounds().y + NsharpConstants.labelGap , NsharpConstants.filelistWidth, NsharpConstants.listHeight *36/5); - //create a selection listener to handle user's selection on list - availablefileList.setFont(newFont); - availablefileList.addListener ( SWT.Selection, new Listener () { - private String selectedFile=null; - - public void handleEvent (Event e) { - if (availablefileList.getSelectionCount() > 0 ) { - selectedFileList.clear(); - for(int i=0; i < availablefileList.getSelectionCount(); i++) { - selectedFile = availablefileList.getSelection()[i]; - //System.out.println("selected sounding file is " + selectedFile); - selectedFileList.add(selectedFile); - } - createPFCSndTimeList(selectedFileList); - } - } - } ); - - //create Sounding Times widget list - sndTimeListGp = new Group(bottomGp,SWT.SHADOW_ETCHED_IN); - sndTimeListGp.setText("Sounding Times:"); - sndTimeListGp.setFont(newFont); - sndTimeList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - sndTimeList.removeAll(); - sndTimeList.setFont(newFont); - sndTimeList.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight*36/5 ); - sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - //.clear(); - ldDia.startWaitCursor(); - queriedTimeList.clear(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - int endIndex = selectedSndTime.indexOf(" "); - selectedSndTime = selectedSndTime.substring(0, endIndex); - //System.out.println("selected sounding time is " + selectedSndTime); - //refTimeStr is same as "PFC file" name in Load dialog display - String refTimeStr=NcSoundingQuery.convertSoundTimeDispStringToRefTime(selectedSndTime); - //while rangeStartStr is same as "sounding Times - String rangeStartStr = NcSoundingQuery.convertSoundTimeDispStringToRangeStartTimeFormat(selectedSndTime); - if(queriedTimeList.contains(refTimeStr)== true){ - addStnPtWithoutQuery(refTimeStr,rangeStartStr,selectedSndTime); - } - else { - queriedTimeList.add(refTimeStr); - queryAndMarkStn(refTimeStr,rangeStartStr,selectedSndTime); - } - } - - ldDia.stopWaitCursor(); - - nsharpMapResource.setPoints(stnPoints); - NsharpMapResource.bringMapEditorToTop(); - } - } - }); - /* - newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; - else - newtab = false; - - } - } );*/ - } - - private void addStnPtWithoutQuery(String refTimeStr,String rangeStartStr, String selectedSndTime) { - long reftimeMs= NcSoundingQuery.convertRefTimeStr(refTimeStr); - Timestamp refTime = new Timestamp(reftimeMs); - for(NsharpStationInfo stn: stnPoints){ - if(refTime.equals(stn.getReftime())== true){ - long rangetimeMs= NcSoundingQuery.convertRefTimeStr(rangeStartStr); - Timestamp rangeStartTime = new Timestamp(rangetimeMs); - NsharpStationInfo.timeLineSpecific timeLinsSpc = stn.new timeLineSpecific(); - String sndTypeStr = currentSndType.toString(); - int endIndex= Math.min(4, sndTypeStr.length()); - String dispInfo = stn.getStnId()+ " " + selectedSndTime+" "+sndTypeStr.substring(0,endIndex); - timeLinsSpc.setDisplayInfo(dispInfo); - timeLinsSpc.setTiemLine(rangeStartTime); - stn.addToTimeLineSpList(timeLinsSpc); - } - } - //System.out.println("addStnPtWithoutQuery stn num ="+ stnPoints.size()+ " for pfc refTime(file) "+refTimeStr); - } - private void queryAndMarkStn(String refTimeStr,String rangeStartStr, String selectedSndTime) { - //use NcSoundingQuery to query stn info - String sndTypeStr = currentSndType.toString(); - NcSoundingStnInfoCollection sndStnInfoCol = NcSoundingQuery.soundingStnInfoQuery(sndTypeStr,rangeStartStr, refTimeStr); - if(sndStnInfoCol != null && sndStnInfoCol.getStationInfo() != null){ - - NcSoundingStnInfo[] stnInfoAry = sndStnInfoCol.getStationInfo(); - //System.out.println("queryAndMarkStn stn num ="+ stnInfoAry.length+ " for pfc refTime(file) "+refTimeStr); - for(int i=0; i < stnInfoAry.length; i++){ - NcSoundingStnInfo stnInfo = stnInfoAry[i]; - NsharpStationInfo stn = new NsharpStationInfo(); - NsharpStationInfo.timeLineSpecific timeLinsSpc = stn.new timeLineSpecific(); - - int endIndex= Math.min(4, sndTypeStr.length()); - String dispInfo = stnInfo.getStnId() + " " + selectedSndTime+" "+sndTypeStr.substring(0,endIndex); - timeLinsSpc.setDisplayInfo(dispInfo); - timeLinsSpc.setTiemLine(stnInfo.getRangeStartTime()); - stn.addToTimeLineSpList(timeLinsSpc); - stn.setLongitude(stnInfo.getStationLongitude()); - stn.setLatitude(stnInfo.getStationLatitude()); - stn.setReftime(stnInfo.getSynopTime()); - stn.setStnId(stnInfo.getStnId()); - stn.setSndType(sndTypeStr); - //if(i <10) - // System.out.println( "disP="+dispInfo+" refT= "+stnInfo.getSynopTime()+ " rangSt="+stnInfo.getRangeStartTime()); - stnPoints.add(stn); - ; - } - - - } - } - public void cleanup(){ - if(namBtn != null&& namBtn.isDisposed()== false){ - namBtn.removeListener(SWT.MouseUp, namBtn.getListeners(SWT.MouseUp)[0]); - namBtn.dispose(); - namBtn = null; - } - if(gfsBtn != null){ - gfsBtn.removeListener(SWT.MouseUp, gfsBtn.getListeners(SWT.MouseUp)[0]); - gfsBtn.dispose(); - gfsBtn = null; - } - /*if(ruc2Btn != null){ - ruc2Btn.removeListener(SWT.MouseUp, ruc2Btn.getListeners(SWT.MouseUp)[0]); - ruc2Btn.dispose(); - ruc2Btn = null; - } - if(rucpBtn != null){ - rucpBtn.removeListener(SWT.MouseUp, rucpBtn.getListeners(SWT.MouseUp)[0]); - rucpBtn.dispose(); - rucpBtn = null; - } - if(browseBtn != null){ - browseBtn.removeListener(SWT.MouseUp, browseBtn.getListeners(SWT.MouseUp)[0]); - browseBtn.dispose(); - browseBtn = null; - - } */ - NsharpLoadDialog ldDia = NsharpLoadDialog.getAccess(); - ldDia.cleanSndTypeList(); - if(topGp!= null){ - topGp.dispose(); - topGp = null; - } - - if(timeBtn != null){ - timeBtn.removeListener(SWT.MouseUp, timeBtn.getListeners(SWT.MouseUp)[0]); - timeBtn.dispose(); - timeBtn = null; - } - - if(fileTypeGp!= null){ - fileTypeGp.dispose(); - fileTypeGp = null; - } - - if(availablefileList!= null){ - availablefileList.removeListener(SWT.Selection, availablefileList.getListeners(SWT.Selection)[0]); - availablefileList.dispose(); - availablefileList = null; - } - - - if(availableFileGp!= null){ - availableFileGp.dispose(); - availableFileGp = null; - } - if(sndTimeList!= null){ - sndTimeList.removeListener(SWT.Selection, sndTimeList.getListeners(SWT.Selection)[0]); - sndTimeList.dispose(); - sndTimeList = null; - } - if(sndTimeListGp!= null){ - sndTimeListGp.dispose(); - sndTimeListGp = null; - } - if(bottomGp!= null){ - bottomGp.dispose(); - bottomGp = null; - } - /*if(newTabBtn != null){ - newTabBtn.removeListener(SWT.MouseUp, newTabBtn.getListeners(SWT.MouseUp)[0]); - newTabBtn.dispose(); - newTabBtn = null; - }*/ - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNative.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNative.java index 9d2dfdd7e5..97d5f921df 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNative.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNative.java @@ -21,7 +21,8 @@ */ package gov.noaa.nws.ncep.ui.nsharp.natives; import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; - +import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; +import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; import java.nio.ByteBuffer; import java.util.List; @@ -53,7 +54,30 @@ public class NsharpNative { nsharpLib.initStaticGlobalsMem(); } - + public void setSarsSupcellFileName(){ + NsharpConfigManager configMgr = NsharpConfigManager.getInstance(); + String sarsFilePath = configMgr.getBigNsharpFlPath(NcPathConstants.NSHARP_NLIST_FILE); + ByteBuffer sarsBuf=null; + if(sarsFilePath!=null){ + sarsBuf = ByteBuffer.allocate(sarsFilePath.length()); + sarsBuf.put(sarsFilePath.getBytes()); + } + String supercellFilePath = configMgr.getBigNsharpFlPath(NcPathConstants.NSHARP_SUP_FILE); + + ByteBuffer supBuf=null; + if(supercellFilePath!=null){ + supBuf = ByteBuffer.allocate(supercellFilePath.length()); + supBuf.put(supercellFilePath.getBytes()); + } + int sarslm=sarsBuf.limit(); + int suplm=supBuf.limit(); + //System.out.println("Nsharp setSarsSupcellFileName: sarFilepath="+sarsFilePath+ " supFilepath="+ supercellFilePath); + //Chin: for unknown reason calling setSarsSupcellFileName() without passing ByteBuffer limit will cause one extra bytes + // set at end of file name. Therefore, passing buffer size limit specifically to fix this issue. + if(sarsBuf!=null&& supBuf!=null){ + nsharpLib.setSarsSupcellFileName(sarsBuf,sarslm,supBuf,suplm);//(sarsFilePathAry,supercellFilePathAry); + } + } public void populateSndgData(List soundingLys) { if((soundingLys != null) && (soundingLys.size() > 0)){ @@ -233,9 +257,225 @@ public class NsharpNative { } } + public static class SarsInfoStr extends Structure { + public static int SARS_STRING_LEN=40; + public static int SARS_STRING_LINES = 12; + /// max=10 + public int numHailstr; + /// C type : char[10][60] + public byte[] hailStr = new byte[SARS_STRING_LINES * SARS_STRING_LEN]; + /// C type : int[10] + public int[] hailStrColor = new int[(SARS_STRING_LINES)]; + /// C type : char[2][60] + //public byte[] sighailStr = new byte[2 * 60]; + //public int sighailStrColor; + /// max=10 + public int numsupcellstr; + /// C type : char[10][60] + public byte[] supcellStr = new byte[SARS_STRING_LINES * SARS_STRING_LEN]; + /// C type : int[10] + public int[] supcellStrColor = new int[(SARS_STRING_LINES)]; + /// C type : char[2][60] + //public byte[] torStr = new byte[2 * 60]; + //public int torStrColor; + public SarsInfoStr() { + super(); + } + protected ByReference newByReference() { return new ByReference(); } + protected ByValue newByValue() { return new ByValue(); } + protected SarsInfoStr newInstance() { return new SarsInfoStr(); } + public static class ByReference extends SarsInfoStr implements Structure.ByReference { + + } + public static class ByValue extends SarsInfoStr implements Structure.ByValue { + + } + public int getNumHailstr() { + return numHailstr; + } + public byte[] getHailStr() { + return hailStr; + } + public int[] getHailStrColor() { + return hailStrColor; + } + /*public byte[] getSighailStr() { + return sighailStr; + } + public int getSighailStrColor() { + return sighailStrColor; + }*/ + public int getNumsupcellstr() { + return numsupcellstr; + } + public byte[] getSupcellStr() { + return supcellStr; + } + public int[] getSupcellStrColor() { + return supcellStrColor; + } + /*public byte[] getTorStr() { + return torStr; + } + public int getTorStrColor() { + return torStrColor; + }*/ + + } + public static class FireInfoStr extends Structure { + public int sfcRhColor=31; + public int pwColor=31; + public int blMaxColor=31; + public int fosbergColor=31; + public byte[] sfcRh = new byte[(60)]; + public byte[] sfc = new byte[(60)]; + public byte[] zeroOneKmRh = new byte[(60)]; + public byte[] zeroOneKmMean = new byte[(60)]; + public byte[] blMeanRh = new byte[(60)]; + public byte[] blMean = new byte[(60)]; + public byte[] pw = new byte[(60)]; + public byte[] blMax = new byte[(60)]; + public byte[] fosberg = new byte[(60)]; + public FireInfoStr() { + super(); + // TODO Auto-generated constructor stub + } + public static class ByReference extends FireInfoStr implements Structure.ByReference { + + } + public static class ByValue extends FireInfoStr implements Structure.ByValue { + + } + protected ByReference newByReference() { return new ByReference(); } + protected ByValue newByValue() { return new ByValue(); } + public int getSfcRhColor() { + return sfcRhColor; + } + public int getPwColor() { + return pwColor; + } + public int getBlMaxColor() { + return blMaxColor; + } + public int getFosbergColor() { + return fosbergColor; + } + public byte[] getSfcRh() { + return sfcRh; + } + public byte[] getSfc() { + return sfc; + } + public byte[] getZeroOneKmRh() { + return zeroOneKmRh; + } + public byte[] getZeroOneKmMean() { + return zeroOneKmMean; + } + public byte[] getBlMeanRh() { + return blMeanRh; + } + public byte[] getBlMean() { + return blMean; + } + public byte[] getPw() { + return pw; + } + public byte[] getBlMax() { + return blMax; + } + public byte[] getFosberg() { + return fosberg; + } + + } + public static class WinterInfoStr extends Structure { + public float mopw; + /*public float htop; + public float hbot; + public float mrh; + public float mq; + public float mo; + public float pw; + public float pLevel;*/ + public byte[] oprh = new byte[(60)]; + public byte[] layerDepth = new byte[(60)]; + public byte[] meanLayerRh = new byte[(60)]; + public byte[] meanLayerMixRat = new byte[(60)]; + public byte[] meanLayerPw = new byte[(60)]; + public byte[] meanLayerOmega = new byte[(60)]; + public byte[] initPhase = new byte[(100)]; + public byte[] tempProfile1 = new byte[(60)]; + public byte[] tempProfile2 = new byte[(60)]; + public byte[] tempProfile3 = new byte[(60)]; + public byte[] wetbulbProfile1 = new byte[(60)]; + public byte[] wetbulbProfile2 = new byte[(60)]; + public byte[] wetbulbProfile3 = new byte[(60)]; + public byte[] bestGuess1 = new byte[(60)]; + public byte[] bestGuess2 = new byte[(60)]; + public WinterInfoStr() { + super(); + // TODO Auto-generated constructor stub + } + public static class ByReference extends WinterInfoStr implements Structure.ByReference { + } + public static class ByValue extends WinterInfoStr implements Structure.ByValue { + } + protected ByReference newByReference() { return new ByReference(); } + protected ByValue newByValue() { return new ByValue(); } + public float getMopw() { + return mopw; + } + + public byte[] getOprh() { + return oprh; + } + public byte[] getLayerDepth() { + return layerDepth; + } + public byte[] getMeanLayerRh() { + return meanLayerRh; + } + public byte[] getMeanLayerMixRat() { + return meanLayerMixRat; + } + public byte[] getMeanLayerPw() { + return meanLayerPw; + } + public byte[] getMeanLayerOmega() { + return meanLayerOmega; + } + public byte[] getInitPhase() { + return initPhase; + } + public byte[] getTempProfile1() { + return tempProfile1; + } + public byte[] getTempProfile2() { + return tempProfile2; + } + public byte[] getTempProfile3() { + return tempProfile3; + } + public byte[] getWetbulbProfile1() { + return wetbulbProfile1; + } + public byte[] getWetbulbProfile2() { + return wetbulbProfile2; + } + public byte[] getWetbulbProfile3() { + return wetbulbProfile3; + } + public byte[] getBestGuess1() { + return bestGuess1; + } + public byte[] getBestGuess2() { + return bestGuess2; + } + } public static int MAX_CLOUD_LAYER=20; //cloudTypeFM value defined in caveNsharp.c OVC=1, BKN=2, SCT=3*/ public static String[] CLOUD_TYPE = {"dummy","OVC", "BKN", "SCT"}; @@ -353,6 +593,10 @@ public class NsharpNative { //From our own caveNsharp.c float aglT(int l1high, int l2high); void initStaticGlobalsMem(); + //void setSarsSupcellFileName(char sarsFlName[], char supercellFlName[]); + //@java.lang.Deprecated + //void setSarsSupcellFileName(Pointer sarsFlName, Pointer supercellFlName); + void setSarsSupcellFileName(ByteBuffer sarsFlName, int sarsLen,ByteBuffer supercellFlName, int supLen); void populateSndgData(NsharpLibrary.CaveSndgParms snDataArray[], int arraySize, int datatype); int populateSndgDataStatic(CaveSndgParms snDataArray[], int arraySize, int datatype); void get_lpvaluesData(NsharpLibrary._lplvalues pParcel); @@ -364,6 +608,9 @@ public class NsharpNative { void set_storm(float speed, float direction); void cave_visual1 ( float lower, float upper, float pres, float temp, float dwpt , NsharpLibrary.StormSlinkyStr stmSlinky); void draw_Clouds( NsharpLibrary.CloudInfoStr cloudInfo ); + void getWinterInfo(NsharpLibrary.WinterInfoStr winterInfo ); + void getFireInfo(NsharpLibrary.FireInfoStr fireInfo); + void getSarsInfo(NsharpLibrary.SarsInfoStr sarsInfo); //float cave_bulk_rich ( float lplpres, float bplus,FloatByReference brnshear ); float cave_bulk_rich2 ( FloatByReference brnshear ); float cave_ship(); @@ -765,6 +1012,7 @@ public class NsharpNative { float coniglio1(); float scp(float stdir, float stspd); float sigtorn_cin(float stdir, float stspd); + float sigtorn(float stdir, float stspd); float sigtorn_fixed(float stdir, float stspd); float sigtorn_test(float stdir, float stspd); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNativeConstants.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNativeConstants.java index ada031c27d..56bd0de2af 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNativeConstants.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/natives/NsharpNativeConstants.java @@ -386,8 +386,8 @@ public static final String OPC_MIXINGPRESSURE_MISSING = "Mixing Pressure }; public static final String TEMP_TRACE = "Temperature Trace"; public static final String DEWP_TRACE = "Dewpoint Trace"; - public static final String PARCEL_TRACE= "Parcel Trace"; - public static final String PARCEL_TRACE_ASCENT= "Parcel Ascent Trace"; + public static final String PARCEL_VT_TRACE= "Parcel Tv Trace"; + public static final String PARCEL_T_TRACE= "Parcel Trace"; public static final String DCAPE_TRACE = "DCAPE Trace"; public static final String VTEMP_TRACE = "Virtual Temperature Trace"; public static final String WETBULB_TRACE= "WetbulbTrace"; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpBoundaryMotionDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpBoundaryMotionDialog.java deleted file mode 100644 index 988aa1ca06..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpBoundaryMotionDialog.java +++ /dev/null @@ -1,45 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; - -public class NsharpBoundaryMotionDialog extends Dialog { - private static NsharpBoundaryMotionDialog thisDialog = null; - public static NsharpBoundaryMotionDialog getAccess() { - return thisDialog; - } - protected NsharpBoundaryMotionDialog(Shell parentShell) { - super(parentShell); - thisDialog = this; - } - @Override - protected Control createDialogArea(Composite parent) { - Composite top; - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(2, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - //createDialogContents(top); - - return top; - } - @Override - public boolean close() { - // TODO Auto-generated method stub - return super.close(); - } - @Override - public int open() { - // TODO Auto-generated method stub - return super.open(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpConfigDialog.java deleted file mode 100644 index d4f34c2e30..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpConfigDialog.java +++ /dev/null @@ -1,229 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/21/2012	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - - -import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.window.IShellProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; - -import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; - - -public class NsharpConfigDialog extends Dialog { - private Button parameterBtn, dataDisplayBtn, timeLineBtn, stnBtn, paneCfgBtn; - private static NsharpConfigDialog thisDialog=null; - private static NsharpParametersSelectionConfigDialog parameterSelDialog = null; - private static NsharpDataDisplayConfigDialog dataDislpayDialog = null; - private static NsharpTimeLineConfigDialog timelineDialog = null; - private static NsharpStnConfigDialog stnDialog = null; - private static NsharpPaneConfigDialog paneCfgDialog = null; - public NsharpConfigDialog(Shell parentShell) { - super(parentShell); - // TODO Auto-generated constructor stub - } - - public NsharpConfigDialog(IShellProvider parentShell) { - super(parentShell); - // TODO Auto-generated constructor stub - } - public static NsharpConfigDialog getInstance( Shell parShell){ - - if ( thisDialog == null ){ - thisDialog = new NsharpConfigDialog( parShell ); - } - - return thisDialog; - - } - - public void createDialogContents(Composite parent){ - parameterBtn = new Button(parent, SWT.PUSH); - parameterBtn.setText("Parameters Selection"); - parameterBtn.setEnabled( true ); - //graphBtn.setSize(btnWidth,pushbtnHeight); - parameterBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - parameterSelDialog = NsharpParametersSelectionConfigDialog.getInstance(shell); - if ( parameterSelDialog != null ) { - timeLineBtn.setEnabled( false ); - dataDisplayBtn.setEnabled(false); - stnBtn.setEnabled( false ); - paneCfgBtn.setEnabled( false ); - parameterSelDialog.open(); - dataDisplayBtn.setEnabled(true); - timeLineBtn.setEnabled( true ); - stnBtn.setEnabled( true ); - paneCfgBtn.setEnabled( true ); - } - } - } ); - dataDisplayBtn = new Button(parent, SWT.PUSH); - dataDisplayBtn.setText("Data Display Configuration"); - dataDisplayBtn.setEnabled( true ); - //lineBtn.setSize(btnWidth,pushbtnHeight); - dataDisplayBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - dataDislpayDialog = NsharpDataDisplayConfigDialog.getInstance(shell); - if ( dataDislpayDialog != null ) { - timeLineBtn.setEnabled( false ); - parameterBtn.setEnabled(false); - stnBtn.setEnabled( false ); - paneCfgBtn.setEnabled( false ); - dataDislpayDialog.open(); - parameterBtn.setEnabled(true); - timeLineBtn.setEnabled( true ); - stnBtn.setEnabled( true ); - paneCfgBtn.setEnabled( true ); - } - } - } ); - timeLineBtn = new Button(parent, SWT.PUSH); - timeLineBtn.setText("Time Line Activation"); - timeLineBtn.setEnabled( true ); - //lineBtn.setSize(btnWidth,pushbtnHeight); - timeLineBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - timelineDialog = NsharpTimeLineConfigDialog.getInstance(shell); - if ( timelineDialog != null ) { - dataDisplayBtn.setEnabled(false); - parameterBtn.setEnabled(false); - stnBtn.setEnabled( false ); - paneCfgBtn.setEnabled( false ); - timelineDialog.open(); - parameterBtn.setEnabled(true); - dataDisplayBtn.setEnabled(true); - stnBtn.setEnabled( true ); - paneCfgBtn.setEnabled( true ); - } - } - } ); - stnBtn = new Button(parent, SWT.PUSH); - stnBtn.setText("Station Activation"); - stnBtn.setEnabled( true ); - //lineBtn.setSize(btnWidth,pushbtnHeight); - stnBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - stnDialog = NsharpStnConfigDialog.getInstance(shell); - if ( stnDialog != null ) { - dataDisplayBtn.setEnabled(false); - parameterBtn.setEnabled(false); - timeLineBtn.setEnabled( false ); - paneCfgBtn.setEnabled( false ); - stnDialog.open(); - parameterBtn.setEnabled(true); - dataDisplayBtn.setEnabled(true); - timeLineBtn.setEnabled( true ); - paneCfgBtn.setEnabled( true ); - } - } - } ); - - paneCfgBtn = new Button(parent, SWT.PUSH); - paneCfgBtn.setText("Diaplay Pane Configuration"); - if( VizPerspectiveListener.getCurrentPerspectiveManager()!= null){ - //System.out.println("changeFrame: current perspective ="+VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId()); - if(VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId().equals(NmapCommon.NatlCntrsPerspectiveID)) - paneCfgBtn.setEnabled( true ); - else - paneCfgBtn.setEnabled( false ); - } - //lineBtn.setSize(btnWidth,pushbtnHeight); - paneCfgBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - paneCfgDialog = NsharpPaneConfigDialog.getInstance(shell); - if ( paneCfgDialog != null ) { - dataDisplayBtn.setEnabled(false); - parameterBtn.setEnabled(false); - timeLineBtn.setEnabled( false ); - stnBtn.setEnabled( false ); - paneCfgDialog.open(); - parameterBtn.setEnabled(true); - dataDisplayBtn.setEnabled(true); - timeLineBtn.setEnabled( true ); - stnBtn.setEnabled( true ); - - } - } - } ); - } - @Override - public Control createDialogArea(Composite parent) { - Composite top; - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, true); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDialogContents(top); - - return top; - } - - @Override - public void createButtonsForButtonBar(Composite parent) { - Button closeBtn = createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, - true); - closeBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("OK listener is called"); - //NsharpSkewTResource skewtRsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - close(); - } - } ); - - } - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Nsharp Configuration" ); - shell.setSize(250, 300); - } - @Override - public int open( ) { - if ( this.getShell() == null ){ - this.create(); - } - this.getShell().setLocation(this.getShell().getParent().getLocation().x+1100, - this.getShell().getParent().getLocation().y+200); - return super.open(); - - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpDataDisplayConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpDataDisplayConfigDialog.java deleted file mode 100644 index 6c0d6a5243..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpDataDisplayConfigDialog.java +++ /dev/null @@ -1,585 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpDataDisplayConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/21/2012	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.viz.common.ui.color.ColorMatrixSelector; - -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.Map; - - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; - -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpDataDisplayConfigDialog extends Dialog { - private Map styleMap = new EnumMap(LineStyle.class); - private LineStyle curLineStyle=LineStyle.SOLID; - private int curLineWidth=1; - private RGB curLineColor=null; - private NsharpLineProperty curLineProperty; - private static NsharpDataDisplayConfigDialog instance=null; - private ArrayList availLine = new ArrayList(); - private Combo selLineCombo; - private String seldLineName= ""; - private NsharpConfigStore configStore=null; - private Canvas currentLineAreaCanvas; - private Canvas linePreviewAreaCanvas; - private ColorMatrixSelector cms; - public static NsharpConfigStore setDefaultLineConfig(NsharpConfigStore cs){ - HashMap linePropertyMap = cs.getLinePropertyMap(); - int i =0; - for(String lnName: NsharpConstants.lineNameArray){ - NsharpLineProperty lp = NsharpConstants.defaultLineProperty[i]; - linePropertyMap.put(lnName, lp); - i++; - } - return cs; - } - - public static NsharpDataDisplayConfigDialog getInstance(Shell parentShell) { - if(instance == null) - instance = new NsharpDataDisplayConfigDialog(parentShell); - return instance; - } - - public NsharpDataDisplayConfigDialog(Shell parentShell) { - super(parentShell); - styleMap.put(LineStyle.SOLID, new int[] { 4 }); // GEMPAK line type 1 - styleMap.put(LineStyle.SHORT_DASHED, new int[] { 4, 4 }); // GEMPAK line type 2 - styleMap.put(LineStyle.MEDIUM_DASHED, new int[] { 8, 8 }); // GEMPAK line type 3 - styleMap.put(LineStyle.LONG_DASH_SHORT_DASH, new int[] { 16, 8, 4, 8 }); // GEMPAK line type 4 - styleMap.put(LineStyle.LONG_DASHED, new int[] { 16, 8 }); // GEMPAK line type 5 - styleMap.put(LineStyle.LONG_DASH_THREE_SHORT_DASHES, new int[] { 16, 8, 4, 8, 4, 8, 4, 8 }); // GEMPAK line type 6 - styleMap.put(LineStyle.LONG_DASH_DOT, new int[] { 16, 8, 2, 8 }); // GEMPAK line type 7 - styleMap.put(LineStyle.LONG_DASH_THREE_DOTS, new int[] { 16, 8, 2, 8, 2, 8, 2, 8 }); // GEMPAK line type 8 - styleMap.put(LineStyle.MEDIUM_DASH_DOT, new int[] { 8, 8, 2, 8 }); // GEMPAK line type 9 - styleMap.put(LineStyle.DOTS, new int[] { 2, 4 }); // GEMPAK line type 10 - - instance = this; - for(int i=0; i < NsharpConstants.lineNameArray.length; i++) - availLine.add(NsharpConstants.lineNameArray[i]); - - NsharpConfigManager mgr =NsharpConfigManager.getInstance(); - configStore = mgr.retrieveNsharpConfigStoreFromFs(); - /*if (configStore== null) { - configStore = new NsharpConfigStore(); - configStore = setDefaultLineConfig(configStore); - configStore=NsharpParametersSelectionConfigDialog.setDefaultGraphConfig(configStore); - } - else if( configStore.getLinePropertyMap().size() == 0){ - configStore = setDefaultLineConfig(configStore); - }*/ - curLineProperty = configStore.getLinePropertyMap().get(availLine.get(0)); - curLineStyle =curLineProperty.getLineStyle(); - curLineWidth = curLineProperty.getLineWidth(); - curLineColor = curLineProperty.getLineColor(); - //curLineName = availLine.get(0); - } - - - public LineStyle getLineStyle() { - return curLineStyle; - } - - - public int getLineWidth() { - return curLineWidth; - } - - - public RGB getLineColor() { - return curLineColor; - } - - - - - private Composite createDialog(Composite composite) { - final Display display = composite.getDisplay(); - - FormLayout layout0 = new FormLayout(); - composite.setLayout(layout0); - - - // Lay out the various groups within the dialog - - Group linePreviewAreaGroup = new Group ( composite, SWT.SHADOW_NONE ); - linePreviewAreaGroup.setLayout(new FillLayout()); - - FormData formData0 = new FormData(); - formData0.top = new FormAttachment(5,0); - formData0.left = new FormAttachment(2,0); - formData0.width = 196; - formData0.height = 30; - linePreviewAreaGroup.setLayoutData(formData0); - - Group selectLineWidthGroup = new Group ( composite, SWT.SHADOW_NONE ); - selectLineWidthGroup.setText("Width"); - GridLayout lineWidthGridLayout = new GridLayout(); - lineWidthGridLayout.numColumns = 2; - lineWidthGridLayout.marginHeight = 18; - lineWidthGridLayout.marginWidth = 18; - lineWidthGridLayout.horizontalSpacing = 8; - lineWidthGridLayout.verticalSpacing = 8; - selectLineWidthGroup.setLayout(lineWidthGridLayout); - - FormData formData1 = new FormData(); - formData1.top = new FormAttachment(linePreviewAreaGroup, 16); - formData1.left = new FormAttachment(2,0); - selectLineWidthGroup.setLayoutData(formData1); - - Group selectLineStyleGroup = new Group ( composite, SWT.SHADOW_NONE ); - selectLineStyleGroup.setText("Style"); - GridLayout lineStyleGridLayout = new GridLayout(); - lineStyleGridLayout.numColumns = 2; - lineStyleGridLayout.marginHeight = 18; - lineStyleGridLayout.marginWidth = 18; - lineStyleGridLayout.horizontalSpacing = 8; - lineStyleGridLayout.verticalSpacing = 8; - selectLineStyleGroup.setLayout(lineStyleGridLayout); - - FormData formData2 = new FormData(); - formData2.top = new FormAttachment(selectLineWidthGroup, 16); - formData2.left = new FormAttachment(2,0); - selectLineStyleGroup.setLayoutData(formData2); - - Group selectLineColorGroup = new Group ( composite, SWT.SHADOW_NONE ); - selectLineColorGroup.setText("Color"); - - FormData formData5 = new FormData(); - formData5.top = new FormAttachment(5,0); - formData5.left = new FormAttachment(selectLineWidthGroup, 10); - formData5.right = new FormAttachment(98, 0); - formData5.height = 300; - selectLineColorGroup.setLayoutData(formData5); - - - final Color black = composite.getDisplay().getSystemColor(SWT.COLOR_BLACK); - final Color white = composite.getDisplay().getSystemColor(SWT.COLOR_WHITE); - - // Associate with each line style a list of segment lengths (in pixels) - // of the repeating pattern. Numbers are pixels on, pixels off, on, off, ... - // (Derived from similar structure in NMAP NxmLineA.c) - // CAUTION: Duplication (of a sort). This governs only local display of - // line patterns in this dialog (preview and line style selector buttons). - // Actual drawing of lines with these styles is up to the implementation - // of IGraphicsTarget being used. - - - // Line Preview Area - - linePreviewAreaCanvas = new Canvas(linePreviewAreaGroup, SWT.NONE); - - final int previewLineXmin = 16; - final int previewLineXmax = 180; - final int previewLineYctr = 16; - - linePreviewAreaCanvas.addPaintListener(new PaintListener() { - public void paintControl(PaintEvent event) { - GC gc = event.gc; - gc.setLineWidth(curLineWidth); - gc.setForeground(new Color(display, curLineColor)); - linePreviewAreaCanvas.setBackground( - curLineColor.getHSB()[2] > 0.2 ? black : white); - int x1 = previewLineXmin; - int x2 = previewLineXmin; - int [] segLengths = styleMap.get(curLineStyle); - while (x2 < previewLineXmax) - { - boolean draw = true; - for (int i : segLengths) - { - x2 = Math.min(x1 + i, previewLineXmax); - if (draw) - { - gc.drawLine(x1, previewLineYctr, x2, previewLineYctr); - } - if (x2 >= previewLineXmax) - { - break; - } - draw = !draw; - x1 = x2; - } - } - } - }); - - - // Parameters to give a uniform look to all line width/style buttons - - final int lineButtonHeight = 75; - final int lineButtonWidth = 15; - final int buttonLineXmin = 8; - final int buttonLineXmax = 68; - final int buttonLineYctr = 7; - - - // Line Width - - final Button[] selectLineWidthButtons = new Button[4]; - final int[] lineWidthButtonSequence = {0, 2, // ...for 2-column grid layout - 1, 3}; - for (int i : lineWidthButtonSequence) - { - selectLineWidthButtons[i] = new Button(selectLineWidthGroup, SWT.TOGGLE); - GridData gridData = new GridData(); - gridData.heightHint = lineButtonWidth; - gridData.widthHint = lineButtonHeight; - selectLineWidthButtons[i].setLayoutData(gridData); - selectLineWidthButtons[i].setData(i+1); - selectLineWidthButtons[i].setToolTipText("Width " + (i+1)); - selectLineWidthButtons[i].addPaintListener(new PaintListener() { - public void paintControl(PaintEvent event) { - GC gc = event.gc; - int width = (Integer) event.widget.getData(); - gc.setLineWidth(width); - gc.setForeground(black); - gc.drawLine(buttonLineXmin,buttonLineYctr,buttonLineXmax,buttonLineYctr); - } - }); - selectLineWidthButtons[i].addSelectionListener(new SelectionListener() - { - public void widgetSelected(SelectionEvent event) - { - selectLineWidthButtons[curLineWidth-1].setSelection(false); - curLineWidth= (Integer)event.widget.getData(); - linePreviewAreaCanvas.redraw(); - linePreviewAreaCanvas.update(); - } - public void widgetDefaultSelected(SelectionEvent event) - { - } - }); - } - selectLineWidthButtons[curLineWidth-1].setSelection(true); // set initial state - - // Line Style - - final Map lineStyleButtonMap = new EnumMap(LineStyle.class); - - final LineStyle [] lineStyleButtonSequence = { // ...for 2-column grid layout - LineStyle.DOTS, LineStyle.LONG_DASHED, - LineStyle.SOLID, LineStyle.LONG_DASH_THREE_SHORT_DASHES, - LineStyle.SHORT_DASHED, LineStyle.LONG_DASH_DOT, - LineStyle.MEDIUM_DASHED, LineStyle.LONG_DASH_THREE_DOTS, - LineStyle.LONG_DASH_SHORT_DASH, LineStyle.MEDIUM_DASH_DOT, - }; - - for (LineStyle ls : lineStyleButtonSequence) - { - Button lineStyleButton = new Button(selectLineStyleGroup, SWT.TOGGLE); - lineStyleButtonMap.put(ls, lineStyleButton); - GridData gridData = new GridData(); - gridData.heightHint = lineButtonWidth; - gridData.widthHint = lineButtonHeight; - lineStyleButton.setLayoutData(gridData); - lineStyleButton.setData(ls); - lineStyleButton.setToolTipText(ls.name()); - lineStyleButton.addPaintListener(new PaintListener() { - public void paintControl(PaintEvent event) { - GC gc = event.gc; - gc.setLineWidth(1); - gc.setForeground(black); - LineStyle ls = (LineStyle) event.widget.getData(); - int [] segLengths = styleMap.get(ls); - int x1 = buttonLineXmin; - int x2 = buttonLineXmin; - while (x2 < buttonLineXmax) - { - boolean draw = true; - for (int i : segLengths) - { - x2 = Math.min(x1 + i, buttonLineXmax); - if (draw) - { - gc.drawLine(x1, buttonLineYctr, x2, buttonLineYctr); - } - if (x2 >= buttonLineXmax) - { - break; - } - draw = !draw; - x1 = x2; - } - } - } - }); - lineStyleButton.addSelectionListener(new SelectionListener() - { - public void widgetSelected(SelectionEvent event) - { - lineStyleButtonMap.get(curLineStyle).setSelection(false); - curLineStyle=( (LineStyle)event.widget.getData() ); - linePreviewAreaCanvas.redraw(); - linePreviewAreaCanvas.update(); - } - public void widgetDefaultSelected(SelectionEvent event) - { - } - }); - } - lineStyleButtonMap.get( curLineStyle).setSelection(true); // set initial state - - - // Line Color - - cms = new ColorMatrixSelector(selectLineColorGroup, false, false, - 28, 92, 18, 22, 28, 80, 4, 8, 5); - cms.setColorValue(curLineColor); - cms.addListener(new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - curLineColor = cms.getColorValue() ; - linePreviewAreaCanvas.redraw(); - linePreviewAreaCanvas.update(); - } - }); - return composite; - } - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Nsharp Data Display" ); - - } - @Override - public Control createDialogArea(Composite parent) { - Composite top; - top = (Composite) super.createDialogArea(parent); - - GridLayout mainLayout = new GridLayout(1, true); - mainLayout.marginHeight = 1; - mainLayout.marginWidth = 1; - top.setLayout(mainLayout); - - Composite lineComp = new Composite(top, SWT.NONE); - GridLayout gl = new GridLayout(2, false); - gl.horizontalSpacing = 10; - lineComp.setLayout(gl); - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - lineComp.setLayoutData(gd); - - //Label selCmapLbl = new Label( lineComp, SWT.None ); - //selCmapLbl.setText("Nsharp Trace Lines:"); - selLineCombo = new Combo( lineComp, SWT.DROP_DOWN ); - selLineCombo.setItems( availLine.toArray(new String[0] ) ); - selLineCombo.select(0); - - selLineCombo.addSelectionListener( new SelectionAdapter() { - public void widgetSelected(SelectionEvent event) { - String seldLine = selLineCombo.getText(); - if( seldLine.equals( seldLineName ) ) { - return; - } - - seldLineName = seldLine; - curLineProperty = configStore.getLinePropertyMap().get(seldLineName); - if(curLineProperty == null){ - //this only happened when configuration xml does not have this line property - curLineProperty = new NsharpLineProperty(); - configStore.getLinePropertyMap().put(seldLineName, curLineProperty); - } - curLineStyle =curLineProperty.getLineStyle(); - curLineWidth = curLineProperty.getLineWidth(); - curLineColor = curLineProperty.getLineColor(); - //curLineName = seldLineName; - linePreviewAreaCanvas.redraw(); - linePreviewAreaCanvas.update(); - currentLineAreaCanvas.redraw(); - currentLineAreaCanvas.update(); - cms.setColorValue(curLineColor); - } - }); - Composite currentLineComp = new Composite( lineComp, SWT.NONE ); - FormLayout layout0 = new FormLayout(); - currentLineComp.setLayout(layout0); - Group currentLineAreaGroup = new Group ( currentLineComp, SWT.SHADOW_NONE ); - currentLineAreaGroup.setLayout(new FillLayout()); - - FormData formData0 = new FormData(); - formData0.top = new FormAttachment(5,0); - formData0.left = new FormAttachment(2,0); - formData0.width = 130; - formData0.height = 30; - currentLineAreaGroup.setLayoutData(formData0); - currentLineAreaCanvas = new Canvas(currentLineAreaGroup, SWT.NONE); - - final int previewLineXmin = 10;//16; - final int previewLineXmax = 120;//180; - final int previewLineYctr = 16; - final Display display = top.getDisplay(); - final Color black = display.getSystemColor(SWT.COLOR_BLACK); - final Color white = display.getSystemColor(SWT.COLOR_WHITE); - currentLineAreaCanvas.addPaintListener(new PaintListener() { - public void paintControl(PaintEvent event) { - GC gc = event.gc; - gc.setLineWidth(curLineWidth); - gc.setForeground(new Color(display, curLineColor)); - currentLineAreaCanvas.setBackground( - curLineColor.getHSB()[2] > 0.2 ? black : white); - int x1 = previewLineXmin; - int x2 = previewLineXmin; - int [] segLengths = styleMap.get(curLineStyle); - while (x2 < previewLineXmax) - { - boolean draw = true; - for (int i : segLengths) - { - x2 = Math.min(x1 + i, previewLineXmax); - if (draw) - { - gc.drawLine(x1, previewLineYctr, x2, previewLineYctr); - } - if (x2 >= previewLineXmax) - { - break; - } - draw = !draw; - x1 = x2; - } - } - } - }); - - Composite lineEditComp = new Composite( top, SWT.NONE ); - createDialog(lineEditComp); - - //top.pack(); - - return null; - } - @Override - public int open() { - if ( this.getShell() == null ){ - this.create(); - } - - return super.open(); - } - private void notifyEditor(){ - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor().getSkewtResource(); - //rsc.setWindBarbDistance(windBarbDistance); - rsc.setLinePropertyMap(configStore.getLinePropertyMap()); - rsc.createRscPressTempCurveShapeAll(); - rsc.createRscHodoWindShapeAll(); - editor.refresh(); - } - } - @Override - public void createButtonsForButtonBar(Composite parent) { - Button appBtn = createButton(parent, IDialogConstants.INTERNAL_ID, - "Apply", false); - appBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("appBtn listener is called"); - curLineProperty.setLineColor(curLineColor); - curLineProperty.setLineStyle(curLineStyle); - curLineProperty.setLineWidth(curLineWidth); - currentLineAreaCanvas.redraw(); - currentLineAreaCanvas.update(); - //configStore.getLinePropertyMap().put(curLineName, curLineProperty); - notifyEditor(); - } - } ); - Button saveBtn = createButton(parent, IDialogConstants.INTERNAL_ID, - "Save", false); - saveBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("saveBtn listener is called"); - curLineProperty.setLineColor(curLineColor); - curLineProperty.setLineStyle(curLineStyle); - curLineProperty.setLineWidth(curLineWidth); - currentLineAreaCanvas.redraw(); - currentLineAreaCanvas.update(); - //configStore.getLinePropertyMap().put(curLineName, curLineProperty); - notifyEditor(); - NsharpConfigManager mgr =NsharpConfigManager.getInstance(); - /* for testing - NsharpConfigStore st = configStore; - HashMap linePropertyMap = new HashMap(); - for(int i=0; i < NsharpConstants.lineNameArray.length; i++){ - NsharpLineProperty tempLine = new NsharpLineProperty(); - tempLine.setLineWidth(1); - tempLine.setLineStyle(LineStyle.SOLID); - tempLine.setLineColor(new RGB(155,0,220)); - linePropertyMap.put(NsharpConstants.lineNameArray[i], tempLine); - } - st.setLinePropertyMap(linePropertyMap);*/ - try { - mgr.saveConfigStoreToFs(configStore); - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } ); - Button closeBtn = createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, - true); - closeBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - close(); - instance=null; - - } - } ); - - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpEditDataDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpEditDataDialog.java deleted file mode 100644 index 93fb6c7ab4..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpEditDataDialog.java +++ /dev/null @@ -1,492 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpEditDataDialog - * - * This java class performs the NSHARP NsharpLoadDialog functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 04/26/2011	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.palette; - -import java.util.List; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.window.IShellProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PlatformUI; - -public class NsharpEditDataDialog extends Dialog { - //private NcepLogger logger = NcepLoggerManager.getNcepCaveLogger(this.getClass()); - private List curSoundingLayerList; - private Text curTempText, newTempText, curDewText, newDewText, curWSpText, newWSpText, curWDirText, newWDirText, - curPressText, newPressText;//curHeightText, newHeightText; - private static NsharpEditDataDialog thisDialog=null; - private org.eclipse.swt.widgets.List pressureList; - private String tempStr="",dewStr="", wspStr="", wdirStr=""; - private org.eclipse.swt.graphics.Color lightGrey = new org.eclipse.swt.graphics.Color(Display.getDefault(), 211,211,211); - private enum EditType { - SELECTED_LEVEL, NEW_LEVEL - } - private EditType currentEditType; - private int selIndex=-1; - - protected Composite top; - public NsharpEditDataDialog(Shell parentShell) { - super(parentShell); - // TODO Auto-generated constructor stub - } - - public NsharpEditDataDialog(IShellProvider parentShell) { - super(parentShell); - // TODO Auto-generated constructor stub - } - - public static NsharpEditDataDialog getInstance( Shell parShell){ - - if ( thisDialog == null ){ - thisDialog = new NsharpEditDataDialog( parShell ); - //System.out.println("new parcel dialog INSTANCE created"); - - } - else { - //System.out.println("current load dialog INSTANCE returned!"); - } - - return thisDialog; - - } - - private void createDialogContents( Composite parent) { - top = parent;//(Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - - Group topGp = new Group(top,SWT.SHADOW_OUT); - topGp.setLayout( new GridLayout(2, false) ); - - Group pressureListGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); - pressureListGp.setText("Pressure Level:"); - pressureList = new org.eclipse.swt.widgets.List(pressureListGp, SWT.BORDER | SWT.V_SCROLL ); - pressureList.setBounds(pressureListGp.getBounds().x,pressureListGp.getBounds().y+ NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight ); - NsharpSkewTResource rsc=null; - if(NsharpSkewTEditor.getActiveNsharpEditor()!= null) - rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - if (rsc != null && rsc.getSoundingLys() !=null) { - curSoundingLayerList = rsc.getSoundingLys(); - for(NcSoundingLayer layer: curSoundingLayerList){ - pressureList.add(Float.toString(layer.getPressure())); - } - } - //create a selection listener to handle user's selection on list - pressureList.addListener ( SWT.Selection, new Listener () { - public void handleEvent (Event e) { - selIndex = pressureList.getSelectionIndex(); - } - }); - Group buttonGp = new Group(topGp,SWT.SHADOW_OUT); - buttonGp.setLayout( new GridLayout(1, false) ); - buttonGp.setText("Edit Option:"); - Button useSelectedBtn = new Button(buttonGp, SWT.PUSH); - useSelectedBtn.setText(" Edit Selected Level "); - useSelectedBtn.setEnabled( true ); - useSelectedBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentEditType = EditType.SELECTED_LEVEL; - if(selIndex != -1){ - NcSoundingLayer selLevelSounding = curSoundingLayerList.get(selIndex); - curTempText.setText( ""+selLevelSounding.getTemperature()); - curDewText.setText("" + selLevelSounding.getDewpoint()); - curWSpText.setText("" + selLevelSounding.getWindSpeed()); - curWDirText.setText("" + selLevelSounding.getWindDirection()); - curPressText.setText(""+selLevelSounding.getPressure()); - newTempText.setText( ""+selLevelSounding.getTemperature()); - newDewText.setText("" + selLevelSounding.getDewpoint()); - newWSpText.setText("" + selLevelSounding.getWindSpeed()); - newWDirText.setText("" + selLevelSounding.getWindDirection()); - newPressText.setText(""+selLevelSounding.getPressure()); - } - } - } ); - Button addNewLevelBtn = new Button(buttonGp, SWT.PUSH); - addNewLevelBtn.setText(" Add New Level "); - addNewLevelBtn.setEnabled( true ); - addNewLevelBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentEditType = EditType.NEW_LEVEL; - curTempText.setText( " N/A "); - curDewText.setText(" N/A " ); - curWSpText.setText(" N/A " ); - curWDirText.setText(" N/A "); - curPressText.setText(" N/A "); - newTempText.setText( ""); - newDewText.setText("" ); - newWSpText.setText(""); - newWDirText.setText(""); - newPressText.setText(""); - } - } ); - - - Group top_form = new Group(top,SWT.SHADOW_ETCHED_IN); - FormLayout formlayout = new FormLayout() ; - formlayout.marginRight = 20; - formlayout.marginLeft = 20; - top_form.setLayout( formlayout ); - - Listener positiveNumberListeener = new Listener() { - public void handleEvent(Event e) { - String string = e.text; - char [] chars = new char [string.length()]; - string.getChars (0, chars.length, chars, 0); - //to make sure user enter digits only - for (int i=0; i tp) || winDir >= 360.0 ){ - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - - mb.setMessage( "Invalid Data! (Dew Point > Temperature or Wind direction > 360)"); - mb.open(); - } - else { - NsharpSkewTResource skewtRsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - switch(currentEditType) { - case NEW_LEVEL: - skewtRsc.addNewLayer(tp, dp, winSpd, winDir, press); - break; - case SELECTED_LEVEL: - skewtRsc.updateLayer(selIndex,tp, dp, winSpd, winDir, press); - break; - default: - return; - } - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - editor.refresh(); - } - } - } - catch (Exception e) { - //System.out.println("bad input entered " ); - return; - } - } - private boolean verifyNewlevelInput() { - - if((newWDirText.getText().isEmpty()) || curWDirText.getText().isEmpty() - || curWSpText.getText().isEmpty() || curDewText.getText().isEmpty() - || curTempText.getText().isEmpty()){ - return false; - } - return true; - } - @Override - public void createButtonsForButtonBar(Composite parent) { - // create Apply and Close buttons by default - Button okBtn = createButton(parent, IDialogConstants.CLIENT_ID, "Apply", true); - okBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("OK listener is called"); - if(currentEditType == EditType.NEW_LEVEL && verifyNewlevelInput()== false){ - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - MessageBox mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK); - - mb.setMessage( "Missing input data! Should fill up all 5 entries!"); - mb.open(); - return; - } - handleEditing(); - //move close from okPressed() to here - //close(); - } - } ); - - Button canBtn = createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CLOSE_LABEL, false); - canBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //currentParcel = prevParcel ; - } - } ); - } - - - //@Override - //This function name is miss leading.... - //This function is called when CR is preseed, but NOT "ok" button. - //Override this and move close() from here to OK button Listener - //So, we only close when "OK" is pressed, not "CR". - //public void okPressed() { - //System.out.println("CR is pressed"); - // setReturnCode(OK); - //close(); - //} - - @Override - public int open( ) { - //System.out.println("parcel dialog opened"); - if ( this.getShell() == null ){ - this.create(); - } - return super.open(); - - } - - @Override - public boolean close() { - - thisDialog=null; - return super.close(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteAction.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteAction.java deleted file mode 100644 index 62413c2914..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteAction.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaletteAction - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.palette; - - - -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IWorkbenchPage; - -public class NsharpPaletteAction extends AbstractHandler { - - @Override - public Object execute(ExecutionEvent arg0) throws ExecutionException { - - /* - * The viewID string is in the XML file for NSHARP extension point. - */ - - IWorkbenchPage wpage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - - IViewPart vpart = wpage.findView( "gov.noaa.nws.ncep.ui.nsharp" ); - - try { - - if ( vpart == null ){ - - vpart = wpage.showView( "gov.noaa.nws.ncep.ui.nsharp" ); - //Chin MERGE moved this here from the NsharpPaletteWindow so we can open the view without an editor. - if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource(); - nsharpMapResource.setPoints(null); - } - - } - else { - - if ( ! wpage.isPartVisible(vpart) ) vpart = wpage.showView( "gov.noaa.nws.ncep.ui.nsharp" ); - - } - } - catch (Exception e) { - - e.printStackTrace(); - - } - - return null; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteWindow.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteWindow.java deleted file mode 100644 index 3978b2a0a9..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaletteWindow.java +++ /dev/null @@ -1,834 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaletteWindow - * - * This java class performs the NSHARP GUI construction. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/16/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.palette; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpUnloadDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpBackgroundResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -//import org.eclipse.swt.layout.RowData; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IPartListener; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.ViewPart; - -//import com.raytheon.uf.viz.core.drawables.IFont; -import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; -import com.raytheon.uf.viz.core.drawables.ResourcePair; -import com.raytheon.viz.ui.UiUtil; - - -public class NsharpPaletteWindow extends ViewPart implements SelectionListener, -DisposeListener, IPartListener{ - private MessageBox mb ; - protected Button loadBtn, unloadBtn, overlayBtn, interpBtn,dataEditBtn, compareStnBtn,compareTmBtn, graphEditBtn,graphModeBtnSkew, graphModeBtnIcing,graphModeBtnTurb; - private Shell shell; - private boolean overlayIsOn=false, compareStnIsOn=false, compareTmIsOn=false; - protected boolean interpolateIsOn=false, editGraphOn=false; - private static String INTP_OFF = " Interp(off) "; - private static String INTP_ON = " Interp(on) "; - private static String COMP_STN_OFF= "CompStn(off)"; - private static String COMP_STN_ON= "CompStn(on) "; - private static String COMP_TM_OFF= "CompTm(off)"; - private static String COMP_TM_ON= "CompTm(on) "; - private static String OVLY_OFF= "Ovrlay2(off) "; - private static String OVLY_ON= "Ovrlay2(on) "; - protected static String EDIT_GRAPH_OFF= "EditGraph(off)"; - protected static String EDIT_GRAPH_ON= "EditGraph(on) "; - private IWorkbenchPage page; - private NsharpPrintHandle printHandle; - private Font newFont ; - private boolean isEditorVisible=true; - private static NsharpPaletteWindow instance; - private static int currentGraphMode= NsharpConstants.GRAPH_SKEWT; - - public static NsharpPaletteWindow getInstance() { - return instance; - } - public static int getCurrentGraphMode() { - return currentGraphMode; - } - private Color colorGrey = new Color(Display.getDefault(), 211,211,211); - private Color colorButtonOriginalBg; - - public void setAndOpenMb(String msg) { - if (mb != null) { - mb.setMessage(msg); - try { - mb.open(); - }catch (Exception e) { - - //e.printStackTrace(); - } - } - } - public NsharpPaletteWindow() { - super(); - instance = this; - //System.out.println("palette NsharpPaletteWindow constructed!!"); - printHandle = NsharpPrintHandle.getPrintHandle(); - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK ); - mb.setMessage( "Data is not loaded yet!"); - } - - /** - * Invoked by the workbench to initialize this View. - */ - public void init( IViewSite site ) { - //System.out.println("NsharpPaletteWindow inited!!"); - try { - - super.init( site ); - - } catch ( PartInitException pie ) { - - pie.printStackTrace(); - - } - - page = site.getPage(); - page.addPartListener(this); - - NsharpMapResource.registerMouseHandler(); - //Chin : to fix Ticket#11034:::: - //get several control information back from SkewT resource, in the case that - //NsharpPaletteWindow view was disposed and re-constructed while SkewT resource is still alive. - //This case applied to D2D implementation. - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) { - interpolateIsOn = rsc.isInterpolateIsOn(); - overlayIsOn = rsc.isOverlayIsOn(); - compareStnIsOn = rsc.isCompareStnIsOn(); - editGraphOn = rsc.isEditGraphOn(); - } - - } - - /** - * Disposes resource. invoked by the workbench - */ - public void dispose() { - //System.out.println("NsharpPaletteWindow dispose() called!! isEditorVisible="+ isEditorVisible); - if ( ! isEditorVisible ) { - NsharpMapResource.unregisterMouseHandler(); - return; - } - else { - super.dispose(); - currentGraphMode= NsharpConstants.GRAPH_SKEWT; - isEditorVisible = false; - NCMapEditor editor = NsharpMapResource.getMapEditor(); - if(editor!=null){ - for ( IRenderableDisplay display : UiUtil.getDisplaysFromContainer(editor) ) { - //System.out.println("display " + display.toString()); - for ( ResourcePair rp : display.getDescriptor().getResourceList() ) { - if ( rp.getResource() instanceof NsharpMapResource ) { - NsharpMapResource rsc = (NsharpMapResource)rp.getResource(); - rsc.unload(); - display.getDescriptor().getResourceList().removePreRemoveListener(rsc); - - } - } - } - } - if(newFont!= null){ - newFont.dispose(); - newFont=null; - } /* - * remove the workbench part listener - */ - page.removePartListener(this); - - try{ - if(NsharpLoadDialog.getAccess()!= null){ - NsharpLoadDialog.getAccess().close(); - } - }catch (Exception e) { - - } - instance= null; - } - } - protected boolean checkLoadedData() { - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor == null) { - mb.open(); - return false; - } - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor() - .getSkewtResource(); - if (rsc == null ) { - mb.open(); - return false; - } - return true; - } - protected NsharpSkewTResource getSkewTRsc(){ - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor == null) { - - return null; - } - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor() - .getSkewtResource(); - if (rsc == null) - return null; - - return rsc; - } - - public void createDataControlGp(Composite parent){ - Group textModeGp = new Group(parent,SWT.SHADOW_OUT); - textModeGp.setLayout( new RowLayout(SWT.HORIZONTAL) ); - textModeGp.setLayoutData( new GridData(GridData.FILL_HORIZONTAL) ); - Font font = textModeGp.getFont(); - FontData[] fontData = font.getFontData(); - for (int i = 0; i < fontData.length; i++) { - fontData[i].setHeight(7); - //fontData[i].setName("courier"); - } - newFont = new Font(font.getDevice(), fontData); - - loadBtn = new Button(textModeGp, SWT.PUSH); - loadBtn.setFont(newFont); - loadBtn.setText(" Load "); - loadBtn.setEnabled( true ); - //loadBtn.setSize(btnWidth,pushbtnHeight); - loadBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - NsharpLoadDialog loadDia = NsharpLoadDialog.getInstance(shell); - - if ( loadDia != null ) { - //System.out.println("Load Button is calling dialog open()"); - loadDia.open(); - } - } - } ); - - unloadBtn = new Button(textModeGp, SWT.PUSH); - unloadBtn.setFont(newFont); - unloadBtn.setText(" UnLoad "); - unloadBtn.setEnabled( true ); - //loadBtn.setSize(btnWidth,pushbtnHeight); - unloadBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(checkLoadedData()) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - NsharpUnloadDialog unloadDia = NsharpUnloadDialog.getInstance(shell); - - if ( unloadDia != null ) { - //System.out.println("Load Button is calling dialog open()"); - unloadDia.open(); - - } - } - } - } ); - // Push buttons for SAVE - Button saveBtn = new Button(textModeGp, SWT.PUSH); - saveBtn.setFont(newFont); - saveBtn.setText(" Save "); - saveBtn.setEnabled( true ); - //saveBtn.setSize(btnWidth,pushbtnHeight); - saveBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - - if(checkLoadedData()) { - // Action to save text report - NsharpSaveHandle.saveFile(shell); - } - } - - } ); - - // Push buttons for CONFIGURE - Button cfgBtn = new Button(textModeGp, SWT.PUSH); - cfgBtn.setFont(newFont); - cfgBtn.setText(" Configure "); - cfgBtn.setEnabled(true); - //cfgBtn.setSize(btnWidth,pushbtnHeight); - cfgBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - //CHin, new develop if(checkLoadedData()) { - //NsharpParametersSelectionConfigDialog dia = NsharpParametersSelectionConfigDialog.getInstance(shell); - NsharpConfigDialog dia = NsharpConfigDialog.getInstance(shell); - if ( dia != null ) { - dia.open(); - } - //} - - } - } ); - - Button resetBtn = new Button(textModeGp, SWT.PUSH); - resetBtn.setFont(newFont); - resetBtn.setText(" Reset "); - resetBtn.setEnabled( true ); - resetBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //RESET should turn off everything... - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - - overlayIsOn = false; - overlayBtn.setText(OVLY_OFF); - overlayBtn.setEnabled(true); - compareStnIsOn = false; - compareStnBtn.setText(COMP_STN_OFF); - compareStnBtn.setEnabled(true); - compareTmIsOn = false; - compareTmBtn.setText(COMP_TM_OFF); - compareTmBtn.setEnabled(true); - interpolateIsOn = false; - interpBtn.setText(INTP_OFF); - editGraphOn = false; - graphModeBtnIcing.setEnabled(true); - graphModeBtnTurb.setEnabled(true); - graphEditBtn.setText(EDIT_GRAPH_OFF); - currentGraphMode= NsharpConstants.GRAPH_SKEWT; - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - //note: resetRsc will reset currentPage, overlay, compare, interpolate flag in Resource - editor.getNsharpSkewTDescriptor().getSkewtResource().resetRsc(); - //editor.getNsharpSkewTDescriptor().getSkewtResource().resetRsc();// need to called it twice to make refresh worked...dont know why - //know that current editor is NsharpSkewT editor, refresh it. - editor.refresh(); - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - } - if(NsharpParcelDialog.getAccess() != null){ - NsharpParcelDialog.getAccess().resetUserDefParcel(); - } - } - } ); - - Button parcelBtn = new Button(textModeGp, SWT.PUSH); - parcelBtn.setFont(newFont); - parcelBtn.setText(" Parcel "); - parcelBtn.setEnabled( true ); - //parcelBtn.setSize(btnWidth,pushbtnHeight); - parcelBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - NsharpParcelDialog parcelDia = NsharpParcelDialog.getInstance(shell); - - if ( parcelDia != null ) { - //System.out.println("calling parcel dialog open()"); - parcelDia.open(); - - } - } - } - } ); - - // Push buttons for NEXT PAGE info - Button nextpageBtn = new Button(textModeGp, SWT.PUSH); - nextpageBtn.setFont(newFont); - nextpageBtn.setText(" Next Data "); - nextpageBtn.setEnabled(true); - nextpageBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setNextTextPage(); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - //know that current editor is NsharpSkewT editor, refresh it. - editor.refresh(); - } - } - } - } ); - - // Push buttons for NEXT INSET PAGE info - Button nextInsetBtn = new Button(textModeGp, SWT.PUSH); - nextInsetBtn.setFont(newFont); - nextInsetBtn.setText(" Next Inset "); - nextInsetBtn.setEnabled(true); - nextInsetBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setNextInsetPage(); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - //know that current editor is NsharpSkewT editor, refresh it. - editor.refresh(); - } - } - } - } ); - - - // Push buttons for interpolate - interpBtn = new Button(textModeGp, SWT.PUSH); - interpBtn.setFont(newFont); - interpBtn.setEnabled( true ); - if(interpolateIsOn) { - interpBtn.setText(INTP_ON); - } - else{ - interpBtn.setText(INTP_OFF); - } - interpBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - - if(interpolateIsOn == false){ - interpolateIsOn = true; - interpBtn.setText(INTP_ON); - } - else { - interpolateIsOn = false; - interpBtn.setText(INTP_OFF); - } - //note:call resetInfoOnInterpolate() and pass interpolate flag to Resource - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - try { - editor.getNsharpSkewTDescriptor().getSkewtResource().resetInfoOnInterpolate(interpolateIsOn); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - //know that current editor is NsharpSkewT editor, refresh it. - editor.refresh(); - - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - } - } - } - } ); - - NsharpSkewTResource rsc = getSkewTRsc(); - - // Push buttons for OVERLAY info - overlayBtn = new Button(textModeGp, SWT.PUSH); - overlayBtn.setFont(newFont); - if(overlayIsOn){ - overlayBtn.setText(OVLY_ON); - overlayBtn.setEnabled( true ); - } - else{ - overlayBtn.setText(OVLY_OFF); - //comparison and overlay is mutual exclusive - if((rsc!= null) && (rsc.isCompareStnIsOn() || rsc.isCompareTmIsOn())) - overlayBtn.setEnabled( false ); - else - overlayBtn.setEnabled( true ); - } - overlayBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(overlayIsOn == false){ - - overlayIsOn = true; - overlayBtn.setText(OVLY_ON); - compareStnBtn.setEnabled(false); - compareTmBtn.setEnabled(false); - } - else { - overlayIsOn = false; - overlayBtn.setText(OVLY_OFF); - compareStnBtn.setEnabled(true); - compareTmBtn.setEnabled(true); - } - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setOverlayIsOn(overlayIsOn); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - editor.refresh(); - } - } - } ); - // Push buttons for CompByStn info - compareStnBtn = new Button(textModeGp, SWT.PUSH); - compareStnBtn.setFont(newFont); - if(compareStnIsOn){ - compareStnBtn.setText(COMP_STN_ON); - compareStnBtn.setEnabled( true ); - } - else{ - //comparison and overlay is mutual exclusive - compareStnBtn.setText(COMP_STN_OFF); - if((rsc!= null) && (rsc.isOverlayIsOn() || rsc.isCompareTmIsOn())) - compareStnBtn.setEnabled( false ); - else - compareStnBtn.setEnabled( true ); - } - compareStnBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(compareStnIsOn == false){ - - compareStnIsOn = true; - compareStnBtn.setText(COMP_STN_ON); - overlayBtn.setEnabled(false); - compareTmBtn.setEnabled( false ); - } - else { - compareStnIsOn = false; - compareStnBtn.setText(COMP_STN_OFF); - overlayBtn.setEnabled(true); - compareTmBtn.setEnabled( true ); - } - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setCompareStnIsOn(compareStnIsOn); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - editor.refresh(); - } - } - } ); - // Push buttons for CompByTm info - compareTmBtn = new Button(textModeGp, SWT.PUSH); - compareTmBtn.setFont(newFont); - if(compareTmIsOn){ - compareTmBtn.setText(COMP_TM_ON); - compareTmBtn.setEnabled( true ); - } - else{ - //comparison and overlay is mutual exclusive - compareTmBtn.setText(COMP_TM_OFF); - if((rsc!= null) && (rsc.isOverlayIsOn() || rsc.isCompareStnIsOn())) - compareTmBtn.setEnabled( false ); - else - compareTmBtn.setEnabled( true ); - } - compareTmBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(compareTmIsOn == false){ - - compareTmIsOn = true; - compareTmBtn.setText(COMP_TM_ON); - overlayBtn.setEnabled(false); - compareStnBtn.setEnabled( false ); - } - else { - compareTmIsOn = false; - compareTmBtn.setText(COMP_TM_OFF); - overlayBtn.setEnabled(true); - compareStnBtn.setEnabled( true ); - } - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setCompareTmIsOn(compareTmIsOn); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - editor.refresh(); - } - } - } ); - dataEditBtn = new Button(textModeGp, SWT.PUSH); - dataEditBtn.setFont(newFont); - dataEditBtn.setText(" Edit Data "); - dataEditBtn.setEnabled( true ); - dataEditBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(checkLoadedData()) { - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - NsharpEditDataDialog editDia = NsharpEditDataDialog.getInstance(shell); - if ( editDia != null ) { - editDia.open(); - } - } - } - } ); - - graphEditBtn = new Button(textModeGp, SWT.PUSH); - graphEditBtn.setFont(newFont); - graphEditBtn.setEnabled( true ); - if(editGraphOn) { - graphEditBtn.setText(EDIT_GRAPH_ON); - } - else{ - graphEditBtn.setText(EDIT_GRAPH_OFF); - } - graphEditBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(checkLoadedData()) { - if(editGraphOn){ - editGraphOn=false; - graphEditBtn.setText(EDIT_GRAPH_OFF); - graphModeBtnIcing.setEnabled(true); - graphModeBtnTurb.setEnabled(true); - - } - else{ - editGraphOn= true; - graphEditBtn.setText(EDIT_GRAPH_ON); - graphModeBtnIcing.setEnabled(false); - graphModeBtnTurb.setEnabled(false); - - } - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null) - rsc.setEditGraphOn(editGraphOn); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if(editor != null){ - editor.refresh(); - } - - } - } - } ); - /*Button bndryMotionBtn = new Button(textModeGp, SWT.PUSH); - bndryMotionBtn.setText("BoundaryMotion"); - bndryMotionBtn.setEnabled( true ); - bndryMotionBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - NsharpShowTextDialog osDia = NsharpShowTextDialog.getInstance( shell ); - if(osDia != null) - osDia.open(); - } - } - } );*/ - - // Push buttons for show text info - Button showtextBtn = new Button(textModeGp, SWT.PUSH); - showtextBtn.setFont(newFont); - showtextBtn.setText(" Show Text "); - showtextBtn.setEnabled( true ); - showtextBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) { - NsharpShowTextDialog osDia = NsharpShowTextDialog.getInstance( shell ); - if(osDia != null) - osDia.open(); - } - } - } ); - Group graphModeGp = new Group(textModeGp,SWT.SHADOW_ETCHED_IN); - graphModeGp.setLayout(new RowLayout(SWT.HORIZONTAL) );//new GridLayout( 2, false ) ); - - // Push buttons for graphMode - graphModeBtnSkew = new Button(graphModeGp, SWT.PUSH ); - graphModeBtnSkew.setFont(newFont); - graphModeBtnSkew.setText("S"); - graphModeBtnSkew.setEnabled( true ); - colorButtonOriginalBg= graphModeBtnSkew.getBackground(); - rsc = getSkewTRsc(); - if(rsc!= null ){ - currentGraphMode = rsc.getCurrentGraphMode(); - } - graphModeBtnSkew.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentGraphMode= NsharpConstants.GRAPH_SKEWT; - graphModeBtnSkew.setBackground(colorGrey); - graphModeBtnTurb.setBackground(colorButtonOriginalBg); - graphModeBtnIcing.setBackground(colorButtonOriginalBg); - graphEditBtn.setEnabled(true); - dataEditBtn.setEnabled(true); - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null && rsc.getDescriptor()!=null) { - NsharpBackgroundResource bkRsc = rsc.getDescriptor().getSkewTBkGResource(); - if(bkRsc!=null){ - rsc.setCurrentGraphMode(currentGraphMode); - bkRsc.setCurrentGraphMode(currentGraphMode); - } - } - } - } ); - graphModeBtnTurb = new Button(graphModeGp, SWT.PUSH); - graphModeBtnTurb.setFont(newFont); - graphModeBtnTurb.setText("T"); - graphModeBtnTurb.setEnabled( true ); - graphModeBtnTurb.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentGraphMode= NsharpConstants.GRAPH_TURB; - graphModeBtnTurb.setBackground(colorGrey); - graphModeBtnSkew.setBackground(colorButtonOriginalBg); - graphModeBtnIcing.setBackground(colorButtonOriginalBg); - graphEditBtn.setEnabled(false); - dataEditBtn.setEnabled(false); - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null && rsc.getDescriptor()!=null) { - NsharpBackgroundResource bkRsc = rsc.getDescriptor().getSkewTBkGResource(); - if(bkRsc!=null){ - rsc.setCurrentGraphMode(currentGraphMode); - bkRsc.setCurrentGraphMode(currentGraphMode); - } - } - } - } ); - graphModeBtnIcing = new Button(graphModeGp, SWT.PUSH); - graphModeBtnIcing.setFont(newFont); - graphModeBtnIcing.setText("I"); - graphModeBtnIcing.setEnabled( true ); - graphModeBtnIcing.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentGraphMode= NsharpConstants.GRAPH_ICING; - graphModeBtnIcing.setBackground(colorGrey); - graphModeBtnSkew.setBackground(colorButtonOriginalBg); - graphModeBtnTurb.setBackground(colorButtonOriginalBg); - graphEditBtn.setEnabled(false); - dataEditBtn.setEnabled(false); - NsharpSkewTResource rsc = getSkewTRsc(); - if(rsc!= null && rsc.getDescriptor()!=null) { - NsharpBackgroundResource bkRsc = rsc.getDescriptor().getSkewTBkGResource(); - if(bkRsc!=null){ - rsc.setCurrentGraphMode(currentGraphMode); - bkRsc.setCurrentGraphMode(currentGraphMode); - } - } - } - } ); - if(currentGraphMode== NsharpConstants.GRAPH_SKEWT){ - graphModeBtnSkew.setBackground(colorGrey); - } - else if(currentGraphMode== NsharpConstants.GRAPH_TURB){ - graphModeBtnTurb.setBackground(colorGrey); - } - else if(currentGraphMode== NsharpConstants.GRAPH_ICING){ - graphModeBtnIcing.setBackground(colorGrey); - } - - // Push buttons for Print - Button printBtn = new Button(textModeGp, SWT.PUSH); - printBtn.setFont(newFont); - printBtn.setText(" Print "); - printBtn.setEnabled( true ); - printBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - if(checkLoadedData()) {// Action to print - printHandle.handlePrint(""); - } - } - } ); - textModeGp.redraw(); - - } - - public boolean isEditorVisible() { - return isEditorVisible; - } - public void setEditorVisible(boolean isEditorVisible) { - this.isEditorVisible = isEditorVisible; - } - /** - * Invoked by the workbench, this method sets up the SWT controls for the nsharp palette - */ - - @Override - public void createPartControl(Composite parent) { - //System.out.println("nlist @"+NsharpConstants.getNlistFile()); - parent.setLayout( new GridLayout( 1, true ) ); - createDataControlGp(parent); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // TODO Auto-generated method stub - - } - @Override - public void widgetSelected(SelectionEvent e) { - // TODO Auto-generated method stub - - } - @Override - public void widgetDisposed(DisposeEvent e) { - - - } - @Override - public void partActivated(IWorkbenchPart part) { - // TODO Auto-generated method stub - - } - @Override - public void partBroughtToTop(IWorkbenchPart part) { - // TODO Auto-generated method stub - - } - @Override - public void partClosed(IWorkbenchPart part) { - } - @Override - public void partDeactivated(IWorkbenchPart part) { - // TODO Auto-generated method stub - - } - @Override - public void partOpened(IWorkbenchPart part) { - // TODO Auto-generated method stub - - } - @Override - public void setFocus() { - // TODO Auto-generated method stub - - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaneConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaneConfigDialog.java deleted file mode 100644 index 1eebdcf1db..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpPaneConfigDialog.java +++ /dev/null @@ -1,217 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaneConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 06/28/2012	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpGraphProperty; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; - -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpPaneConfigDialog extends Dialog { - private static NsharpPaneConfigDialog thisDialog=null; - private NsharpConfigStore configStore=null; - private NsharpConfigManager mgr; - private int btnWidth = 300; - private int btnHeight = 20; - private int labelGap = 20; - private int btnGapX = 5; - private int btnGapY = 5; - private Combo paneCfgCombo; - private String paneConfigurationName; - private MessageBox mb ; - private void updateCfgStore(){ - if(configStore != null){ - configStore.getGraphProperty().setPaneConfigurationName(paneConfigurationName); - } - } - - public static NsharpPaneConfigDialog getInstance( Shell parShell){ - - if ( thisDialog == null ){ - try { - thisDialog = new NsharpPaneConfigDialog( parShell ); - - } catch (VizException e) { - e.printStackTrace(); - } - - } - - return thisDialog; - - } - - public static NsharpPaneConfigDialog getAccess() { - return thisDialog; - } - - public NsharpPaneConfigDialog(Shell parentShell) throws VizException { - super(parentShell); - thisDialog = this; - mgr =NsharpConfigManager.getInstance(); - configStore = mgr.retrieveNsharpConfigStoreFromFs(); - if(configStore != null){ - paneConfigurationName = configStore.getGraphProperty().getPaneConfigurationName(); - } - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - mb = new MessageBox(shell, SWT.ICON_WARNING - | SWT.OK ); - mb.setMessage( "New pane configuration will take effect after Cave restarted!"); - - } - private void createDialogContents(Composite parent){ - - Group btnGp = new Group(parent, SWT.SHADOW_ETCHED_IN | SWT.NO_RADIO_GROUP); - Label paneCfgComboLbl = new Label(btnGp, SWT.BORDER ); - paneCfgComboLbl.setText("Pane Configuration Selection :"); - paneCfgComboLbl.setBounds(btnGp.getBounds().x+ btnGapX, btnGp.getBounds().y + labelGap, btnWidth,btnHeight); - paneCfgCombo = new Combo(btnGp, SWT.NULL); - paneCfgCombo.setBounds(btnGp.getBounds().x+ btnGapX, paneCfgComboLbl.getBounds().y + paneCfgComboLbl.getBounds().height+ btnGapY,btnWidth,btnHeight); - int selectIndex=0; - configStore = mgr.retrieveNsharpConfigStoreFromFs(); - if(configStore != null){ - paneConfigurationName = configStore.getGraphProperty().getPaneConfigurationName(); - } - for(int i=0; i" : paneCfgCombo.getItem(paneCfgCombo.getSelectionIndex())) + ", text content in the text field: " + paneCfgCombo.getText()); - String text = paneCfgCombo.getText(); - if(paneCfgCombo.indexOf(text) < 0) { // Not in the list yet. - paneCfgCombo.add(text); - // Re-sort - String[] items = paneCfgCombo.getItems(); - paneCfgCombo.setItems(items); - } - } - }); - - - } - - @Override - public void createButtonsForButtonBar(Composite parent) { - Button saveBtn = createButton(parent, IDialogConstants.INTERNAL_ID, - "Save",false); - saveBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - try { - //save to xml - paneConfigurationName = paneCfgCombo.getItem(paneCfgCombo.getSelectionIndex()); - updateCfgStore(); - mgr.saveConfigStoreToFs(configStore); - mb.open(); - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - } - } ); - - Button canBtn = createButton(parent, IDialogConstants.CLOSE_ID, - IDialogConstants.CLOSE_LABEL, false); - canBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("close listener is called"); - close(); - } - } ); - } - - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) - */ - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Nsharp Pane Configuration Selection" ); - - } - @Override - public Control createDialogArea(Composite parent) { - Composite top; - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDialogContents(top); - - return top; - } - - - @Override - public int open( ) { - if ( this.getShell() == null ){ - this.create(); - } - this.getShell().setLocation(this.getShell().getParent().getLocation().x+1100, - this.getShell().getParent().getLocation().y+200); - return super.open(); - - } - @Override - public boolean close() { - paneCfgCombo.dispose(); - paneCfgCombo=null; - return (super.close()); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParametersSelectionConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParametersSelectionConfigDialog.java deleted file mode 100644 index cb5928247e..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParametersSelectionConfigDialog.java +++ /dev/null @@ -1,801 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpParametersSelectionConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore; -import gov.noaa.nws.ncep.ui.nsharp.NsharpGraphProperty; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpSkewTBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpBackgroundResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpParametersSelectionConfigDialog extends Dialog { - private static NsharpParametersSelectionConfigDialog thisDialog=null; - private NsharpConfigStore configStore=null; - private NsharpGraphProperty graphProperty=null; - private NsharpConfigManager mgr; - private int btnWidth = 300; - private int btnHeight = 20; - private int labelGap = 20; - private int btnGapX = 5; - private int btnGapY = 5; - private Button tempBtn, dewpBtn, parcelBtn, vTempBtn, wetBulbBtn, mixingRatioBtn, - dryAdiabatBtn,moisAdiabatBtn,omegaBtn, meanWindVectorBtn, stormMVector3075Btn, stormMVector1585Btn, - stormMVectorBunkersRightBtn,stormMVectorBunkersLeftBtn, corfidiVectorBtn, hodoBtn, efflayerBtn, cloudBtn, windBarbBtn; - private Text windBarbText, tempOffsetText; - //default value for button initial setup - private boolean temp=true, dewp=true, parcel=true, vTemp=true, wetBulb=true, hodo=true, - mixratio=false, dryAdiabat=true, moistAdiabat=false, omega=true, meanWind=true, - smv3075=false, smv1585=false, smvBunkersR=true, smvBunkersL=true,corfidiV=false, effLayer=true, cloud=false, windBarb=true; - private int windBarbDistance=NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT; - private int tempOffset = 0; - private void updateGraphProperty(){ - if(graphProperty != null){ - graphProperty.setTemp(temp); - graphProperty.setDewp(dewp); - graphProperty.setParcel(parcel); - graphProperty.setVTemp(vTemp); - graphProperty.setWetBulb(wetBulb); - graphProperty.setHodo(hodo); - graphProperty.setMixratio(mixratio); - graphProperty.setDryAdiabat(dryAdiabat); - graphProperty.setMoistAdiabat(moistAdiabat); - graphProperty.setOmega(omega); - graphProperty.setMeanWind(meanWind); - graphProperty.setSmv3075(smv3075); - graphProperty.setSmv1585(smv1585); - graphProperty.setSmvBunkersR(smvBunkersR); - graphProperty.setSmvBunkersL(smvBunkersL); - graphProperty.setCloud(cloud); - graphProperty.setCorfidiV(corfidiV); - graphProperty.setEffLayer(effLayer); - graphProperty.setWindBarb(windBarb); - graphProperty.setWindBarbDistance(windBarbDistance); - graphProperty.setTempOffset(tempOffset); - } - } - public boolean isCloud() { - return cloud; - } - - - public boolean isEffLayer() { - return effLayer; - } - - - public boolean isHodo() { - return hodo; - } - - - public boolean isMeanWind() { - return meanWind; - } - - - public boolean isSmv3075() { - return smv3075; - } - - - public boolean isSmv1585() { - return smv1585; - } - - - public boolean isSmvBunkersR() { - return smvBunkersR; - } - - - public boolean isSmvBunkersL() { - return smvBunkersL; - } - - - public boolean isCorfidiV() { - return corfidiV; - } - - - public boolean isOmega() { - return omega; - } - - - public boolean isDryAdiabat() { - return dryAdiabat; - } - - public boolean isMoistAdiabat() { - return moistAdiabat; - } - - public boolean isMixratio() { - return mixratio; - } - - public boolean isTemp() { - return temp; - } - - public boolean isDewp() { - return dewp; - } - - public boolean isParcel() { - return parcel; - } - - public boolean isVTemp() { - return vTemp; - } - - public boolean isWetBulb() { - return wetBulb; - } - - - public boolean isWindBarb() { - return windBarb; - } - - - public int getWindBarbDistance() { - return windBarbDistance; - } - - - public static NsharpParametersSelectionConfigDialog getInstance( Shell parShell){ - - if ( thisDialog == null ){ - try { - thisDialog = new NsharpParametersSelectionConfigDialog( parShell ); - - } catch (VizException e) { - e.printStackTrace(); - } - - } - - return thisDialog; - - } - - public static NsharpParametersSelectionConfigDialog getAccess() { - return thisDialog; - } - public static NsharpConfigStore setDefaultGraphConfig(NsharpConfigStore cs){ - NsharpGraphProperty gp = cs.getGraphProperty(); - gp.setTemp(true); - gp.setDewp(true); - gp.setParcel(true); - gp.setVTemp(true); - gp.setWetBulb(true); - gp.setHodo(true); - gp.setMixratio(false); - gp.setDryAdiabat(true); - gp.setMoistAdiabat(false); - gp.setOmega(true); - gp.setMeanWind(true); - gp.setSmv3075(false); - gp.setSmv1585(false); - gp.setSmvBunkersL(true); - gp.setSmvBunkersR(true); - gp.setCloud(false); - gp.setCorfidiV(false); - gp.setEffLayer(true); - gp.setWindBarb(true); - gp.setWindBarbDistance(NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT); - gp.setTempOffset(0); - return cs; - } - public NsharpParametersSelectionConfigDialog(Shell parentShell) throws VizException { - super(parentShell); - thisDialog = this; - mgr =NsharpConfigManager.getInstance(); - configStore = mgr.retrieveNsharpConfigStoreFromFs(); - //if(configStore== null){ - // configStore = new NsharpConfigStore(); - // configStore = setDefaultGraphConfig(configStore); - // configStore=NsharpDataDisplayConfigDialog.setDefaultLineConfig(configStore); - //} - graphProperty = configStore.getGraphProperty(); - if(graphProperty != null){ - temp=graphProperty.isTemp(); - dewp=graphProperty.isDewp(); - parcel=graphProperty.isParcel(); - vTemp=graphProperty.isVTemp(); - wetBulb=graphProperty.isWetBulb(); - hodo=graphProperty.isHodo(); - mixratio=graphProperty.isMixratio(); - dryAdiabat=graphProperty.isDryAdiabat(); - moistAdiabat=graphProperty.isMoistAdiabat(); - omega=graphProperty.isOmega(); - meanWind=graphProperty.isMeanWind(); - smv3075=graphProperty.isSmv3075(); - smv1585=graphProperty.isSmv1585(); - smvBunkersR=graphProperty.isSmvBunkersR(); - smvBunkersL=graphProperty.isSmvBunkersL(); - corfidiV=graphProperty.isCorfidiV(); - effLayer=graphProperty.isEffLayer(); - cloud=graphProperty.isCloud(); - windBarb=graphProperty.isWindBarb(); - windBarbDistance = graphProperty.getWindBarbDistance(); - tempOffset = graphProperty.getTempOffset(); - } - - } - private void createDialogContents(Composite parent){ - - Group btnGp = new Group(parent, SWT.SHADOW_ETCHED_IN | SWT.NO_RADIO_GROUP); - - tempBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - tempBtn.setText(NsharpNativeConstants.TEMP_TRACE); - tempBtn.setEnabled( true ); - tempBtn.setBounds(btnGp.getBounds().x+ btnGapX, btnGp.getBounds().y + labelGap, btnWidth,btnHeight); - if(temp == true) - tempBtn.setSelection(true); - else - tempBtn.setSelection(false); - tempBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(temp == true) - temp=false; - else - temp=true; - applyChange(); - } - } ); - dewpBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - dewpBtn.setText(NsharpNativeConstants.DEWP_TRACE); - dewpBtn.setEnabled( true ); - dewpBtn.setBounds(btnGp.getBounds().x+ btnGapX, tempBtn.getBounds().y + tempBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(dewp == true) - dewpBtn.setSelection(true); - else - dewpBtn.setSelection(false); - dewpBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(dewp == true) - dewp=false; - else - dewp=true; - applyChange(); - } - } ); - parcelBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - parcelBtn.setText(NsharpNativeConstants.PARCEL_TRACE); - parcelBtn.setEnabled( true ); - parcelBtn.setBounds(btnGp.getBounds().x+ btnGapX, dewpBtn.getBounds().y + dewpBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(parcel == true) - parcelBtn.setSelection(true); - else - parcelBtn.setSelection(false); - parcelBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(parcel == true) - parcel=false; - else - parcel=true; - applyChange(); - } - } ); - vTempBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - vTempBtn.setText(NsharpNativeConstants.VTEMP_TRACE); - vTempBtn.setEnabled( true ); - vTempBtn.setBounds(btnGp.getBounds().x+ btnGapX, parcelBtn.getBounds().y + parcelBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(vTemp == true) - vTempBtn.setSelection(true); - else - vTempBtn.setSelection(false); - vTempBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(vTemp == true) - vTemp=false; - else - vTemp=true; - applyChange(); - } - } ); - - wetBulbBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - wetBulbBtn.setText(NsharpNativeConstants.WETBULB_TRACE); - wetBulbBtn.setEnabled( true ); - wetBulbBtn.setBounds(btnGp.getBounds().x+ btnGapX, vTempBtn.getBounds().y + vTempBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(wetBulb == true) - wetBulbBtn.setSelection(true); - else - wetBulbBtn.setSelection(false); - wetBulbBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(wetBulb == true) - wetBulb=false; - else - wetBulb=true; - applyChange(); - } - } ); - - mixingRatioBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - mixingRatioBtn.setText(NsharpNativeConstants.MIXING_RATIO); - mixingRatioBtn.setEnabled( true ); - mixingRatioBtn.setBounds(btnGp.getBounds().x+ btnGapX, wetBulbBtn.getBounds().y + wetBulbBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(mixratio == true) - mixingRatioBtn.setSelection(true); - else - mixingRatioBtn.setSelection(false); - mixingRatioBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(mixratio == true) - mixratio=false; - else - mixratio=true; - applyChange(); - } - } ); - dryAdiabatBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - dryAdiabatBtn.setText(NsharpNativeConstants.DRY_ADIABAT); - dryAdiabatBtn.setEnabled( true ); - dryAdiabatBtn.setBounds(btnGp.getBounds().x+ btnGapX, mixingRatioBtn.getBounds().y + mixingRatioBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(dryAdiabat == true) - dryAdiabatBtn.setSelection(true); - else - dryAdiabatBtn.setSelection(false); - dryAdiabatBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(dryAdiabat == true) - dryAdiabat=false; - else - dryAdiabat=true; - applyChange(); - } - } ); - - moisAdiabatBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - moisAdiabatBtn.setText(NsharpNativeConstants.MOIST_ADIABAT); - moisAdiabatBtn.setEnabled( true ); - moisAdiabatBtn.setBounds(btnGp.getBounds().x+ btnGapX, dryAdiabatBtn.getBounds().y + dryAdiabatBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(moistAdiabat == true) - moisAdiabatBtn.setSelection(true); - else - moisAdiabatBtn.setSelection(false); - moisAdiabatBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(moistAdiabat == true) - moistAdiabat=false; - else - moistAdiabat=true; - applyChange(); - } - } ); - efflayerBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - efflayerBtn.setText(NsharpNativeConstants.EFFECTIVE_LAYER); - efflayerBtn.setEnabled( true ); - efflayerBtn.setBounds(btnGp.getBounds().x+ btnGapX, moisAdiabatBtn.getBounds().y + moisAdiabatBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(effLayer == true) - efflayerBtn.setSelection(true); - else - efflayerBtn.setSelection(false); - efflayerBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(effLayer == true) - effLayer=false; - else - effLayer=true; - applyChange(); - } - } ); - cloudBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - cloudBtn.setText(NsharpNativeConstants.CLOUD); - cloudBtn.setEnabled( true ); - cloudBtn.setBounds(btnGp.getBounds().x+ btnGapX, efflayerBtn.getBounds().y + efflayerBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(cloud == true) - cloudBtn.setSelection(true); - else - cloudBtn.setSelection(false); - cloudBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(cloud == true) - cloud=false; - else - cloud=true; - applyChange(); - } - } ); - hodoBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - hodoBtn.setText(NsharpNativeConstants.HODOGRAPH); - hodoBtn.setEnabled( true ); - hodoBtn.setBounds(btnGp.getBounds().x+ btnGapX, cloudBtn.getBounds().y + cloudBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(hodo == true) - hodoBtn.setSelection(true); - else - hodoBtn.setSelection(false); - hodoBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(hodo == true) - hodo=false; - else - hodo=true; - applyChange(); - } - } ); - meanWindVectorBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - meanWindVectorBtn.setText(NsharpNativeConstants.MEAN_WIND_VECTOR); - meanWindVectorBtn.setEnabled( true ); - meanWindVectorBtn.setBounds(btnGp.getBounds().x+ btnGapX, hodoBtn.getBounds().y + hodoBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(meanWind == true) - meanWindVectorBtn.setSelection(true); - else - meanWindVectorBtn.setSelection(false); - meanWindVectorBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(meanWind == true) - meanWind=false; - else - meanWind=true; - applyChange(); - } - } ); - stormMVector3075Btn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - stormMVector3075Btn.setText(NsharpNativeConstants.STORM_MOTION_VECTOR_3075); - stormMVector3075Btn.setEnabled( true ); - stormMVector3075Btn.setBounds(btnGp.getBounds().x+ btnGapX, meanWindVectorBtn.getBounds().y + meanWindVectorBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(smv3075 == true) - stormMVector3075Btn.setSelection(true); - else - stormMVector3075Btn.setSelection(false); - stormMVector3075Btn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(smv3075 == true) - smv3075=false; - else - smv3075=true; - applyChange(); - } - } ); - stormMVector1585Btn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - stormMVector1585Btn.setText(NsharpNativeConstants.STORM_MOTION_VECTOR_1585); - stormMVector1585Btn.setEnabled( true ); - stormMVector1585Btn.setBounds(btnGp.getBounds().x+ btnGapX, stormMVector3075Btn.getBounds().y + stormMVector3075Btn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(smv1585 == true) - stormMVector1585Btn.setSelection(true); - else - stormMVector1585Btn.setSelection(false); - stormMVector1585Btn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(smv1585 == true) - smv1585=false; - else - smv1585=true; - applyChange(); - } - } ); - stormMVectorBunkersRightBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - stormMVectorBunkersRightBtn.setText(NsharpNativeConstants.STORM_MOTION_VECTOR_BUNKERS_R); - stormMVectorBunkersRightBtn.setEnabled( true ); - stormMVectorBunkersRightBtn.setBounds(btnGp.getBounds().x+ btnGapX, stormMVector1585Btn.getBounds().y + stormMVector1585Btn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(smvBunkersR == true) - stormMVectorBunkersRightBtn.setSelection(true); - else - stormMVectorBunkersRightBtn.setSelection(false); - stormMVectorBunkersRightBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(smvBunkersR == true) - smvBunkersR=false; - else - smvBunkersR=true; - applyChange(); - } - } ); - stormMVectorBunkersLeftBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - stormMVectorBunkersLeftBtn.setText(NsharpNativeConstants.STORM_MOTION_VECTOR_BUNKERS_L); - stormMVectorBunkersLeftBtn.setEnabled( true ); - stormMVectorBunkersLeftBtn.setBounds(btnGp.getBounds().x+ btnGapX, stormMVectorBunkersRightBtn.getBounds().y + stormMVectorBunkersRightBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(smvBunkersL == true) - stormMVectorBunkersLeftBtn.setSelection(true); - else - stormMVectorBunkersLeftBtn.setSelection(false); - stormMVectorBunkersLeftBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(smvBunkersL == true) - smvBunkersL=false; - else - smvBunkersL=true; - applyChange(); - } - } ); - - corfidiVectorBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - corfidiVectorBtn.setText(NsharpNativeConstants.CORFIDI_VECTORS); - corfidiVectorBtn.setEnabled( true ); - corfidiVectorBtn.setBounds(btnGp.getBounds().x+ btnGapX, stormMVectorBunkersLeftBtn.getBounds().y + stormMVectorBunkersLeftBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(corfidiV == true) - corfidiVectorBtn.setSelection(true); - else - corfidiVectorBtn.setSelection(false); - corfidiVectorBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(corfidiV == true) - corfidiV=false; - else - corfidiV=true; - applyChange(); - } - } ); - windBarbBtn= new Button(btnGp, SWT.RADIO | SWT.BORDER); - windBarbBtn.setText(NsharpNativeConstants.WINDBARB); - windBarbBtn.setEnabled(true); - windBarbBtn.setBounds(btnGp.getBounds().x+ btnGapX, corfidiVectorBtn.getBounds().y + corfidiVectorBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(windBarb == true) - windBarbBtn.setSelection(true); - else - windBarbBtn.setSelection(false); - windBarbBtn.addListener(SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(windBarb == true) - windBarb=false; - else - windBarb=true; - applyChange(); - } - } ); - windBarbText = new Text(btnGp, SWT.BORDER | SWT.SINGLE); - windBarbText.setText(Integer.toString(windBarbDistance)); - windBarbText.setBounds(windBarbBtn.getBounds().x+windBarbBtn.getBounds().width, windBarbBtn.getBounds().y,btnWidth/4,btnHeight); - windBarbText.setEditable(true); - windBarbText.setVisible(true); - //to make sure user enter digits only - windBarbText.addListener (SWT.Verify, new Listener () { - public void handleEvent (Event e) { - String string = e.text; - char [] chars = new char [string.length ()]; - string.getChars (0, chars.length, chars, 0); - //System.out.println("entered "+ string); - - for (int i=0; i= 1) && (textStr.contains("-"))){ - e.doit = false; - return; - } - }else if (!('0' <= chars [0] && chars [0] <= '9')) { - e.doit = false; - return; - } - - } - } - }); - if(NsharpLoadDialog.getAccess()!= null && - (NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.MODEL_SND || - NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.PFC_SND )){ - omegaBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - omegaBtn.setText(NsharpNativeConstants.OMEGA); - omegaBtn.setEnabled( true ); - omegaBtn.setBounds(btnGp.getBounds().x+ btnGapX, tempOffsetLbl.getBounds().y + tempOffsetLbl.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(omega == true) - omegaBtn.setSelection(true); - else - omegaBtn.setSelection(false); - omegaBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(omega == true) - omega=false; - else - omega=true; - applyChange(); - } - } ); - } - - } - - @Override - public void createButtonsForButtonBar(Composite parent) { - // create OK button but using Apply label for applying user entered data - //Chin note: when "apply" button is selected or Return key is entered, - // okPressed() will be called. So, handle event at one place, ie.e at okPressed(). - Button appBtn = createButton(parent, IDialogConstants.OK_ID, - "Apply", - true); - - /*appBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("App listener is called"); - //String textStr = windBarbText.getText(); - //if((textStr != null) && !(textStr.isEmpty())){ - // windBarbDistance = Integer.decode(textStr); - //} - //applyChange(); - - } - } ); */ - Button saveBtn = createButton(parent, IDialogConstants.INTERNAL_ID, - "Save",false); - saveBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("save listener is called, also apply changes"); - okPressed(); - try { - //save to xml - mgr.saveConfigStoreToFs(configStore); - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - } - } ); - - Button canBtn = createButton(parent, IDialogConstants.CLOSE_ID, - IDialogConstants.CLOSE_LABEL, false); - canBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("close listener is called"); - close(); - } - } ); - } - - - @Override - public void okPressed() { - //"Enter" key is pressed, or "Apply" button is pressed. - //Chin: handle user entered data and apply its changes. - //System.out.println("CR is pressed"); - String textStr = windBarbText.getText(); - if((textStr != null) && !(textStr.isEmpty())){ - windBarbDistance = Integer.decode(textStr); - } - textStr = tempOffsetText.getText(); - if((textStr != null) && !(textStr.isEmpty())){ - if(!textStr.contains("-") || textStr.length() > 1){ - tempOffset = Integer.decode(textStr); - //System.out.println("temp offset is ="+tempOffset); - } - } - applyChange(); - setReturnCode(OK); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) - */ - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Nsharp Parameters Selection" ); - - } - @Override - public Control createDialogArea(Composite parent) { - Composite top; - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDialogContents(top); - - return top; - } - - - @Override - public int open( ) { - if ( this.getShell() == null ){ - this.create(); - } - this.getShell().setLocation(this.getShell().getParent().getLocation().x+1100, - this.getShell().getParent().getLocation().y+200); - return super.open(); - - } - @Override - public boolean close() { - tempBtn= dewpBtn= parcelBtn= vTempBtn= wetBulbBtn= mixingRatioBtn= - dryAdiabatBtn=moisAdiabatBtn=efflayerBtn=omegaBtn= meanWindVectorBtn= stormMVector3075Btn= stormMVector1585Btn= - stormMVectorBunkersRightBtn=stormMVectorBunkersLeftBtn= corfidiVectorBtn= hodoBtn=windBarbBtn=null; - //thisDialog= null; - return (super.close()); - } - - public void reset(){ - windBarbDistance=NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT; - tempOffset=0; - } - - private void applyChange(){ - updateGraphProperty(); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor().getSkewtResource(); - //rsc.setWindBarbDistance(windBarbDistance); - rsc.setGraphConfigProperty(graphProperty); - rsc.createRscPressTempCurveShapeAll(); - NsharpBackgroundResource bkRsc = editor.getNsharpSkewTDescriptor().getSkewTBkGResource(); - if(bkRsc!= null) - { - NsharpSkewTBackground skewBkRsc = bkRsc.getSkewTBackground(); - if(skewBkRsc!= null) - skewBkRsc.setGraphConfigProperty(graphProperty); - } - - editor.refresh(); - } - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParcelDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParcelDialog.java deleted file mode 100644 index 0646b9d774..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpParcelDialog.java +++ /dev/null @@ -1,544 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpParcelDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - - -import java.util.ArrayList; -import java.util.List; - -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource.ParcelData; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpParcelDialog extends Dialog { - private static NsharpParcelDialog thisDialog=null; - private String CUR_SFC = "Current Surface"; - private String FRCST_SFC = "Forecast Surface"; - private String MML= "Mean Mixing Layer"; - private String MUP = "Most Unstable Parcel"; - private String UDL= "User Defined Level"; - private String EFF = "Mean Effective Layer"; - //private boolean surface=false, forcast=false, mml=false, mup=true, udl=false, eff=false; - ParcelData surfacePar=null, forcastPar=null, mmlPar=null, mupPar=null, udlPar=null, effPar=null; - private NsharpSkewTResource skewtRsc; - //private static short currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - //private static short prevParcel = currentParcel; - private int userDefdParcelMb = 850; //default value - private int btnWidth = 300; - private int btnHeight = 20; - private int labelGap = 20; - private int btnGapX = 5; - private int btnGapY = 5; - private Button curSfcBtn,frcstBtn,effBtn,mmlBtn, mupBtn,udlBtn; - private Text userDefdMbtext; - private List parcelList = new ArrayList(); - public int getUserDefdParcelMb() { - return userDefdParcelMb; - } - - - public void resetUserDefParcel(){ - userDefdParcelMb = 850; - } - public void reset(){ - parcelList.clear(); - addParcelToList(mupPar); - userDefdParcelMb = 850; - //mup=true; - //surface= forcast=mml= udl= eff=false; - } - /* - public void setCurrentParcelButton(int parcelType){ - switch(parcelType){ - case NsharpNativeConstants.PARCELTYPE_OBS_SFC: - curSfcBtn.setSelection(true); - break; - case NsharpNativeConstants.PARCELTYPE_EFF: - effBtn.setSelection(true); - break; - case NsharpNativeConstants.PARCELTYPE_FCST_SFC: - frcstBtn.setSelection(true); - break; - case NsharpNativeConstants.PARCELTYPE_MEAN_MIXING: - mmlBtn.setSelection(true); - break; - case NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE: - mupBtn.setSelection(true); - break; - case NsharpNativeConstants.PARCELTYPE_USER_DEFINED: - udlBtn.setSelection(true); - break; - default: - break; - } - }*/ - public static NsharpParcelDialog getInstance( Shell parShell){ - - if ( thisDialog == null ){ - try { - thisDialog = new NsharpParcelDialog( parShell ); - //System.out.println("new parcel dialog INSTANCE created"); - } catch (VizException e) { - e.printStackTrace(); - } - - } - else { - //System.out.println("current load dialog INSTANCE returned!"); - } - - return thisDialog; - - } - - public static NsharpParcelDialog getAccess() { - return thisDialog; - } - protected NsharpParcelDialog(Shell parentShell) throws VizException { - super(parentShell); - thisDialog = this; - skewtRsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - if(skewtRsc!=null){ - surfacePar = skewtRsc.new ParcelData(); - surfacePar.setParcelLayerPressure(NsharpNativeConstants.OBS_LAYER); - surfacePar.setParcelType(NsharpNativeConstants.PARCELTYPE_OBS_SFC); - forcastPar = skewtRsc.new ParcelData(); - forcastPar.setParcelLayerPressure(NsharpNativeConstants.FCST_LAYER); - forcastPar.setParcelType(NsharpNativeConstants.PARCELTYPE_FCST_SFC); - mmlPar = skewtRsc.new ParcelData(); - mmlPar.setParcelLayerPressure(NsharpNativeConstants.MML_LAYER); - mmlPar.setParcelType(NsharpNativeConstants.PARCELTYPE_MEAN_MIXING); - mupPar = skewtRsc.new ParcelData(); - mupPar.setParcelLayerPressure(NsharpNativeConstants.MU_LAYER); - mupPar.setParcelType(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE); - udlPar = skewtRsc.new ParcelData(); - udlPar.setParcelLayerPressure(NsharpNativeConstants.USER_LAYER); - udlPar.setParcelType(NsharpNativeConstants.PARCELTYPE_USER_DEFINED); - effPar = skewtRsc.new ParcelData(); - effPar.setParcelLayerPressure(NsharpNativeConstants.EFF_LAYER); - effPar.setParcelType(NsharpNativeConstants.PARCELTYPE_EFF); - - //addParcelToList(mupPar); - - } - } - private void addParcelToList(ParcelData parcel){ - if(parcel!=null){ - parcelList.add(parcel); - } - } - /*private void deleteParcelFromList(ParcelData parceldata){ - if( parceldata!=null){ - parcelList.remove(parceldata); - } - }*/ - - private void createDialogContents(Composite parent){ - - final Group btnGp = new Group(parent, SWT.SHADOW_ETCHED_IN ); - - Listener radioGpLsner = new Listener() { - public void handleEvent(Event event) { - Control [] children = btnGp.getChildren(); - for (int j=0; j - * SOFTWARE HISTORY - * - * Date Ticket# Engineer Description - * ------- ------- -------- ----------- - * 03/23/2010 229 Chin Chen Initial coding - * - * - * - * @author Chin Chen - * @version 1.0 - */ -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._lplvalues; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._parcel; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpBackgroundResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpDrawPanels; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Transform; -import org.eclipse.swt.printing.PrintDialog; -import org.eclipse.swt.printing.Printer; -import org.eclipse.swt.printing.PrinterData; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.progress.UIJob; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.WGraphics; -import com.sun.jna.ptr.FloatByReference; - -public class NsharpPrintHandle { - private Printer printer; - private StringBuffer wordBuffer; - private int lineHeight = 0; - private int tabWidth = 0; - private int leftMargin, rightMargin, topMargin, bottomMargin; - private GC gc; - private NsharpNative nsharpNative=null; - private static int SKEWT_X_ORIG= 0; - private static int SKEWT_HEIGHT= 375; - private static int SKEWT_WIDTH= 420; - private static int HODO_X_ORIG= SKEWT_X_ORIG + SKEWT_WIDTH-130; - private static int HODO_HEIGHT= 130; - private static int HODO_WIDTH= HODO_HEIGHT; - private Font printerFont; - private Color printerForegroundColor, printerBackgroundColor; - private Transform transform; - - private static NsharpPrintHandle printHandle=null; - public static NsharpPrintHandle getPrintHandle() { - if(printHandle==null) - printHandle = new NsharpPrintHandle(); - return printHandle; - } - public void handlePrint(String intext) { - /* Do the printing in a background thread so that spooling does not freeze the UI. */ - /* - * Chin:NOTE:::the following is from http://www.eclipse.org/swt/faq.php - * To allow background threads to perform operations on objects belonging to the UI-thread, - * the methods syncExec(Runnable runnable) and asyncExec(Runnable runnable) of Display are used. - * These are the only methods in SWT that can be called from any thread. - * They allow a runnable to be executed by the UI-thread, either synchronously, - * causing the background thread to wait for the runnable to finish, - * or asynchronously allowing the background thread to continue execution without waiting for the result. - * A runnable that is executed using syncExec() most closely matches the equivalent direct call to the UI - * operation because a Java method call always waits for the result before proceeding, - * just like syncExec(). - */ - - /*Chin:NOTE::: This code does not work when run in 5th floor FIT lab. CAVE display will freeze after hit "Print" - * button. - Display display = Display.getCurrent(); - display.asyncExec( - new Runnable() { - public void run(){ - Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - PrintDialog dialog = new PrintDialog(shell, SWT.NULL); - PrinterData data = dialog.open(); - - if (data == null) return; - if (data.printToFile) { - - //System.out.println("Prnit to file with file name="+data.fileName); - String fileName = data.fileName; - int i = fileName.indexOf("///"); - if(i!=-1) //to fix a bug that add extra "//" at front of file path - data.fileName = fileName.substring(0, i)+fileName.substring(i+2); - //System.out.println("Prnit to file with file name="+data.fileName); - } - - // Do the printing in a background thread so that spooling does not freeze the UI. - printer = new Printer(data); - - print(printer); - printer.dispose(); - } - }); -*/ - //Chin: Note: now try use UIJOB to see if it works in 5th floor fit lab.. - Job uijob = new UIJob("clear source selection"){ //$NON-NLS-1$ - public IStatus runInUIThread( - IProgressMonitor monitor) { - Shell shell =PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); - PrintDialog dialog = new PrintDialog(shell, SWT.NULL); - PrinterData data = dialog.open(); - - if (data == null) return Status.CANCEL_STATUS; - if (data.printToFile) { - - //System.out.println("Prnit to file with file name="+data.fileName); - String fileName = data.fileName; - int i = fileName.indexOf("///"); - if(i!=-1) //to fix a bug that add extra "//" at front of file path - data.fileName = fileName.substring(0, i)+fileName.substring(i+2); - //System.out.println("Prnit to file with file name="+data.fileName); - } - try{ - // Do the printing in a background thread so that spooling does not freeze the UI. - createPrinter(data); - if (startJob()) { - printPage(NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor()); - endJob(); - } - disposePrinter(); - } - catch (Exception e) { - - e.printStackTrace(); - } - return Status.OK_STATUS; - } - - }; - uijob.setSystem(true); - uijob.schedule(); - - - } - - public void createPrinter(PrinterData data){ - this.printer = new Printer(data); - } - - public boolean startJob(){ - String tabs; - if (printer.startJob("NSHARP")) { // the string is the job name - shows up in the printer's job list - Rectangle clientArea = printer.getClientArea(); - Rectangle trim = printer.computeTrim(0, 0, 0, 0); - Point dpi = printer.getDPI(); - - float dpiScaleX = dpi.x/72f; - float dpiScaleY = dpi.y/72f; - - transform = new Transform(printer); - transform.scale(dpiScaleX, dpiScaleY); - - leftMargin = 72 + trim.x; // one inch from left side of paper - rightMargin = clientArea.width - 72 + trim.x + trim.width; // one inch from right side of paper - topMargin = 72 + trim.y; // one inch from top edge of paper - bottomMargin = clientArea.height - 72 + trim.y + trim.height; // one inch from bottom edge of paper - //System.out.println("leftMargin="+leftMargin+"rightMargin="+rightMargin+"topMargin"+topMargin+"bottomMargin"+bottomMargin); - //leftMargin=54rightMargin=521topMargin54bottomMargin701 - /* Create a buffer for computing tab width. */ - int tabSize = 4; // is tab width a user setting in your UI? - StringBuffer tabBuffer = new StringBuffer(tabSize); - for (int i = 0; i < tabSize; i++) tabBuffer.append(' '); - tabs = tabBuffer.toString(); - - /* Create printer GC, and create and set the printer font & foreground color. */ - gc = new GC(printer); - int fontSize = (int) Math.round(5/dpiScaleY); - fontSize = Math.max(1, fontSize); - printerFont = new Font(printer, "Courier", fontSize, SWT.NORMAL); - gc.setFont(printerFont); - tabWidth = gc.stringExtent(tabs).x; - lineHeight = gc.getFontMetrics().getHeight(); - - RGB rgb = new RGB(0,0,0);//Black - printerForegroundColor = new Color(printer, rgb); - gc.setForeground(printerForegroundColor); - rgb = new RGB(255,255,255);//white - printerBackgroundColor = new Color(printer, rgb); - gc.setBackground(printerBackgroundColor); - gc.setTransform(transform); - return true; - } - return false; - } - - public void printPage(NsharpSkewTDescriptor desc){ - NsharpBackgroundResource bkRsc = desc.getSkewTBkGResource(); - printer.startPage(); - // Print SkewT square - gc.drawRectangle(leftMargin+SKEWT_X_ORIG, topMargin, SKEWT_WIDTH, SKEWT_HEIGHT); - // set view dimension - WGraphics world = new WGraphics(leftMargin+SKEWT_X_ORIG, topMargin, leftMargin+SKEWT_X_ORIG+SKEWT_WIDTH, topMargin+SKEWT_HEIGHT); - //set SKEWT virtual world coordinate. - world.setWorldCoordinates(NsharpConstants.left, NsharpConstants.top, - NsharpConstants.right, NsharpConstants.bottom); - gc.setLineWidth(1); - NsharpSkewTResource rsc = desc.getSkewtResource(); - - - try { - gc.setClipping(leftMargin-30, topMargin-30, rightMargin+30, bottomMargin); - gc.drawString(rsc.getPickedStnInfoStr(),leftMargin+SKEWT_X_ORIG, topMargin-20); - rsc.printNsharpPressureLinesNumber(world, gc); - rsc.printNsharpTempNumber(world, gc); - rsc.printHeightMark(world, gc); - rsc.printNsharpWind(world, gc); - //set clipping - gc.setClipping(leftMargin+SKEWT_X_ORIG, topMargin, SKEWT_WIDTH, SKEWT_HEIGHT); - //print skewt background - bkRsc.getSkewTBackground().paintForPrint(world, gc); - gc.setLineWidth(2); - gc.setLineStyle(SWT.LINE_SOLID); - rsc.printNsharpPressureTempCurve( world, rsc.TEMP_TYPE, gc, rsc.getSoundingLys()); - rsc.printNsharpPressureTempCurve( world, rsc.DEWPOINT_TYPE, gc,rsc.getSoundingLys()); - - gc.setLineStyle(SWT.LINE_DASH); - rsc.printNsharpWetbulbTraceCurve(world, gc); - gc.setLineStyle(SWT.LINE_DASHDOTDOT); - rsc.printNsharpParcelTraceCurve(world, gc); - gc.setLineStyle(SWT.LINE_SOLID); - //fill/cover this skewt area to be used by Hodo - gc.fillRectangle(leftMargin+HODO_X_ORIG, topMargin, HODO_WIDTH, HODO_HEIGHT); - } catch (VizException e) { - e.printStackTrace(); - } - gc.setLineWidth(2); - // Print Hodo square - gc.drawRectangle(leftMargin+HODO_X_ORIG, topMargin, HODO_WIDTH, HODO_HEIGHT); - - //set HODO view world - world = new WGraphics(leftMargin+HODO_X_ORIG, topMargin, leftMargin+HODO_X_ORIG+HODO_WIDTH, topMargin+HODO_HEIGHT); - //set HODO real world coordinate. - world.setWorldCoordinates(-50, 90, 90, -50); - - gc.setLineWidth(1); - //print hodo background - bkRsc.getHodoBackground().paintForPrint(world, gc); - try { - //print hodo - gc.setLineStyle(SWT.LINE_SOLID); - - rsc.printNsharpHodoWind(world, gc, rsc.getSoundingLys()); - } catch (VizException e) { - e.printStackTrace(); - } - nsharpNative = getNsharpNativePtr(); - //reset clipping - gc.setClipping(leftMargin-15, topMargin+SKEWT_HEIGHT, rightMargin-leftMargin+30,bottomMargin-topMargin+30); - - gc.setLineWidth(2); - //print thermodynamic data title and its box - gc.drawString("THERMODYNAMIC PARAMETERS",leftMargin+50, topMargin+SKEWT_HEIGHT+20); - //gc.drawRectangle(leftMargin-15, topMargin+SKEWT_HEIGHT+30, 220,280); - gc.drawLine(leftMargin-15, topMargin+SKEWT_HEIGHT+30, leftMargin+205,topMargin+SKEWT_HEIGHT+30); - //set clipping - //gc.setClipping(leftMargin-16, topMargin+SKEWT_HEIGHT+30, 222,280); - String textStr = printThermodynamicParametersBox1(); - //System.out.println(textStr); - int curY= printText(textStr,leftMargin-12, topMargin+SKEWT_HEIGHT+35, leftMargin+205,topMargin+SKEWT_HEIGHT+295); - gc.drawLine(leftMargin-15, curY, leftMargin+205,curY); - gc.drawLine(leftMargin-15, curY, leftMargin-15,topMargin+SKEWT_HEIGHT+30); - gc.drawLine(leftMargin+205, curY, leftMargin+205,topMargin+SKEWT_HEIGHT+30); - String str1="", str2="", str3=""; - textStr = printThermodynamicParametersBox2(); - int gapIndex1 = textStr.indexOf("BOXLINE"); - str1= textStr.substring(0, gapIndex1); - int gapIndex2 = textStr.indexOf("BOXLINE",gapIndex1+1); - str2= textStr.substring( gapIndex1+("BOXLINE".length()),gapIndex2); - str3= textStr.substring( gapIndex2+("BOXLINE".length())); - int preY= curY; - curY= printText(str1,leftMargin-12, curY+1, leftMargin+205,topMargin+SKEWT_HEIGHT+295); - gc.drawLine(leftMargin-15, curY, leftMargin+205,curY); - gc.drawLine(leftMargin-15, curY, leftMargin-15,preY); - gc.drawLine(leftMargin+205, curY, leftMargin+205,preY); - preY= curY; - curY= printText(str2,leftMargin-12, curY+1, leftMargin+205,topMargin+SKEWT_HEIGHT+295); - gc.drawLine(leftMargin-15, curY, leftMargin+205,curY); - gc.drawLine(leftMargin-15, curY, leftMargin-15,preY); - gc.drawLine(leftMargin+205, curY, leftMargin+205,preY); - preY= curY; - curY= printText(str3,leftMargin-12, curY+1, leftMargin+205,topMargin+SKEWT_HEIGHT+295); - gc.drawLine(leftMargin-15, curY, leftMargin+205,curY); - gc.drawLine(leftMargin-15, curY, leftMargin-15,preY); - gc.drawLine(leftMargin+205, curY, leftMargin+205,preY); - - textStr = "Output produced by: NCO-SIB AWIPS2 NSHARP\nNational SkewT-Hodograph Analysis and Research Program\n"; - printText(textStr,leftMargin-12, curY+100, leftMargin+300,curY+120); - - - //print kinematic data title and its box - gc.drawString("KINEMATIC PARAMETERS",leftMargin+280, topMargin+SKEWT_HEIGHT+20); - gc.drawLine(leftMargin+225, topMargin+SKEWT_HEIGHT+30, leftMargin+445,topMargin+SKEWT_HEIGHT+30); - textStr = printKinematicParametersBox(); - curY= printText(textStr,leftMargin+228,topMargin+SKEWT_HEIGHT+35, leftMargin+444,topMargin+SKEWT_HEIGHT+295); - //System.out.println("curreny y = "+ curY); - gc.drawLine(leftMargin+225, curY, leftMargin+445,curY); - gc.drawLine(leftMargin+225, curY, leftMargin+225,topMargin+SKEWT_HEIGHT+30); - gc.drawLine(leftMargin+445, curY, leftMargin+445,topMargin+SKEWT_HEIGHT+30); - - // print STORM STRUCTURE PARAMETERS - gc.drawString("STORM STRUCTURE PARAMETERS",leftMargin+280, curY+20); - gc.drawLine(leftMargin+225, curY+30, leftMargin+445,curY+30); - textStr = printStormStructureParametersBox(); - preY = curY+30; - curY= printText(textStr,leftMargin+228,curY+35, leftMargin+444,topMargin+SKEWT_HEIGHT+295); - gc.drawLine(leftMargin+225, curY, leftMargin+445,curY); - gc.drawLine(leftMargin+225, curY, leftMargin+225,preY); - gc.drawLine(leftMargin+445, curY, leftMargin+445,preY); - - printer.endPage(); - } - - public void endJob(){ - printer.endJob(); - - /* Cleanup graphics resources used in printing */ - printerFont.dispose(); - printerForegroundColor.dispose(); - printerBackgroundColor.dispose(); - transform.dispose(); - gc.dispose(); - } - - public void disposePrinter(){ - printer.dispose(); - } - - private int x, y; - private int index, end; - - private int printText(String textToPrint, int xmin, int ymin, int xmax,int ymax) { - - wordBuffer = new StringBuffer(); - x = xmin; - y = ymin; - index = 0; - end = textToPrint.length(); - while (index < end) { - char c = textToPrint.charAt(index); - index++; - if (c != 0) { - if (c == 0x0a || c == 0x0d) { - if (c == 0x0d && index < end && textToPrint.charAt(index) == 0x0a) { - index++; // if this is cr-lf, skip the lf - } - printWordBuffer(xmin, ymin, xmax, ymax); - newline(xmin, ymin, xmax, ymax); - } else { - if (c != '\t') { - wordBuffer.append(c); - } - if (Character.isWhitespace(c)) { - printWordBuffer(xmin, ymin, xmax, ymax); - if (c == '\t') { - x += tabWidth; - } - } - } - } - } - return y; - } - - void printWordBuffer(int xmin, int ymin, int xmax,int ymax) { - if (wordBuffer.length() > 0) { - String word = wordBuffer.toString(); - int wordWidth = gc.stringExtent(word).x; - if (x + wordWidth > xmax) { - /* word doesn't fit on current line, so wrap */ - System.out.println("word doesn't fit on current line, so wrap "); - newline(xmin, ymin, xmax, ymax); - } - gc.drawString(word, x, y, false); - - x += wordWidth; - wordBuffer = new StringBuffer(); - } - } - - void newline(int xmin, int ymin, int xmax,int ymax) { - x = xmin; - y += lineHeight; - } - - protected WGraphics computeWorld(int x1, int y1, int x2, int y2) { - WGraphics world = new WGraphics(x1, y1, x1, y1); - world.setWorldCoordinates(-50, 90, 90, -50); - return world; - } - private NsharpNative getNsharpNativePtr(){ - NsharpNative nsharpNative=null; - NsharpSkewTDescriptor desc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor(); - if( desc != null) { - NsharpSkewTResource rsc = desc.getSkewtResource(); - if(rsc != null){ - nsharpNative = rsc.getNsharpNative(); - } - } - return nsharpNative; - } - private boolean qc ( float value ) - /*************************************************************/ - /* */ - /* Quality control of sndg data. Searches for missing */ - /* data (-999) and returns (1 = OK), (0 = missing) */ - /*************************************************************/ - { - if( value < -998.0F ) { return false; } - if( value > 2.0E+05F ) { return false; } - return true; - } - private String printKinematicParametersBox(){ - /* - * Chin's NOTE::::this function is for printing and coded based on legacy nsharp software - * show_meanwind() - * in xwvid3.c - * - * void mean_wind ( float pbot, float ptop, float *mnu, float *mnv, - * float *wdir, float *wspd ) - * Calculates a pressure-weighted mean wind thru the - * layer (pbot-ptop). Default layer is LFC-EL. - * - * pbot - Bottom level of layer (mb) - * ptop - Top level of layer (mb) - * mnu - U-Component of mean wind (kt) - * mnv - V-Component of mean wind (kt) - */ - - - if(nsharpNative != null){ - FloatByReference mnu= new FloatByReference(0); - FloatByReference mnv= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - String textStr, finalTextStr="\t"; - finalTextStr = finalTextStr+ NsharpNativeConstants.MEAN_WIND_STR; - - //Calculate mean wind at 0-6 km - nsharpNative.nsharpLib.mean_wind( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.agl(6000)), mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())&&qc(wspd.getValue())) { - textStr = NsharpNativeConstants.MEANWIND_SFC6KM_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_SFC6KM_MISSING; - } - finalTextStr = finalTextStr + textStr; - //Calculate mean wind at LFC-EL - nsharpNative.nsharpLib.mean_wind( -1, -1, mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())&&qc(wspd.getValue())) { - textStr = NsharpNativeConstants.MEANWIND_LFC_EL_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_LFC_EL_MISSING; - } - finalTextStr = finalTextStr + textStr; - //Calculate mean wind at 850-200 mb - nsharpNative.nsharpLib.mean_wind( 850,200, mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())&&qc(wspd.getValue())) { - textStr = NsharpNativeConstants.MEANWIND_850_200MB_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_850_200MB_MISSING; - } - finalTextStr = finalTextStr + textStr + "\n"; - - /* - * Chin's NOTE::::the following function is for pritning and coded based on legacy nsharp software - * show_shear() - * in xwvid3.c - * - * void wind_shear ( float pbot, float ptop, float *shu, float *shv, - * float *sdir, float *smag ) - * - * Calculates the shear between the wind at (pbot) and - * (ptop). Default lower wind is a 1km mean wind, while - * the default upper layer is 3km. - * - * pbot - Bottom level of layer (mb) - * ptop - Top level of layer (mb) - * shu - U-Component of shear (m/s) - * shv - V-Component of shear (m/s) - * sdir - Direction of shear vector (degrees) - * smag - Magnitude of shear vector (m/s) - */ - FloatByReference shu= new FloatByReference(0); - FloatByReference shv= new FloatByReference(0); - FloatByReference sdir= new FloatByReference(0); - FloatByReference smag= new FloatByReference(0); - finalTextStr = finalTextStr + NsharpNativeConstants.ENVIRONMENTAL_SHEAR_STR; - - finalTextStr = finalTextStr + NsharpNativeConstants.SHEAR_LAYER_DELTA_STR; - - //Calculate wind shear at Low - 3 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(3000)), - shu,shv,sdir,smag); - if(qc(smag.getValue())) { - textStr = NsharpNativeConstants.SHEAR_LOW_3KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.3F); - } - else { - textStr = NsharpNativeConstants.SHEAR_LOW_3KM_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //Calculate wind shear at Sfc - 2 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), - shu,shv,sdir,smag); - if(qc(smag.getValue())) { - textStr = NsharpNativeConstants.SHEAR_SFC_2KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.2F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_2KM_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //Calculate wind shear at Sfc - 6 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), - shu,shv,sdir,smag); - if(qc(smag.getValue())) { - textStr = NsharpNativeConstants.SHEAR_SFC_6KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.6F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_6KM_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //Calculate wind shear at Sfc - 12 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(12000)), - shu,shv,sdir,smag); - if(qc(smag.getValue())) { - textStr = NsharpNativeConstants.SHEAR_SFC_12KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/1.2F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_12KM_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //BRN Shear - /*_lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - _parcel pcl= new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl);*/ - FloatByReference fvalue= new FloatByReference(0); - nsharpNative.nsharpLib.cave_bulk_rich2( fvalue ); - if(qc(fvalue.getValue())) { - textStr = NsharpNativeConstants.STORM_TYPE_BRNSHEAR_LINE; - textStr = String.format(textStr,fvalue.getValue(),NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - } - else - textStr = NsharpNativeConstants.STORM_TYPE_BRNSHEAR_MISSING; - finalTextStr = finalTextStr + textStr; - - return finalTextStr; - } - - return ""; - } - private String printThermodynamicParametersBox1(){ - //Chin's NOTE::::this function is coded based on native nsharp show_parcel() in xwvid3.c - //if we can not Interpolates a temp with 700 mb pressure, then we dont have enough raw data - //This function is called to construct text string for printing - - if(nsharpNative != null){ - if (nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0) - return null; - String finalTextStr = ""; - // set default - short currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - String hdrStr = NsharpNativeConstants.parcelToHdrStrMap.get(currentParcel); - float layerPressure = NsharpNativeConstants.MU_LAYER; - //get user selected parcel type - if(NsharpDrawPanels.getInstance() != null){ - currentParcel = NsharpDrawPanels.getInstance().getCurrentParcel(); - hdrStr = NsharpNativeConstants.parcelToHdrStrMap.get(currentParcel); - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - - } - finalTextStr= finalTextStr+hdrStr; - - //call native define_parcel() with parcel type and user defined pressure (if user defined it) - nsharpNative.nsharpLib.define_parcel(currentParcel,layerPressure); - - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - _parcel pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - - - String textStr = NsharpNativeConstants.PARCEL_LPL_LINE; - textStr = String.format(textStr, (int)pcl.lplpres,(int)pcl.lpltemp,(int)pcl.lpldwpt, - (int)nsharpNative.nsharpLib.ctof(pcl.lpltemp),(int)nsharpNative.nsharpLib.ctof(pcl.lpldwpt)); - //text.append(textStr); - finalTextStr = finalTextStr+textStr; - - if(qc(pcl.bplus)){ - textStr = NsharpNativeConstants.PARCEL_CAPE_LINE; - textStr = String.format(textStr,pcl.bplus); - } - else { - textStr = NsharpNativeConstants.PARCEL_CAPE_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.li5)){ - textStr = NsharpNativeConstants.PARCEL_LI_LINE; - textStr = String.format(textStr,pcl.li5); - } - else { - textStr = NsharpNativeConstants.PARCEL_LI_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.bfzl)){ - textStr = NsharpNativeConstants.PARCEL_BFZL_LINE; - textStr = String.format(textStr,pcl.bfzl); - } - else{ - textStr = NsharpNativeConstants.PARCEL_BFZL_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.limax)){ - textStr = NsharpNativeConstants.PARCEL_LIMIN_LINE; - textStr = String.format(textStr,pcl.limax,pcl.limaxpres); - } - else{ - textStr = NsharpNativeConstants.PARCEL_LIMIN_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.bminus)){ - textStr = NsharpNativeConstants.PARCEL_CINH_LINE; - textStr = String.format(textStr,pcl.bminus); - } - else { - textStr = NsharpNativeConstants.PARCEL_CINH_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.cap)){ - textStr = NsharpNativeConstants.PARCEL_CAP_LINE; - textStr = String.format(textStr, pcl.cap, pcl.cappres); - } - else { - textStr = NsharpNativeConstants.PARCEL_CAP_MISSING; - } - finalTextStr = finalTextStr + textStr; - - textStr = NsharpNativeConstants.PARCEL_LEVEL_LINE; - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.lclpres)&& - qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )))) ) - { - textStr = NsharpNativeConstants.PARCEL_LCL_LINE; - textStr = String.format(textStr,pcl.lclpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )))); - } - else { - textStr = NsharpNativeConstants.PARCEL_LCL_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.lfcpres) && - qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres )))) && - qc(nsharpNative.nsharpLib.itemp(pcl.lfcpres ))) - { - textStr = NsharpNativeConstants.PARCEL_LFC_LINE; - textStr = String.format(textStr,pcl.lfcpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres ))), - nsharpNative.nsharpLib.itemp(pcl.lfcpres )); - } - else { - textStr = NsharpNativeConstants.PARCEL_LFC_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.elpres) && - qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres )))) && - qc(nsharpNative.nsharpLib.itemp(pcl.elpres ))) - { - textStr = NsharpNativeConstants.PARCEL_EL_LINE; - textStr = String.format(textStr,pcl.elpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres ))), - nsharpNative.nsharpLib.itemp(pcl.elpres )); - } - else { - textStr = NsharpNativeConstants.PARCEL_EL_MISSING; - } - finalTextStr = finalTextStr + textStr; - - if(qc(pcl.mplpres) && - qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.mplpres )))) ) - { - textStr = NsharpNativeConstants.PARCEL_MPL_LINE; - textStr = String.format(textStr,pcl.mplpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.mplpres )))); - } - else { - textStr = NsharpNativeConstants.PARCEL_MPL_MISSING; - } - finalTextStr = finalTextStr + textStr; - - return finalTextStr; - - } - - return ""; - } - - @SuppressWarnings("deprecation") - public String printThermodynamicParametersBox2(){ - /* - * Chin's NOTE::::this function is coded based on legacy native nsharp software show_thermoparms(), - * show_moisture(),show_instability() in xwvid3.c - * This function is called to construct text string for printing - */ - - if(nsharpNative != null){ - String finalTextStr=""; - FloatByReference fValue= new FloatByReference(0); - FloatByReference fValue1= new FloatByReference(0); - FloatByReference fValue2= new FloatByReference(0); - FloatByReference fValue3= new FloatByReference(0); - //thermo data--------------// - //moisture data--------------// - String textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.precip_water(fValue, -1.0F, -1.0F); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_PWATER_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_PWATER_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_relhum(fValue, -1.0F, -1.0F); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_MEANRH_LINE; - textStr = String.format(textStr,fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANRH_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_mixratio(fValue, -1.0F, -1.0F); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_MEANW_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANW_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - fValue1.setValue(0); - // get surface pressure (fValue1) before getting mean LRH value - nsharpNative.nsharpLib.get_surface(fValue1, fValue2, fValue3); //fValue 2 and fValue3 are not of concern here - nsharpNative.nsharpLib.mean_relhum( fValue, -1.0F, fValue1.getValue() - 150 ); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_MEANLRH_LINE; - textStr = String.format(textStr,fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANLRH_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.top_moistlyr(fValue); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_TOP_LINE; - textStr = String.format(textStr,fValue.getValue(),nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(fValue.getValue())))); - } - else { - textStr = NsharpNativeConstants.THERMO_TOP_MISSING; - } - finalTextStr = finalTextStr + textStr; - //System.out.println(finalTextStr); - finalTextStr = finalTextStr + "BOXLINE"; - - //instability data--------------// - //finalTextStr=""; // reset str - - fValue.setValue(0); - fValue1.setValue(0); - - nsharpNative.nsharpLib.delta_t(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 700.0F, 500.0F ); - - if(qc(fValue.getValue()) && qc(fValue1.getValue())) { - textStr = NsharpNativeConstants.THERMO_700500mb_LINE; - textStr = String.format(textStr,fValue.getValue(), fValue1.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_700500mb_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - fValue1.setValue(0); - - nsharpNative.nsharpLib.vert_tot(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 850.0F, 500.0F ); - - if(qc(fValue.getValue()) && qc(fValue1.getValue())) { - textStr = NsharpNativeConstants.THERMO_850500mb_LINE; - textStr = String.format(textStr,fValue.getValue(), fValue1.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_850500mb_MISSING; - } - finalTextStr = finalTextStr + textStr; - finalTextStr = finalTextStr + "BOXLINE"; - - //misc parameters data--------------// - //finalTextStr=""; // reset str - fValue.setValue(0); - fValue1.setValue(0); - fValue2.setValue(0); - nsharpNative.nsharpLib.t_totals(fValue, fValue1, fValue2); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_TOTAL_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_TOTAL_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.k_index(fValue); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_KINDEX_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_KINDEX_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - nsharpNative.nsharpLib.sweat_index(fValue); - if(qc(fValue.getValue())) { - textStr = NsharpNativeConstants.THERMO_SWEAT_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_SWEAT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - float maxTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.max_temp( fValue, -1)); - if(qc(maxTempF)) { - textStr = NsharpNativeConstants.THERMO_MAXT_LINE; - textStr = String.format(textStr,maxTempF); - } - else { - textStr = NsharpNativeConstants.THERMO_MAXT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - float theDiff = nsharpNative.nsharpLib.ThetaE_diff( fValue); - if(qc(theDiff)) { - textStr = NsharpNativeConstants.THERMO_THETAE_LINE; - textStr = String.format(textStr,theDiff); - } - else { - textStr = NsharpNativeConstants.THERMO_THETAE_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - float conTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.cnvtv_temp( fValue, -50)); - if(qc(conTempF)) { - textStr = NsharpNativeConstants.THERMO_CONVT_LINE; - textStr = String.format(textStr,conTempF); - } - else { - textStr = NsharpNativeConstants.THERMO_CONVT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - float wbzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fValue )))); - if(qc(wbzft)) { - textStr = NsharpNativeConstants.THERMO_WBZ_LINE; - textStr = String.format(textStr,wbzft); - } - else { - textStr = NsharpNativeConstants.THERMO_WBZ_MISSING; - } - finalTextStr = finalTextStr + textStr; - - fValue.setValue(0); - float fgzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fValue )))); - if(qc(fgzft)) { - textStr = NsharpNativeConstants.THERMO_FGZ_LINE; - textStr = String.format(textStr,fgzft); - } - else { - textStr = NsharpNativeConstants.THERMO_FGZ_MISSING; - } - finalTextStr = finalTextStr + textStr; - - return finalTextStr; - } - return""; - } - public String printStormStructureParametersBox(){ - if(nsharpNative != null){ - FloatByReference smdir= new FloatByReference(0); - FloatByReference smspd= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - FloatByReference mnu= new FloatByReference(0); - FloatByReference mnv= new FloatByReference(0); - FloatByReference phel= new FloatByReference(0); - FloatByReference nhel= new FloatByReference(0); - String textStr, finalTextStr=""; - nsharpNative.nsharpLib.get_storm(smspd, smdir); - //calculate helicity for sfc-3 km - float totHeli = nsharpNative.nsharpLib.helicity( (float)0, (float)3000, smdir.getValue(), smspd.getValue(), phel, nhel); - if(qc(phel.getValue())&&qc(nhel.getValue())) { - textStr = "Sfc - 3km SREH =\t\t%.0f m%c/s%c\r\n"; - textStr = String.format(textStr, totHeli, - NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - } - else { - textStr = "Sfc - 3km SREH =\t\tM"; - } - finalTextStr = finalTextStr + textStr; - //EFF. SREH - //nsharpNative.nsharpLib.get_storm(wspd,wdir); - if(qc(smdir.getValue())&&qc(smspd.getValue())) { - totHeli = - nsharpNative.nsharpLib.helicity( -1.0F, -1.0F, smdir.getValue(), smspd.getValue(), phel, nhel); - if(qc(totHeli)){ - textStr = NsharpNativeConstants.STORM_TYPE_EFF_LINE; - textStr = String.format(textStr,totHeli,NsharpConstants.SQUARE_SYMBOL,NsharpConstants.SQUARE_SYMBOL); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EFF_MISSING; - } - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EFF_MISSING; - } - finalTextStr = finalTextStr + textStr; - //EHI - _parcel pcl = new _parcel();; - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - if(qc(pcl.bplus)) { - float ehi = - nsharpNative.nsharpLib.ehi( pcl.bplus, totHeli); - if(qc(ehi)){ - textStr = NsharpNativeConstants.STORM_TYPE_EHI_LINE; - textStr = String.format(textStr,ehi); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EHI_MISSING; - } - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EHI_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //BRN - if(qc(pcl.brn)) { - textStr = NsharpNativeConstants.STORM_TYPE_BRN_LINE; - textStr = String.format(textStr,pcl.brn); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_BRN_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //Strom wind - finalTextStr = finalTextStr +NsharpNativeConstants.STORM_WIND_STR; - finalTextStr = finalTextStr + NsharpNativeConstants.STORM_LAYER_VECTOR_STR; - //calculate pressure-weighted SR mean wind at sfc-2 km - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())) { - textStr = NsharpNativeConstants.STORM_SFC2KM_VECT_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_SFC2KM_VECT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //calculate pressure-weighted SR mean wind at 4-6 km - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(4000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())) { - textStr = NsharpNativeConstants.STORM_4_6KM_VECT_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_4_6KM_VECT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - //calculate pressure-weighted SR mean wind at 9-11 km - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(9000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(11000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(qc(wdir.getValue())) { - textStr = NsharpNativeConstants.STORM_9_11KM_VECT_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_9_11KM_VECT_MISSING; - } - finalTextStr = finalTextStr + textStr; - - return finalTextStr; - } - return""; - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpSaveHandle.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpSaveHandle.java deleted file mode 100644 index 9d56fdd0ab..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpSaveHandle.java +++ /dev/null @@ -1,151 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.util.List; -import java.util.StringTokenizer; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; - -public class NsharpSaveHandle { - public static void saveFile(Shell shell) { - FileDialog dlg = new FileDialog(shell, SWT.SAVE); - String fileName = null; - - // The user has finished when one of the - // following happens: - // 1) The user dismisses the dialog by pressing Cancel - // 2) The selected file name does not exist - // 3) The user agrees to overwrite existing file - boolean done = false; - boolean saveFile = false; - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - - if(rsc != null ){ - while (!done ) { - // Open the File Dialog - dlg.setText("Save Text Data"); - String[] filterExt = { "*.nsp", "*","*.txt","*.doc", ".rtf", "*.*"}; - dlg.setFilterExtensions(filterExt); - if( rsc.getPickedStnInfoStr()!= null && rsc.getPickedStnInfoStr().length() >0){ - StringTokenizer st = new StringTokenizer(rsc.getPickedStnInfoStr()); - int i =0; - - if(st.hasMoreTokens()== true){ - fileName = ""; - while (st.hasMoreTokens()) { - i++; - if(i > 3){ - break; - } - String tok = st.nextToken(); - if(i ==3) { - if(tok.length() >= 5) - tok = " " + tok.substring(0, 5); - else - tok = " " + tok; - } - fileName = fileName + tok; - - } - fileName = fileName + ".nsp"; - } - else - fileName= "nsharp.nsp"; - dlg.setFileName(fileName); - } - else - dlg.setFileName("nsharp.nsp"); - fileName = dlg.open(); - //System.out.println("file name = "+ fileName); - if (fileName == null) { - // User has cancelled, so quit and return - done = true; - } else { - // User has selected a file; see if it already exists - File file = new File(fileName); - if (file.exists()) { - // The file already exists; asks for confirmation - MessageBox mb = new MessageBox(dlg.getParent(), SWT.ICON_WARNING - | SWT.YES | SWT.NO); - - // We really should read this string from a - // resource bundle - mb.setMessage(fileName + " already exists. Do you want to replace it?"); - - // If they click Yes, we're done and we drop out. If - // they click No, we redisplay the File Dialog - done = mb.open() == SWT.YES; - if(done == true) - saveFile = true; - } else { - // File does not exist, so drop out - done = true; - saveFile = true; - } - } - } - if(saveFile == true) { - try{ - // Create file - FileWriter fstream = new FileWriter(fileName); - BufferedWriter out = new BufferedWriter(fstream); - String textToSave = new String(""); - - if(rsc!=null && rsc.getSoundingLys()!= null){ - List soundLyList = rsc.getSoundingLys(); - String latlonstr; - NsharpStationInfo stnInfo=rsc.getPickedStnInfo(); - if( stnInfo!= null){ - latlonstr = " LAT=" + stnInfo.getLatitude() + " LON="+ stnInfo.getLongitude(); - } - else { - latlonstr = " LAT= LON= "; - } - int loadsoundingType= NsharpLoadDialog.OBSER_SND; - String loadsoundingTypeStr= "OBS";; - if(NsharpLoadDialog.getAccess()!= null ){ - loadsoundingType = NsharpLoadDialog.getAccess().getActiveLoadSoundingType(); - switch(loadsoundingType ){ - case NsharpLoadDialog.PFC_SND: - loadsoundingTypeStr = "PFC"; - break; - case NsharpLoadDialog.MODEL_SND: - loadsoundingTypeStr = "MDL"; - break; - case NsharpLoadDialog.OBSER_SND: - default: - loadsoundingTypeStr = "OBS"; - break; - } - } - textToSave = loadsoundingTypeStr+ " "+rsc.getPickedStnInfo().getSndType() +" "+rsc.getPickedStnInfoStr() + latlonstr - + "\n" + "PRESSURE HGHT\t TEMP\t DWPT WDIR WSPD OMEG\n"; - String tempText=""; - for (NcSoundingLayer layer: soundLyList){ - tempText = String.format("%f %f %f %f %f %f %f\n", layer.getPressure(), - layer.getGeoHeight(),layer.getTemperature(),layer.getDewpoint(), layer.getWindDirection(), - layer.getWindSpeed(), layer.getOmega()); - textToSave = textToSave + tempText; - } - } - out.write(textToSave); - //Close the output stream - out.close(); - }catch (Exception e){//Catch exception if any - System.err.println("Error: " + e.getMessage()); - } - } - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpShowTextDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpShowTextDialog.java deleted file mode 100644 index 098cf53be5..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpShowTextDialog.java +++ /dev/null @@ -1,325 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpShowTextDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ - - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import java.util.List; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import com.raytheon.uf.viz.core.exception.VizException; - -public class NsharpShowTextDialog extends Dialog { - private static NsharpShowTextDialog INSTANCE = null; - protected Composite top; - private Shell shell; - private Text text=null; - private Group textGp; - private Font newFont ; - private static boolean iAmClosed; - private static String textToSave=""; - public Text getText() { - return text; - } - - protected NsharpShowTextDialog(Shell parentShell) throws VizException { - super(parentShell); - this.setShellStyle(SWT.TITLE | SWT.MODELESS | SWT.CLOSE ); - shell = parentShell; - // TODO Auto-generated constructor stub - } - - private void createShowtextDialogContents(Composite parent){ - textGp = new Group(parent,SWT.SHADOW_OUT); - textGp.setLayout( new GridLayout() ); - textGp.setText("Sounding Text"); - GridData data = new GridData (SWT.FILL, SWT.FILL, true, true); - textGp.setLayoutData (data); - text = new Text(textGp, SWT.V_SCROLL| SWT.H_SCROLL); - - GridData data1 = new GridData (SWT.FILL,SWT.FILL, true, true); - text.setLayoutData (data1); - text.setEditable(false); - Font font = text.getFont(); - FontData[] fontData = font.getFontData(); - for (int i = 0; i < fontData.length; i++) { - fontData[i].setHeight(12); - fontData[i].setName("courier"); - } - newFont = new Font(font.getDevice(), fontData); - text.setFont(newFont); - - } - - /*private String createDefaultSaveFileName() { - StringTokenizer st = new StringTokenizer(text.getText()); - int i =0; - String fileName; - if(st.hasMoreTokens()== true){ - fileName = ""; - //text header are the first 2,3,4 tokens. use them as default file name - while (st.hasMoreTokens()) { - i++; - String tok = st.nextToken(); - //System.out.println("tok "+ i + " ="+ tok); - if(i==1) - continue; - if(i > 4){ - break; - } - - if(i ==4) { - if(tok.length() >= 5) - tok = " " + tok.substring(0, 5); - else - tok = " " + tok; - } - fileName = fileName + tok; - - } - fileName = fileName + ".nsp"; - } - else - fileName= "nsharp.nsp"; - - return fileName; - }*/ - @Override - public void createButtonsForButtonBar(Composite parent) { - // create buttons with "CLOSE" label but with cancel function - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CLOSE_LABEL, false); - - // Push buttons for SAVE - Button saveBtn = createButton(parent, IDialogConstants.CLIENT_ID, - "SAVE", false); - saveBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - // Action to save text report - NsharpSaveHandle.saveFile(shell); - /*FileDialog dlg = new FileDialog(shell, SWT.SAVE); - String fileName = null; - - // The user has finished when one of the - // following happens: - // 1) The user dismisses the dialog by pressing Cancel - // 2) The selected file name does not exist - // 3) The user agrees to overwrite existing file - boolean done = false; - boolean saveFile = false; - while (!done) { - // Open the File Dialog - dlg.setText("Save"); - String[] filterExt = {"*.nsp"}; - dlg.setFilterExtensions(filterExt); - dlg.setFileName(createDefaultSaveFileName()); - fileName = dlg.open(); - //System.out.println("file name = "+ fileName); - if (fileName == null) { - // User has cancelled, so quit and return - done = true; - } else { - // User has selected a file; see if it already exists - File file = new File(fileName); - if (file.exists()) { - // The file already exists; asks for confirmation - MessageBox mb = new MessageBox(dlg.getParent(), SWT.ICON_WARNING - | SWT.YES | SWT.NO); - - // We really should read this string from a - // resource bundle - mb.setMessage(fileName + " already exists. Do you want to replace it?"); - - // If they click Yes, we're done and we drop out. If - // they click No, we redisplay the File Dialog - done = mb.open() == SWT.YES; - if(done == true) - saveFile = true; - } else { - // File does not exist, so drop out - done = true; - saveFile = true; - } - } - } - if(saveFile == true) { - try{ - // Create file - FileWriter fstream = new FileWriter(fileName); - BufferedWriter out = new BufferedWriter(fstream); - out.write(textToSave); - //Close the output stream - out.close(); - }catch (Exception e){//Catch exception if any - System.err.println("Error: " + e.getMessage()); - } - }*/ - } - } ); - } - /** - * Creates the dialog area - */ - @Override - public Control createDialogArea(Composite parent) { - - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 13; - mainLayout.marginWidth = 13; - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createShowtextDialogContents(top); - - refreshTextData(); - return top; - } - - //@Override - public int open() { - //System.out.println("ShowText Dialog opened"); - - if ( this.getShell() == null ){ - this.create(); - } - this.getShell().setLocation(this.getShell().getParent().getLocation().x+700, - this.getShell().getParent().getLocation().y+200); - - iAmClosed = false; - return super.open(); - - } - @Override - public boolean close() { - - //System.out.println("ShowText close called"); - iAmClosed = true; - if(newFont!= null){ - newFont.dispose(); - newFont=null; - } - return (super.close()); - } - public static NsharpShowTextDialog getInstance( Shell parShell){ - - if ( INSTANCE == null ){ - try { - INSTANCE = new NsharpShowTextDialog( parShell ); - //System.out.println("new showtext dialog INSTANCE created"); - } catch (VizException e) { - e.printStackTrace(); - } - - } - else { - //System.out.println("current showtext dialog INSTANCE returned!"); - } - - return INSTANCE; - - } - public static NsharpShowTextDialog getAccess() { - if(iAmClosed == true) - return null; - - return INSTANCE; - } - public static NsharpShowTextDialog getAccess(boolean force) { - if(force == true) - return INSTANCE; - else - return getAccess(); - } - - public void refreshTextData() { - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - - - if(rsc!=null && rsc.getSoundingLys()!= null && !text.isDisposed() && text!=null){ - String hdr; - List soundLyList = rsc.getSoundingLys(); - hdr = "PRESSURE HGHT\t TEMP\t DWPT WDIR WSPD OMEG\n"; - String latlonstr; - NsharpStationInfo stnInfo=rsc.getPickedStnInfo(); - if( stnInfo!= null){ - latlonstr = " LAT=" + stnInfo.getLatitude() + " LON="+ stnInfo.getLongitude(); - } - else { - latlonstr = " LAT= LON= "; - } - String textToShow = rsc.getPickedStnInfo().getSndType() +" "+rsc.getPickedStnInfoStr() + latlonstr+ "\n" + hdr; - textToSave = rsc.getPickedStnInfo().getSndType() +" "+rsc.getPickedStnInfoStr() + latlonstr + "\n" + hdr; - String tempText="", tempSaveText=""; - for (NcSoundingLayer layer: soundLyList){ - tempText = String.format("%7.2f\t%8.2f %7.2f %7.2f %6.2f %6.2f %9.6f\n", layer.getPressure(), - layer.getGeoHeight(),layer.getTemperature(),layer.getDewpoint(), layer.getWindDirection(), - layer.getWindSpeed(), layer.getOmega()); - tempSaveText = String.format("%f %f %f %f %f %f %f\n", layer.getPressure(), - layer.getGeoHeight(),layer.getTemperature(),layer.getDewpoint(), layer.getWindDirection(), - layer.getWindSpeed(), layer.getOmega()); - textToShow = textToShow + tempText; - textToSave = textToSave + tempSaveText; - } - - text.setText(textToShow); - - //System.out.println(textToShow); - textGp.layout(); - } - } - - - //Need use asyncExec to handle update text request from other thread (worker thread) - public void updateTextFromWorkerThread(){ - try{ - Display.getDefault().asyncExec(new Runnable(){ - public void run(){ - refreshTextData(); - } - }); - }catch(SWTException e){ - System.out.println("updateTextFromWorkerThread: can not run asyncExec()"); - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpStnConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpStnConfigDialog.java deleted file mode 100644 index 93fb14e100..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpStnConfigDialog.java +++ /dev/null @@ -1,188 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpStnConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 04/23/2012	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; - -public class NsharpStnConfigDialog extends Dialog { - private static NsharpStnConfigDialog INSTANCE = null; - private org.eclipse.swt.widgets.List stnList; - private List selectedStnList = new ArrayList(); - protected Composite top; - protected NsharpStnConfigDialog(Shell parentShell) { - super(parentShell); - } - public static NsharpStnConfigDialog getInstance( Shell parShell){ - - if ( INSTANCE == null ){ - INSTANCE = new NsharpStnConfigDialog( parShell ); - - } - return INSTANCE; - - } - - @Override - public int open() { - return super.open(); - } - @Override - public boolean close() { - - if(stnList!=null){ - stnList.removeListener(SWT.Selection, stnList.getListeners(SWT.Selection)[0]); - stnList.dispose(); - stnList = null; - } - if(selectedStnList!= null){ - selectedStnList.clear(); - selectedStnList = null; - } - INSTANCE = null; - return super.close(); - } - - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Station Configuration" ); - } - @Override - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); - - } - - - @Override - protected Control createDialogArea(Composite parent) { - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDiaContents(top); - - return top; - } - - - private void createDiaContents(Composite parent) { - //create file widget list - Group stnListGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - stnList = new org.eclipse.swt.widgets.List(stnListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - stnList.setBounds(0,0, 2*NsharpConstants.listWidth, NsharpConstants.listHeight * 8); - createStnList(); - //create a selection listener to handle user's selection on list - stnList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (stnList.getSelectionCount() > 0 ) { - selectedStnList.clear(); - for(int i=0; i < stnList.getSelectionCount(); i++) { - selectedSndTime = stnList.getSelection()[i]; - //remove "--InActive" or "--Active" from string - selectedSndTime= selectedSndTime.substring(0, selectedSndTime.indexOf('-')); - selectedStnList.add(selectedSndTime); - } - - } - } - }); - - Group buttonGp = new Group(parent,SWT.SHADOW_OUT); - buttonGp.setLayout( new GridLayout(2, false) ); - - Button activateBtn = new Button(buttonGp, SWT.PUSH); - activateBtn.setText("Activate"); - activateBtn.setEnabled( true ); - activateBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - rsc.handleStationActConfig(selectedStnList, NsharpConstants.State.ACTIVE); - selectedStnList.clear(); - close(); - } - - } ); - Button deactivateBtn = new Button(buttonGp, SWT.PUSH); - deactivateBtn.setText("DeActivate"); - deactivateBtn.setEnabled( true ); - deactivateBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("Unload Selected"); - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - rsc.handleStationActConfig(selectedStnList, NsharpConstants.State.INACTIVE); - selectedStnList.clear(); - close(); - } - } ); - } - private boolean checkLoadedRsc() { - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor == null) { - return false; - } - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor() - .getSkewtResource(); - if (rsc == null) { - return false; - } - return true; - } - private void createStnList(){ - if(checkLoadedRsc()== false) - return; - //after checking, rsc is not null guaranteed. - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - List stnStList = rsc.getStnStateList(); - for(NsharpStationStateProperty stn: stnStList){ - String s; - if(stn.getStnState() == NsharpConstants.State.INACTIVE) - s = "--(InActive)"; - else - s="--(Active)"; - stnList.add(stn.getStnDescription() +s); - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpTimeLineConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpTimeLineConfigDialog.java deleted file mode 100644 index d94902ef85..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/palette/NsharpTimeLineConfigDialog.java +++ /dev/null @@ -1,188 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.palette; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.palette.NsharpTimeLineConfigDialog - * - * - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 04/23/2012	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpTimeLineStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; - -public class NsharpTimeLineConfigDialog extends Dialog { - private static NsharpTimeLineConfigDialog INSTANCE = null; - private org.eclipse.swt.widgets.List timeLineList; - private List selectedTimeList = new ArrayList(); - protected Composite top; - protected NsharpTimeLineConfigDialog(Shell parentShell) { - super(parentShell); - } - public static NsharpTimeLineConfigDialog getInstance( Shell parShell){ - - if ( INSTANCE == null ){ - INSTANCE = new NsharpTimeLineConfigDialog( parShell ); //System.out.println("new unload dialog INSTANCE created"); - - } - return INSTANCE; - - } - - @Override - public int open() { - return super.open(); - } - @Override - public boolean close() { - - if(timeLineList!=null){ - timeLineList.removeListener(SWT.Selection, timeLineList.getListeners(SWT.Selection)[0]); - timeLineList.dispose(); - timeLineList = null; - } - if(selectedTimeList!= null){ - selectedTimeList.clear(); - selectedTimeList = null; - } - INSTANCE = null; - return super.close(); - } - - @Override - protected void configureShell( Shell shell ) { - super.configureShell( shell ); - shell.setText( "Time Line Configuration" ); - } - @Override - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.CANCEL_ID, - IDialogConstants.CANCEL_LABEL, false); - - } - - - @Override - protected Control createDialogArea(Composite parent) { - top = (Composite) super.createDialogArea(parent); - - // Create the main layout for the shell. - GridLayout mainLayout = new GridLayout(1, false); - mainLayout.marginHeight = 3; - mainLayout.marginWidth = 3; - - top.setLayout(mainLayout); - - // Initialize all of the menus, controls, and layouts - createDiaContents(top); - - return top; - } - - - private void createDiaContents(Composite parent) { - //create file widget list - Group sndTimeListGp = new Group(parent,SWT.SHADOW_ETCHED_IN); - timeLineList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); - timeLineList.setBounds(0,0, 2*NsharpConstants.listWidth, NsharpConstants.listHeight * 8); - createSndList(); - //create a selection listener to handle user's selection on list - timeLineList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; - public void handleEvent (Event e) { - if (timeLineList.getSelectionCount() > 0 ) { - selectedTimeList.clear(); - for(int i=0; i < timeLineList.getSelectionCount(); i++) { - selectedSndTime = timeLineList.getSelection()[i]; - //remove "--InActive" or "--Active" - selectedSndTime= selectedSndTime.substring(0, selectedSndTime.indexOf('-')); - selectedTimeList.add(selectedSndTime); - } - - } - } - }); - - Group buttonGp = new Group(parent,SWT.SHADOW_OUT); - buttonGp.setLayout( new GridLayout(2, false) ); - - Button activateBtn = new Button(buttonGp, SWT.PUSH); - activateBtn.setText("Activate"); - activateBtn.setEnabled( true ); - activateBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - rsc.handleTimeLineActConfig(selectedTimeList, NsharpConstants.State.ACTIVE); - selectedTimeList.clear(); - close(); - } - - } ); - Button deactivateBtn = new Button(buttonGp, SWT.PUSH); - deactivateBtn.setText("DeActivate"); - deactivateBtn.setEnabled( true ); - deactivateBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - //System.out.println("Unload Selected"); - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - rsc.handleTimeLineActConfig(selectedTimeList, NsharpConstants.State.INACTIVE); - selectedTimeList.clear(); - close(); - } - } ); - } - private boolean checkLoadedRsc() { - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor == null) { - return false; - } - NsharpSkewTResource rsc = editor.getNsharpSkewTDescriptor() - .getSkewtResource(); - if (rsc == null) { - return false; - } - return true; - } - private void createSndList(){ - if(checkLoadedRsc()== false) - return; - //after checking, rsc is not null guaranteed. - NsharpSkewTResource rsc = NsharpSkewTEditor.getActiveNsharpEditor().getNsharpSkewTDescriptor().getSkewtResource(); - List tlList = rsc.getTimeLineStateList(); - for(NsharpTimeLineStateProperty tl: tlList){ - String s; - if(tl.getTimeState() == NsharpConstants.State.INACTIVE) - s = "--(InActive)"; - else - s="--(Active)"; - timeLineList.add(tl.getTimeDescription() +s); - } - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDescriptor.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDescriptor.java deleted file mode 100644 index 5b5afa7388..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDescriptor.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor - * - * This java class performs the NSHARP NsharpSkewTDescriptor functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 03/24/2011   R1G2-9      Chin Chen   migration
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt; - -import java.util.List; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpBackgroundResource; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; - -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.datastructure.LoopProperties; -import com.raytheon.viz.core.graphing.GraphDescriptor; -import com.raytheon.viz.ui.perspectives.VizPerspectiveListener; - -public class NsharpSkewTDescriptor extends GraphDescriptor { - public NsharpSkewTDescriptor() { - this(new PixelExtent(NsharpConstants.NSHARP_SkewTRectangle)); - } - - public NsharpSkewTDescriptor(PixelExtent pe) { - super(pe); - //System.out.println("NsharpSkewTDescriptor created " + this.toString()); - - } - - @Override - public void changeFrame(FrameChangeOperation operation, FrameChangeMode mode) { - synchronized (this) { - //From stepping commands - //System.out.println("changeFrame"); - NsharpSkewTResource skewRsc = getSkewtResource(); - if( VizPerspectiveListener.getCurrentPerspectiveManager()!= null){ - //System.out.println("current perspective ="+VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId()); - if(!VizPerspectiveListener.getCurrentPerspectiveManager().getPerspectiveId().equals(NmapCommon.NatlCntrsPerspectiveID)){ - if(mode != FrameChangeMode.TIME_AND_SPACE) - //Chin NOTE: for D2D perspective, it will call this function with mode of TIME_ONLY or SPACE_ONLY when Arrow Keys (up/down/left/right) - //hit by users. Since Nsharp implementation uses Arrow Keys for time line and station box operations, - //We have to disable this function when in D2D for Arrow keys. Otherwise, the following setSteppingTimeLine() function will - // be called 2 times when Arrow Keys hit in D2D. - //Therefore, only when TIME_AND_SPACE mode is allowed when in D2D. - return; - } - } - skewRsc.setSteppingTimeLine( operation, mode); - } - } - @SuppressWarnings("deprecation") - @Override - public void checkDrawTime(LoopProperties loopProperties) { - super.checkDrawTime(loopProperties); - //System.out.println("checkDrawTime"); - //handleDataTimeIndex is no longer available since 11.5 - //called from DrawCoordinatedPane - //Chin: 11.11 note: it is now called from NsharpSkewTDisplay.paint() when animation is started. - //System.out.println("NsharpSkewTDescriptor checkDrawTime called "); - if (loopProperties == null || getFrames() == null) { - //System.out.println("NsharpSkewTDescriptor checkDrawTime called but jump "); - return; - } - - if (loopProperties.isLooping() && loopProperties.isShouldDraw()) { - NsharpSkewTResource skewRsc = getSkewtResource(); - - skewRsc.setLoopingDataTimeLine(loopProperties); - //System.out.println("NsharpSkewTDescriptor handleDataTimeIndex handled!!!!!! "); - } - } - - public NsharpBackgroundResource getSkewTBkGResource() { - List list = resourceList - .getResourcesByTypeAsType(NsharpBackgroundResource.class); - if (list != null && !list.isEmpty()) { - return list.get(0); - } - return null; - } - - public NsharpSkewTResource getSkewtResource() { - List list = resourceList - .getResourcesByTypeAsType(NsharpSkewTResource.class); - if (list != null && !list.isEmpty()) { - return list.get(0); - } - return null; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDisplay.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDisplay.java deleted file mode 100644 index 4c4ab4c36f..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTDisplay.java +++ /dev/null @@ -1,251 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay - * - * This java class performs the NSHARP NsharpSkewTDisplay functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 03/24/2011   R1G2-9      Chin Chen   migration
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpBkgResourceData; -//import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpDataMagnifyResourceData; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResourceData; -import gov.noaa.nws.ncep.viz.common.EditorManager; - -import java.util.ArrayList; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.drawables.AbstractRenderableDisplay; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.ResourcePair; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.ResourceList; -import com.raytheon.uf.viz.core.rsc.ResourceProperties; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource.ResourceStatus; -import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; -import com.vividsolutions.jts.geom.GeometryFactory; - -public class NsharpSkewTDisplay extends AbstractRenderableDisplay { - public static GeometryFactory gf = new GeometryFactory(); - - //private PaintProperties paintProps = null; - - //private IGraphicsTarget target = null; - - //private NsharpBackgroundResource bkgRsc; - //private NsharpSkewTResource skewRsc; - private int editorNum =0; - - public int getEditorNum() { - return editorNum; - } - - public void setEditorNum(int editorNum) { - this.editorNum = editorNum; - //System.out.println("NsharpSkewTDisplay setEditorNnum " + editorNum ); - - } - - /** - * Constructor - * Chin: here to set whole Nsharp display area by setting PixelExtent's rect area. - * Adjust NsharpConstants.NSHARP_SkewTRectangle size will change nsharp display "visible" area. - */ - public NsharpSkewTDisplay() { - this(new PixelExtent(NsharpConstants.NSHARP_SkewTRectangle)); - } - private NsharpSkewTDisplay(PixelExtent pixelExtent) { - super(pixelExtent, new NsharpSkewTDescriptor(pixelExtent)); - //PixelExtent pext=(PixelExtent) this.getExtent(); - //System.out.println("w="+pext.getWidth()+ " h="+pext.getHeight()+ " Xmin="+pext.getMinX()+ " xMax="+pext.getMaxX()+ " Ymin="+pext.getMinY()+ " YMax="+pext.getMaxY()); - - } - /* Chin MERGE - public static NsharpSkewTDisplay getOrCreateSkewTDisplay (){ - //System.out.println("NsharpSkewTDisplay getOrCreateSkewTDisplay () called"); - if(display == null){ - display = new NsharpSkewTDisplay(); - } - return display; - } */ - - @Override - public void dispose() { - - int editorInstanceNum = EditorManager.getNumOfEditorInstance(editorNum); - //System.out.println("NsharpSkewTDisplay disposed editor num " + editorNum +" instance "+ editorInstanceNum); - if (this.descriptor != null && editorInstanceNum <= 1) { - super.dispose(); - } - } - /*Chin MERGE moved this to customizeResourceList - @Override - public void setDescriptor(IDescriptor desc) { - super.setDescriptor(desc); - bkgRsc = NsharpBackgroundResource.getOrCreateSkewTBkGResource(); - ResourceProperties props = new ResourceProperties(); - props.setVisible(true); - props.setMapLayer(true); - ResourcePair rp = new ResourcePair(); - rp.setResource(bkgRsc); - rp.setProperties(props); - rp.setLoadProperties(bkgRsc.getLoadProperties()); - desc.getResourceList().add(rp); - - skewRsc = NsharpSkewTResource.getOrCreateSkewtResource(); - ResourceProperties props1 = new ResourceProperties(); - props1.setVisible(true); - props1.setMapLayer(true); - ResourcePair rp1 = new ResourcePair(); - rp1.setResource(skewRsc); - rp1.setProperties(props1); - rp1.setLoadProperties(skewRsc.getLoadProperties()); - desc.getResourceList().add(rp1); - skewRsc.setDesc((NsharpSkewTDescriptor)desc); - - }*/ - //Chin MERGE added - @Override - public NsharpSkewTDescriptor getDescriptor() { - return (NsharpSkewTDescriptor) super.getDescriptor(); - } - - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - super.paint(target, paintProps); - - //this.target = target; - //this.paintProps = paintProps; - - //Chin:: 11.5 changes, DrawCoordinatedPane() will call checkDrawTime(), - // so we dont have to call it from here. - //Chin: 11.11 change: however, DrawCoordinatedPane() does not call checkDrawTime() any more - // since 11.11. So, to make looping work, we call it from here AGAIN. Any other good work from Raytheon. - descriptor.checkDrawTime(paintProps.getLoopProperties()); - - drawTheData(target, paintProps); - } - - /** - * Draws the data on the screen. - * - * @throws VizException - */ - protected void drawTheData(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - ArrayList resourceList = new ArrayList( - descriptor.getResourceList()); - - PaintProperties myProps = new PaintProperties(paintProps); - for (ResourcePair pair : resourceList) { - if (pair.getProperties().isVisible()) { - AbstractVizResource rsc = pair.getResource(); - if ((rsc != null) && (rsc.getStatus()!= ResourceStatus.DISPOSED)) { - myProps = calcPaintDataTime(myProps, rsc); - rsc.paint(target, myProps); - } - } - } - } - public GeometryFactory getGeometry() { - return gf; - } - - // public IGraphicsTarget getTarget() { - // return target; - //} - - //public PaintProperties getPaintProperties() { - // return paintProps; - //} - - - @Override - protected void customizeResourceList(ResourceList resourceList) { - // get a resource Data. - AbstractResourceData resourceData = new NsharpSkewTResourceData(); - // get a load properties - LoadProperties loadProperties = new LoadProperties(); - ColorableCapability colorableCapability = new ColorableCapability(); - colorableCapability.setColor(NsharpConstants.backgroundColor); - loadProperties.getCapabilities().addCapability(colorableCapability); - // get some resource properties - ResourceProperties resourceProperties = new ResourceProperties(); - resourceProperties.setVisible(true); - resourceProperties.setMapLayer(true); - resourceProperties.setSystemResource(true); - // Make a resource pair - ResourcePair resourcePair = new ResourcePair(); - resourcePair.setResourceData(resourceData); - resourcePair.setLoadProperties(loadProperties); - resourcePair.setProperties(resourceProperties); - // add it to the resource list. - resourceList.add(resourcePair); - - // Next add a background resource - - // get a resource Data. - resourceData = new NsharpBkgResourceData(getDescriptor()); - // get a load properties - loadProperties = new LoadProperties(); - colorableCapability = new ColorableCapability(); - colorableCapability.setColor(NsharpConstants.backgroundColor); - loadProperties.getCapabilities().addCapability(colorableCapability); - // get some resource properties - resourceProperties = new ResourceProperties(); - resourceProperties.setVisible(true); - resourceProperties.setMapLayer(true); - resourceProperties.setSystemResource(true); - // Make a resource pair - resourcePair = new ResourcePair(); - resourcePair.setResourceData(resourceData); - resourcePair.setLoadProperties(loadProperties); - resourcePair.setProperties(resourceProperties); - // add it to the resource list. - resourceList.add(resourcePair); - - - //magnifying glass test - /* - // get a resource Data. - resourceData = new NsharpDataMagnifyResourceData(); - // get a load properties - loadProperties = new LoadProperties(); - colorableCapability = new ColorableCapability(); - colorableCapability.setColor(NsharpConstants.backgroundColor); - loadProperties.getCapabilities().addCapability(colorableCapability); - // get some resource properties - resourceProperties = new ResourceProperties(); - resourceProperties.setVisible(true); - resourceProperties.setMapLayer(true); - resourceProperties.setSystemResource(true); - // Make a resource pair - resourcePair = new ResourcePair(); - resourcePair.setResourceData(resourceData); - resourcePair.setLoadProperties(loadProperties); - resourcePair.setProperties(resourceProperties); - // add it to the resource list. - resourceList.add(resourcePair); - */ - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTEditor.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTEditor.java deleted file mode 100644 index 5fac68b0a9..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/NsharpSkewTEditor.java +++ /dev/null @@ -1,531 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor - * - * This java class performs the NSHARP NsharpSkewTEditor functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 										Reused some software from com.raytheon.viz.skewt
- * 03/24/2011   R1G2-9      Chin Chen   migration
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt; - - -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTMouseHandler; -import gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource; -import gov.noaa.nws.ncep.viz.common.AbstractNcEditor; -import gov.noaa.nws.ncep.viz.common.EditorManager; -import gov.noaa.nws.ncep.viz.ui.display.NCLoopProperties; -import org.eclipse.core.runtime.Status; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorReference; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.IDisplayPane; -import com.raytheon.uf.viz.core.datastructure.LoopProperties; -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.drawables.ResourcePair; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.IInputHandler; -import com.raytheon.uf.viz.core.rsc.ResourceList.AddListener; -import com.raytheon.uf.viz.core.rsc.ResourceList.RemoveListener; -import com.raytheon.viz.ui.EditorUtil; -import com.raytheon.viz.ui.UiPlugin; -import com.raytheon.viz.ui.editor.AbstractEditor; -import com.raytheon.viz.ui.editor.EditorInput; -import com.raytheon.viz.ui.input.InputManager; -import com.raytheon.viz.ui.panes.PaneManager; -import com.raytheon.viz.ui.panes.VizDisplayPane; -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpSkewTEditor extends AbstractEditor implements AddListener, - RemoveListener, AbstractNcEditor { - - public static final String EDITOR_ID = "gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor"; - private int editorNum=0; - - - public int getEditorNum() { - return editorNum; - } - - - - /** The map input manager */ - protected InputManager inputManager; - - /** The activated context, else null if not activated. */ - //protected IContextActivation contextActivation; - - private NsharpSkewTMouseHandler mouseHandler = null; - - - //private List rscList = new ArrayList(); - private static NsharpSkewTEditor instance=null; - - protected VizDisplayPane displayPane[]= new VizDisplayPane[1]; - - public static NsharpSkewTEditor getActiveNsharpEditor() { - // bsteffen instead of getting the static instance try to find an editor in the window - IEditorPart ep = EditorUtil.getActiveEditor(); - if (ep instanceof NsharpSkewTEditor) { - //System.out.println("getActiveNsharpEditor return ep from EditorUtil.getActiveEditor()"); - return (NsharpSkewTEditor) ep; - } - - // It might be desirable to stop here so that we only have an "active" - // editor if it really is active. - if(PlatformUI.getWorkbench()== null || PlatformUI.getWorkbench() - .getActiveWorkbenchWindow() == null) - return null; - IWorkbenchPage activePage = PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage(); - IEditorReference[] references = new IEditorReference[0]; - if (activePage != null) { - references = activePage.getEditorReferences(); - } - - - for (IEditorReference ref : references) { - ep = ref.getEditor(false); - if (ep instanceof NsharpSkewTEditor) { - //System.out.println("getActiveNsharpEditor return ep from IEditorReference.getEditor"); - return (NsharpSkewTEditor) ep; - } - } - return null; - }/* testing - public static NsharpSkewTEditor getActiveNsharpEditor() { - if (instance != null) { - System.out.println("getActiveNsharpEditor return existing editor "); - //PlatformUI.getWorkbench().getActiveWorkbenchWindow() - // .getActivePage().bringToTop(instance); - return instance; - } else { - try { - EditorInput edInput = new EditorInput(new NCLoopProperties(), - new NsharpSkewTDisplay()); - System.out.println("getActiveNsharpEditor creating new one"); - instance = (NsharpSkewTEditor) PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage() - .openEditor(edInput, EDITOR_ID); - return instance; - } catch (PartInitException e) { - UiPlugin.getDefault() - .getLog() - .log(new Status(Status.ERROR, UiPlugin.PLUGIN_ID, - "Error constituting NsharpSkewTeditor", e)); - } - } - return null; - }*/ - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets - * .Composite) - */ - @Override - public void createPartControl(Composite comp) { - //System.out.println("nsharpSkewTEditor createPartControl called"); - Composite baseComposite = new Composite(comp, SWT.NONE); - baseComposite - .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - final GridLayout mainGL = new GridLayout(1, true); - mainGL.horizontalSpacing = 0; - mainGL.marginHeight = 0; - baseComposite.setLayout(mainGL); - - - // drawing composite - Composite drawingComposite = new Composite(baseComposite, SWT.NONE); - drawingComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - GridLayout drawGL = new GridLayout(1, true); - drawGL.marginWidth = 0; - drawGL.marginHeight = 0; - drawGL.horizontalSpacing = 0; - drawingComposite.setLayout(drawGL); - /*GridLayout gl = new GridLayout(1, true); - gl.horizontalSpacing = 3; - gl.verticalSpacing = 3; - gl.marginHeight = 0; - gl.marginWidth = 0;*/ - - try { - if (displayPane[0] == null ) { - displayPane[0] = new VizDisplayPane(this, drawingComposite, - displaysToLoad[0]); - //displayPane[0].setAdjustExtent(false); - inputManager = new InputManager(this); - registerHandlers(displayPane[0]); - displayPane[0].setRenderableDisplay(displaysToLoad[0]); - registerListener(displayPane[0]); - - } - } - - catch (Exception e) { - final String errMsg = "Error setting up NsharpSkewTEditor"; - UFStatus.getHandler().handle(Priority.SIGNIFICANT, errMsg, e); - } - /*Button browse = new Button(drawingComposite, SWT.PUSH); - browse.setText("Browse..."); - GridData gridData = new GridData(GridData.FILL, GridData.CENTER, true, false); - gridData.horizontalIndent = 5; - browse.setLayoutData(gridData); - - Label label = new Label(drawingComposite, SWT.NONE); - label.setText("Categories"); - label.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, true, false));*/ - - contributePerspectiveActions(); - - - } - - protected void registerHandlers(IDisplayPane pane) { - - // Enable the mouse inspect adapter - mouseHandler = new NsharpSkewTMouseHandler(this); - inputManager.registerMouseHandler(mouseHandler); - - pane.addListener(SWT.MouseUp, inputManager); - pane.addListener(SWT.MouseDown, inputManager); - pane.addListener(SWT.MouseMove, inputManager); - pane.addListener(SWT.MouseWheel, inputManager); - pane.addListener(SWT.MouseHover, inputManager); - pane.addListener(SWT.MenuDetect, inputManager); - pane.addListener(SWT.KeyUp, inputManager); - pane.addListener(SWT.KeyDown, inputManager); - - } - - - @Override - public void init(IEditorSite site, IEditorInput input) - throws PartInitException { - super.init(site, input); - EditorInput editorInput = (EditorInput) input; - if (input instanceof EditorInput) { - displaysToLoad = editorInput.getRenderableDisplays(); - } - System.out.println("SkewtEditor title " + this.getTitle() ); - if (editorNum == 0 ){ - editorNum = EditorManager.getEditorNumber(); - - } - else { - - } - // a new instance, do the registration - EditorManager.registerEditorNumber(editorNum); - this.setTabTitle(editorNum+"-NsharpSkewt"); - } - - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - getActiveDisplayPane().setFocus(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.part.WorkbenchPart#dispose() - */ - @Override - public void dispose() { - System.out.println("NsharpSkewTEditor disposed!! " ); - if (EditorManager.unregisterEditorNumber(editorNum) ==0 ){ - super.dispose(); - synchronized (this) { - if (mouseHandler != null && inputManager != null) { - //System.out.println("NsharpSkewTEditor disposed!! " + this + " mouseHandler "+ mouseHandler ); - mouseHandler.setEditor(null); - inputManager.unregisterMouseHandler(mouseHandler); - mouseHandler = null; - inputManager = null; - } - - editorNum=0; - } - } - try{ - IWorkbenchPage wpage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - IViewPart vpart = wpage.findView( "gov.noaa.nws.ncep.ui.nsharp" ); - wpage.hideView(vpart); - } - catch(Exception e){ - - } - - - } - - /** - * Perform a refresh asynchronously - * - */ - @Override - public void refresh() { - for (IDisplayPane pane : displayPane) { - pane.refresh(); - } - //System.out.println("NsharpSkewTEditor refresh called"); - } - @Override - public Coordinate translateClick(double x, double y) { - double[] grid = getActiveDisplayPane().screenToGrid(x, y, 0); - - return new Coordinate(grid[0], grid[1], grid[2]); - } - - @Override - public double[] translateInverseClick(Coordinate c) { - - if (Double.isNaN(c.z)) { - c.z = 0.0; - } - return getActiveDisplayPane().gridToScreen( - new double[] { c.x, c.y, c.z }); - } - - public void registerMouseHandler(IInputHandler handler, IInputHandler.InputPriority priority) { - inputManager.registerMouseHandler(handler, priority); - } - - /** - * Register a mouse handler to a map - * - * @param handler - * the handler to register - */ - @Override - public void registerMouseHandler(IInputHandler handler) { - inputManager.registerMouseHandler(handler); - } - - /** - * Unregister a mouse handler to a map - * - * @param handler - * the handler to unregister - */ - @Override - public void unregisterMouseHandler(IInputHandler handler) { - // already unregistered - if (inputManager != null) { - inputManager.unregisterMouseHandler(handler); - } - } - @Override - public IDisplayPane[] getDisplayPanes() { - //System.out.println("SkewtEditor getDisplayPanes called"); - return this.displayPane; - } - - - - /** - * Returns the mouse manager - * - * @return - */ - public InputManager getMouseManager() { - return inputManager; - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.editor.AbstractEditor#getActiveDisplayPane() - */ - @Override - public IDisplayPane getActiveDisplayPane() { - return this.displayPane[0]; - } - - /** - * Add the listenerList - * - * @param main - */ - private void registerListener(VizDisplayPane pane) { - synchronized (this) { - if (pane != null) { - try { - // add the Editor as a resource listener - pane.getRenderableDisplay().getDescriptor() - .getResourceList().addPostAddListener(this); - pane.getRenderableDisplay().getDescriptor() - .getResourceList().addPostRemoveListener(this); - } catch (Exception e) { - UFStatus.getHandler() - .handle( - Priority.PROBLEM, - "Error recovering Resource, Can't add listenerList", - e); - } - } - } - } - - @Override - public void notifyAdd(ResourcePair rp) throws VizException { - if (rp.getResource() instanceof NsharpSkewTResource) { - //NsharpSkewTResource rsc = (NsharpSkewTResource) rp.getResource(); - //rscList.add(rsc); - } - } - - @Override - public void notifyRemove(ResourcePair rp) throws VizException { - // - } - - /** - * Add a resource listener on first pane - * - * @param SkewTResource - */ - public void addResource(NsharpSkewTResource str) { - if (str != null) { - displayPane[0].getRenderableDisplay().getDescriptor() - .getResourceList().add(str); - } - } - - - - @Override - public NCLoopProperties getLoopProperties(){ - // bsteffen added check for type and force it to NCLoopProperties - LoopProperties loopProperties = this.editorInput.getLoopProperties(); - if(!(loopProperties instanceof NCLoopProperties)) { - this.editorInput.setLoopProperties(new NCLoopProperties()); - } - return (NCLoopProperties)this.editorInput.getLoopProperties(); - } - - @Override - protected PaneManager getNewPaneManager() { - - return null; - } - public NsharpSkewTDescriptor getNsharpSkewTDescriptor() { - IDescriptor desc = getActiveDisplayPane().getDescriptor(); - if (desc instanceof NsharpSkewTDescriptor) { - return (NsharpSkewTDescriptor) desc; - } - return null; - } - - public static NsharpSkewTEditor createOrOpenSkewTEditor( ) { - NsharpSkewTEditor editor = getActiveNsharpEditor(); - if (editor != null) { - System.out.println("createOrOpenSkewTEditor return editor from getActiveNsharpEditor"); - //PlatformUI.getWorkbench().getActiveWorkbenchWindow() - // .getActivePage().bringToTop(editor); - return editor; - } else { - try { - EditorInput edInput = new EditorInput(new NCLoopProperties(), - new NsharpSkewTDisplay()); - //System.out.println("createOrOpenSkewTEditor creating new one"); - return (NsharpSkewTEditor) PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage() - .openEditor(edInput, EDITOR_ID); - } catch (PartInitException e) { - UiPlugin.getDefault() - .getLog() - .log(new Status(Status.ERROR, UiPlugin.PLUGIN_ID, - "Error constituting NsharpSkewTeditor", e)); - } - } - return null; - }/* testing - public static NsharpSkewTEditor createOrOpenSkewTEditor( ) { - //NsharpSkewTEditor editor = getActiveNsharpEditor(); - if (instance != null) { - System.out.println("createOrOpenSkewTEditor return existed editor "); - //PlatformUI.getWorkbench().getActiveWorkbenchWindow() - // .getActivePage().bringToTop(instance); - return instance; - } else { - try { - EditorInput edInput = new EditorInput(new NCLoopProperties(), - new NsharpSkewTDisplay()); - System.out.println("createOrOpenSkewTEditor creating new one"); - instance = (NsharpSkewTEditor) PlatformUI.getWorkbench() - .getActiveWorkbenchWindow().getActivePage() - .openEditor(edInput, EDITOR_ID); - return instance; - } catch (PartInitException e) { - UiPlugin.getDefault() - .getLog() - .log(new Status(Status.ERROR, UiPlugin.PLUGIN_ID, - "Error constituting NsharpSkewTeditor", e)); - } - } - return null; - }*/ - public static void bringSkewTEditorToTop( ) { - NsharpSkewTEditor editor = getActiveNsharpEditor(); - if (editor != null) { - PlatformUI.getWorkbench().getActiveWorkbenchWindow() - .getActivePage().bringToTop(editor); - - } - } - public void refreshGUIElements() { - ICommandService service = (ICommandService) getSite().getService( - ICommandService.class); - String[] guiUpdateElementCommands = { - // "gov.noaa.nws.ncep.viz.tools.pan", - "gov.noaa.nws.ncep.viz.ui.options.SyncPanes", - "gov.noaa.nws.ncep.viz.ui.actions.loopBackward", - "gov.noaa.nws.ncep.viz.ui.actions.loopForward", - "gov.noaa.nws.ncep.viz.ui.actions.rock", - "gov.noaa.nws.ncep.viz.ui.actions.frameTool", - "gov.noaa.nws.ncep.viz.ui.autoUpdate", - "gov.noaa.nws.ncep.viz.ui.actions.hideFrames" }; - - // Update the GUI elements on the menus and toolbars - for (String toolbarID : guiUpdateElementCommands) { - service.refreshElements(toolbarID, null); - } - - } - -} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpAbstractBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpAbstractBackground.java deleted file mode 100644 index c065f95905..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpAbstractBackground.java +++ /dev/null @@ -1,133 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpAbstractSkewTBackground - * - * This java class performs the NSHARP NsharpAbstractSkewTBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; - -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.drawables.IFont; -import com.raytheon.uf.viz.core.drawables.IRenderable; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.WGraphics; -import com.vividsolutions.jts.geom.Coordinate; - -public abstract class NsharpAbstractBackground implements IRenderable { - protected Rectangle rectangle; - - protected WGraphics world; - protected IGraphicsTarget target; - protected IFont smallFont=null; - //private double currentZoomLevel=1; - //private int currentFontSize= 10; - - - public void setCurrentFont(float currentFontSize) { - //this.currentFontSize = currentFontSize; - if(smallFont!=null){ - smallFont.dispose(); - } - if(target==null) - return; - smallFont = target.initializeFont( - target.getDefaultFont().getFontName(), currentFontSize, null); - } - - - public void magnifyFont(double currentZoomLevel) { - //this.currentZoomLevel = currentZoomLevel; - - float magFactor = 1.0f / (float)currentZoomLevel; - if(smallFont!= null) - smallFont.setMagnification(magFactor); - - } - - - /** - * Find a point on the background - * - * @param c - * @return - */ - public boolean contains(Coordinate c) { - return this.rectangle.contains((int) c.x, (int) c.y); - } - - public NsharpAbstractBackground() { - super(); - - } - - public Rectangle getRectangle() { - return this.rectangle; - } - - public WGraphics getWorld() { - return this.world; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.drawables.IRenderable#paint(com.raytheon.uf. - * viz.core.IGraphicsTarget, - * com.raytheon.uf.viz.core.drawables.PaintProperties) - */ - @Override - public void paint(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - /*double zoomLevel = paintProps.getZoomLevel(); - if(zoomLevel != currentZoomLevel){ - float magFactor = 1.0f / (float)zoomLevel; - if(smallFont!= null) - smallFont.setMagnification(magFactor); - }*/ - paintInternal(target, paintProps); - - - } - public synchronized void initInternal(IGraphicsTarget target){ - this.target = target; - smallFont = target.initializeFont( - target.getDefaultFont().getFontName(), 10, null); - } - protected void paintInternal(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - PixelExtent pixExt = new PixelExtent(this.rectangle); - target.setupClippingPlane(pixExt); - - target.drawRect(pixExt, NsharpConstants.backgroundColor, 1.0f, 1.0f); - - target.clearClippingPlane(); - - } - protected void disposeInternal(){ - if(smallFont != null) - smallFont.dispose(); - } - - - protected abstract WGraphics computeWorld(); -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpHodoBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpHodoBackground.java deleted file mode 100644 index 4557fbed50..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpHodoBackground.java +++ /dev/null @@ -1,231 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpHodoBackground - * - * This java class performs the NSHARP NsharpHodoBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 										Reused some software from com.raytheon.viz.skewt.ui
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.common.sounding.WxMath; -import com.raytheon.viz.core.graphing.WGraphics; -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpHodoBackground extends NsharpAbstractBackground { - private PixelExtent pixExt; - private IWireframeShape hodoShape=null; - private NsharpSkewTDescriptor desc; - /** - * Public constructor - * - * @param target - * @param world - * @param paintProps - * @throws VizException - */ - public NsharpHodoBackground(NsharpSkewTDescriptor desc) { - super(); - this.rectangle = new Rectangle(NsharpConstants.HODO_REC_X_ORIG, NsharpConstants.HODO_REC_Y_ORIG, - NsharpConstants.HODO_REC_WIDTH, NsharpConstants.HODO_REC_HEIGHT); - pixExt = new PixelExtent(this.rectangle); - world = new WGraphics(this.rectangle); - world.setWorldCoordinates(-70,70,70,-70);//(-50, 90, 90, -50); - - //System.out.println("NsharpHodoBackground constructed"); - this.desc = desc; - } - @Override - public void disposeInternal(){ - super.disposeInternal(); - if(hodoShape!=null) - hodoShape.dispose(); - } - @Override - public void initInternal(IGraphicsTarget target){ - super.initInternal(target); - //Create wireframe shape here - hodoShape = this.target.createWireframeShape(false,desc ); - if(hodoShape==null) - return; - hodoShape.allocate(7200); - Coordinate c = new Coordinate(world.mapX(0), world.mapY(0)); - // rings are offset to left of center of hodograph. - // in D2-D this is offset so the 45 knots ring touches the - // left side of the display and the 90 knots touches the right side of - // the display. We adjust our display to mimic this. - // draw the spokes. - //System.out.println("paintInternal Begin"); - for (double angle = 0; angle < 2 * Math.PI; angle += Math.PI / 2) { - double x = 200 * Math.cos(angle); - double y = 200 * Math.sin(angle); - /*target.drawLine(c.x, c.y, 0.0, world.mapX(x), world.mapY( - y), 0.0, NsharpConstants.degreeSpokeColor, 1, - LineStyle.DOTTED);*/ - double [][] lines = {{c.x, c.y},{world.mapX(x), world.mapY( - y)}}; - hodoShape.addLineSegment(lines); - //System.out.println("c.x="+ c.x + "C.Y="+c.y + " x= " + x + " y= " + y +" world.mapX(x)="+ getWorld().mapX(x)); - - } - // label the spokes for direction - /*double [] lblXy = {c.x,this.rectangle.y+25}; - hodoShape.addLabel("180", lblXy); - double [] lblXy1= { c.x,this.rectangle.y + this.rectangle.height}; - hodoShape.addLabel("360", lblXy1); - c = WxMath.uvComp(67, 90); - double [] lblXy2= { getWorld().mapX(c.x), getWorld().mapY(c.y)}; - hodoShape.addLabel("90", lblXy2); - c = WxMath.uvComp(65, 270); - double [] lblXy3= { getWorld().mapX(c.x), getWorld().mapY(c.y)}; - hodoShape.addLabel("270", lblXy3);*/ - // draw circles - for (int spd = 10; spd <= 100; spd += 10) { - - Coordinate c0, c1; - c0 = WxMath.uvComp(spd, 0); - for (int dir = 1; dir <= 360; dir += 1) { - c1 = WxMath.uvComp(spd, dir); - double [][] lines = {{getWorld().mapX(c0.x), getWorld().mapY(c0.y)},{getWorld().mapX(c1.x), getWorld().mapY(c1.y)}}; - hodoShape.addLineSegment(lines); - - c0 = c1; - } - //plot speed mark at 270 degree - Coordinate uv = WxMath.uvComp(spd, 270); - if (spd != 0) { - - double [] lblXys= { getWorld().mapX(uv.x), - getWorld().mapY(uv.y)}; - hodoShape.addLabel("" + spd, lblXys); - } - //plot speed mark at 90 degree - uv = WxMath.uvComp(spd, 90); - if (spd != 0) { - - double [] lblXys= { getWorld().mapX(uv.x), - getWorld().mapY(uv.y)}; - hodoShape.addLabel("" + spd, lblXys); - } - //plot speed mark at 180 degree - uv = WxMath.uvComp(spd, 180); - if (spd != 0) { - - double [] lblXys= { getWorld().mapX(uv.x), - getWorld().mapY(uv.y)}; - hodoShape.addLabel("" + spd, lblXys); - } - //plot speed mark at 360 degree - uv = WxMath.uvComp(spd, 360); - if (spd != 0) { - - double [] lblXys= { getWorld().mapX(uv.x), - getWorld().mapY(uv.y)}; - hodoShape.addLabel("" + spd, lblXys); - } - } - hodoShape.compile(); - } - - @Override - public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - target.setupClippingPlane(pixExt); - target.drawWireframeShape(hodoShape, NsharpConstants.backgroundColor, 1, LineStyle.SOLID,smallFont); - - target.drawRect(pixExt, NsharpConstants.backgroundColor, 1.0f, 1.0f); - - target.clearClippingPlane(); - - } - //this function is used for printing - public void paintForPrint( WGraphics world, GC gc){ - Coordinate c = new Coordinate(world.mapX(0), world.mapY(0)); - // label the spokes - gc.drawString( "180" + NsharpConstants.DEGREE_SYMBOL,(int) c.x, - (int) world.mapY(world.getWorldYmin())+5, false); - - gc.drawString( "360" + NsharpConstants.DEGREE_SYMBOL,(int) c.x, - (int) world.mapY(world.getWorldYmax())+1, false); - - gc.drawString( "270" + NsharpConstants.DEGREE_SYMBOL,(int) world.mapX(world.getWorldXmax())-20, - (int) c.y,false); - - gc.drawString( "90" + NsharpConstants.DEGREE_SYMBOL,(int) world.mapX(world.getWorldXmin())+5, - (int) c.y,false); - - - gc.setClipping((int)world.getViewXmin(), (int)world.getViewYmin(), - (int)world.getViewXmax()-(int)world.getViewXmin(), (int)world.getViewYmax()-(int)world.getViewYmin()); - gc.setLineWidth(1); - //System.out.println(" line width = "+gc.getLineWidth()); - // draw the spokes. - for (double angle = 0; angle < 2 * Math.PI; angle += Math.PI / 2) { - double x = 200 * Math.cos(angle); - double y = 200 * Math.sin(angle); - gc.drawLine((int)c.x, (int)c.y, (int)world.mapX(x), (int)world.mapY(y)); - //System.out.println("c.x="+ c.x + "C.Y="+c.y + " x= " + x + " y= " + y +" world.mapX(x)="+ world.mapX(x)); - - } - - // draw circles - gc.setLineStyle(SWT.LINE_DOT); - for (int spd = 10; spd <= 100; spd += 10) { - //Coordinate c1; - //c1 = WxMath.uvComp(spd, 0); - //System.out.println("c1.x="+ c1.x + "C1.Y="+c1.y +" world.mapX(c1.x)="+ world.mapX(c1.x)+" world.mapY(c1.y)="+ world.mapY(c1.y)); - int dist = (int)(world.mapX(spd)-c.x); - gc.drawOval((int)c.x-dist, (int)c.y-dist, 2* dist, 2* dist); - - if (spd%30 == 0) { - Coordinate uv = WxMath.uvComp(spd, 240); - - gc.drawString("" + spd, (int)world.mapX(uv.x), - (int)world.mapY(uv.y), false); - } - } - - - -} - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.skewt.ui.AbstractSkewTBackground#computeWorld() - */ - @Override - protected WGraphics computeWorld() { - - - //set coordinate from -50 to 90 knots on both x and y - - return world; - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpIcingBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpIcingBackground.java deleted file mode 100644 index 2cbb9a3404..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpIcingBackground.java +++ /dev/null @@ -1,183 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpIcingBackground - * - * This java class performs the NSHARP NsharpIcingBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 02/01/2012	TBD			Chin Chen	Initial coding
- * 										
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; - -import java.util.HashMap; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; - -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.drawables.IRenderable; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.WGraphics; - -public class NsharpIcingBackground extends NsharpAbstractBackground implements - IRenderable { - private NsharpSkewTDescriptor desc; - private PixelExtent pe; - private IWireframeShape linesNumbersShape; - private IWireframeShape RHLabelShape; - private IWireframeShape tempLabelShape; - private IWireframeShape EPILabelShape;//Equivalent Potential Instability - public NsharpIcingBackground(NsharpSkewTDescriptor desc) { - super(); - - this.rectangle = new Rectangle(NsharpConstants.ICING_REC_X_ORIG, NsharpConstants.ICING_REC_Y_ORIG, - NsharpConstants.ICING_REC_WIDTH, NsharpConstants.ICING_REC_HEIGHT); - pe = new PixelExtent(this.rectangle); - world = new WGraphics(this.rectangle); - - - //System.out.println("NsharpIcingBackground created"); - this.desc = desc; - } - public double toLogScale (double j) { - return(Math.log(j)/Math.log(1000)*1000); - } - public PixelExtent getPe() { - return pe; - } - @Override - protected WGraphics computeWorld() { - // TODO Auto-generated method stub - return null; - } - - @Override - public synchronized void initInternal(IGraphicsTarget target) { - // TODO Auto-generated method stub - super.initInternal(target); - String s = ""; - linesNumbersShape = target.createWireframeShape(false,desc ); - tempLabelShape = target.createWireframeShape(false,desc ); - RHLabelShape = target.createWireframeShape(false,desc ); - EPILabelShape = target.createWireframeShape(false,desc ); - linesNumbersShape.allocate(100); - tempLabelShape.allocate(20); - RHLabelShape.allocate(20); - EPILabelShape.allocate(4); - //set world based on pressure/RH - world.setWorldCoordinates(NsharpConstants.ICING_RELATIVE_HUMIDITY_LEFT, toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP), - NsharpConstants.ICING_RELATIVE_HUMIDITY_RIGHT, toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM)); - //pressure lines and labels - for (double i = NsharpConstants.ICING_PRESSURE_LEVEL_TOP; i <= NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM; i=i+ NsharpConstants.ICING_PRESSURE_LEVEL_INC) { - //Pressure lines - double [][] lines = {{NsharpConstants.ICING_REC_X_ORIG, world.mapY(toLogScale(i))},{NsharpConstants.ICING_VIEW_X_END, world.mapY(toLogScale(i))}}; - linesNumbersShape.addLineSegment(lines); - s = NsharpConstants.pressFormat.format(i); - //pressure labels - double [] lblXy = {NsharpConstants.ICING_REC_X_ORIG-30,world.mapY(toLogScale(i))+5}; - linesNumbersShape.addLabel(s, lblXy); - } - //RHLabel - double [] lblRhXy = {NsharpConstants.ICING_REC_X_ORIG+ 50, NsharpConstants.ICING_REC_Y_ORIG-50}; - RHLabelShape.addLabel("*****ICING Display*****", lblRhXy); - double [] lblRhXy1 = {NsharpConstants.ICING_REC_X_ORIG+ 500, NsharpConstants.ICING_REC_Y_ORIG-50}; - RHLabelShape.addLabel("RELATIVE HUMIDITY", lblRhXy1); - double [][] lineRH = {{0,0},{0,0}}; - RHLabelShape.addLineSegment(lineRH);//add dummy line - for (double i = NsharpConstants.ICING_RELATIVE_HUMIDITY_LEFT; i <= NsharpConstants.ICING_RELATIVE_HUMIDITY_RIGHT; i= i+NsharpConstants.ICING_RELATIVE_HUMIDITY_INC) { - // temperature/humidity vertical lines - double [][] lines = {{world.mapX(i), NsharpConstants.ICING_REC_Y_ORIG},{world.mapX(i), NsharpConstants.ICING_VIEW_Y_END}}; - linesNumbersShape.addLineSegment(lines); - //RH label - s = NsharpConstants.pressFormat.format(i); - double [] lblXy = {world.mapX(i), NsharpConstants.ICING_REC_Y_ORIG-20}; - RHLabelShape.addLabel(s, lblXy); - } - //temperature label - double [] lblTXy = {NsharpConstants.ICING_REC_X_ORIG+ 500, NsharpConstants.ICING_VIEW_Y_END+50}; - tempLabelShape.addLabel("TEMPERATURE (C)", lblTXy); - double [][] lineT = {{0,0},{0,0}}; - tempLabelShape.addLineSegment(lineT);//add dummy line - //set world based on pressure/twmp - world.setWorldCoordinates(NsharpConstants.ICING_TEMPERATURE_LEFT, toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP), - NsharpConstants.ICING_TEMPERATURE_RIGHT, toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM)); - for (double i = NsharpConstants.ICING_TEMPERATURE_LEFT; i <= NsharpConstants.ICING_TEMPERATURE_RIGHT; i= i+NsharpConstants.ICING_TEMPERATURE_INC) { - // temperature label - s = NsharpConstants.pressFormat.format(i); - double [] lblXy = {world.mapX(i), NsharpConstants.ICING_VIEW_Y_END+20}; - tempLabelShape.addLabel(s, lblXy); - } - //EPI label - double [] lblEPIXy = {NsharpConstants.ICING_REC_X_ORIG+ 500, NsharpConstants.ICING_VIEW_Y_END+75}; - EPILabelShape.addLabel("EQUIVALENT POTENTIAL INSTABILITY x 1E-3 K/m", lblEPIXy); - double [][] lineE = {{0,0},{0,0}}; - EPILabelShape.addLineSegment(lineE);//add dummy line - linesNumbersShape.compile(); - RHLabelShape.compile(); - tempLabelShape.compile(); - EPILabelShape.compile(); - } - - @Override - protected void paintInternal(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - // TODO Auto-generated method stub - //super.paintInternal(target, paintProps); - target.setupClippingPlane(pe); - target.drawRect(pe, NsharpConstants.backgroundColor, 1.0f, 1.0f); - target.clearClippingPlane(); - target.drawWireframeShape(linesNumbersShape, NsharpConstants.pressureColor, 1, LineStyle.SOLID,smallFont); - HashMap lpMap = this.desc.getSkewtResource().getLinePropertyMap(); - if(lpMap!=null){ - NsharpLineProperty lp =lpMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_RH]); - target.drawWireframeShape(RHLabelShape, lp.getLineColor(), 1, LineStyle.SOLID,smallFont); - lp =lpMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_TEMP]); - target.drawWireframeShape(tempLabelShape,lp.getLineColor(), 1, LineStyle.SOLID,smallFont); - lp =lpMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_EPI]); - target.drawWireframeShape(EPILabelShape, lp.getLineColor(), 1, LineStyle.SOLID,smallFont); - } - else { - target.drawWireframeShape(RHLabelShape, NsharpConstants.color_green, 1, LineStyle.SOLID,smallFont); - target.drawWireframeShape(tempLabelShape, NsharpConstants.color_red, 1, LineStyle.SOLID,smallFont); - target.drawWireframeShape(EPILabelShape, NsharpConstants.color_violet_red, 1, LineStyle.SOLID,smallFont); - } - - } - @Override - public void disposeInternal() { - // TODO Auto-generated method stub - super.disposeInternal(); - if(linesNumbersShape!= null){ - linesNumbersShape.dispose(); - } - if(RHLabelShape!= null){ - RHLabelShape.dispose(); - } - if(tempLabelShape!= null){ - tempLabelShape.dispose(); - } - if(EPILabelShape!= null){ - EPILabelShape.dispose(); - } - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpInsetBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpInsetBackground.java deleted file mode 100644 index 26d6956451..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpInsetBackground.java +++ /dev/null @@ -1,42 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpInsetBackground - * - * This java class performs the NSHARP NsharpInsetBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -import org.eclipse.swt.graphics.Rectangle; -import com.raytheon.viz.core.graphing.WGraphics; - -public class NsharpInsetBackground extends NsharpAbstractBackground { - - public NsharpInsetBackground(Rectangle rect) { - super(); - this.rectangle = rect; - world = new WGraphics(this.rectangle); - - world.setWorldCoordinates(rectangle.x,rectangle.y, - rectangle.x + rectangle.width, rectangle.y+rectangle.height); - - - } - @Override - protected WGraphics computeWorld() { - return world; - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpSkewTBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpSkewTBackground.java deleted file mode 100644 index 60c608c90d..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpSkewTBackground.java +++ /dev/null @@ -1,462 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpSkewTBackground - * - * This java class performs the NSHARP NsharpSkewTBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 									    Reused some software from com.raytheon.viz.skewt
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; - -import static java.lang.Math.pow; -import static java.lang.Math.signum; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpGraphProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpWxMath; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; - -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.edex.util.Equations; -import com.raytheon.edex.util.UAPoint; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.drawables.IRenderable; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.WGraphics; -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpSkewTBackground extends NsharpAbstractBackground implements - IRenderable { - private NsharpSkewTDescriptor desc; - private IWireframeShape mixRatioShape; - private IWireframeShape dryAdiabatsShape; - private IWireframeShape moistAdiabatsShape; - private IWireframeShape temperatureLineShape; - private IWireframeShape presslinesNumbersShape; - private IWireframeShape tempNumbersShape; - private float[]mixingRatios = - { .5f, 1, 2, 5, 10, 20/*, 50 */}; - - private static List> saturatedPoints = Equations - .getSaturatedAdiabats(1000, 100, 20, -60, 60, 5); - - private static List> dryPoints = getDryAdiabats( - 1000, 100, 10, -40, 273, 20); - - private static final double Rd = 0.2870586d; - private PixelExtent pe; - private NsharpGraphProperty graphConfigProperty; - private int tempOffset = 0; - public NsharpSkewTBackground(NsharpSkewTDescriptor desc) { - super(); - - this.rectangle = new Rectangle(NsharpConstants.SKEWT_REC_X_ORIG, NsharpConstants.SKEWT_REC_Y_ORIG, - NsharpConstants.SKEWT_REC_WIDTH, NsharpConstants.SKEWT_REC_HEIGHT); - //this.rectangle = new Rectangle(-700, 250, 690, 690); - //this.rectangle = new Rectangle(10,10, 690,690); - pe = new PixelExtent(this.rectangle); - world = new WGraphics(this.rectangle); - - world.setWorldCoordinates(NsharpConstants.left, NsharpConstants.top, - NsharpConstants.right, NsharpConstants.bottom); - //System.out.println("NsharpSkewTBackground created"); - this.desc = desc; - NsharpConfigManager configMgr = NsharpConfigManager.getInstance(); - graphConfigProperty = configMgr.retrieveNsharpConfigStoreFromFs().getGraphProperty(); - } - - - - private static double poisson(double startPressure, double stopPressure, - double temperature) { - return temperature * pow((startPressure / stopPressure), Rd); - } - - private static List> getDryAdiabats(double startPressure, - double stopPressure, double increment, double startTemp, - double endTemp, double tempDist) { - List> dryAdiabats = new ArrayList>(); - - for (double t = startTemp; t < 100; t += tempDist) { - dryAdiabats.add(dryAdiabats(1000, 100, /*20*/increment, t + 273.15)); - } - return dryAdiabats; - } - - /** - * - * @param startPressure - * @param stopPressure - * @param increment - * @param adiabat - * @return - */ - private static List dryAdiabats(double startPressure, - double stopPressure, double increment, double adiabat) { - ArrayList adiabats = null; - if (startPressure != stopPressure) { - if (increment > 0) { - adiabats = new ArrayList(); - - double delta = signum(stopPressure - startPressure) * increment; - - double basePressure = startPressure; - // int i = 0; - for (; startPressure >= stopPressure; startPressure += delta) { - UAPoint point = new UAPoint(); - point.pressure = startPressure; - point.temperature = poisson(startPressure, basePressure, - adiabat); - adiabats.add(point); - } - } - } - return adiabats; - } - - private void printDryAdiabats(WGraphics world, GC gc) throws VizException { - for (Iterator> iterator = dryPoints - .iterator(); iterator.hasNext();) { - List points = iterator.next(); - UAPoint firstPoint = points.get(0); - Coordinate startCoor = NsharpWxMath.getSkewTXY(firstPoint.pressure, - NsharpConstants.kelvinToCelsius.convert(firstPoint.temperature)); - //System.out.println("List size ="+points.size()); - //System.out.println("First pt pre=" + firstPoint.pressure+ " temp="+ firstPoint.temperature); - for (Iterator iter = points.iterator(); iter.hasNext();) { - UAPoint p = iter.next(); - //System.out.println("pt pre=" + p.pressure+ " temp="+ p.temperature); - Coordinate endCoor = NsharpWxMath.getSkewTXY(p.pressure, - NsharpConstants.kelvinToCelsius.convert(p.temperature)); - - gc.drawLine((int)world.mapX(startCoor.x), (int)world.mapY( - startCoor.y), (int)world.mapX(endCoor.x), - (int)world.mapY(endCoor.y)); - - startCoor = endCoor; - } - } - } - - /** - * Print the temperature lines. - * - * @throws VizException - */ - private void printTempLines(WGraphics world, GC gc) throws VizException { - for (int i = 70; i > -200; i -= 10) { - Coordinate coorStart = NsharpWxMath.getSkewTXY(1050, i); - Coordinate coorEnd = NsharpWxMath.getSkewTXY(100, i); - gc.drawLine((int)world.mapX(coorStart.x), (int)world.mapY( - coorStart.y), (int)world.mapX(coorEnd.x), (int)world - .mapY(coorEnd.y)); - } - } - - - - - /** - * Returns the point that two lines instersect, or null if they do not. - * - * @param l1 - * @param l2 - * @return - */ - private Point2D.Double getLineIntersection(Line2D.Double l1, - Line2D.Double l2) { - if (!l1.intersectsLine(l2)) { - return null; - } - - Point2D.Double intersection = new Point2D.Double(); - double x1 = l1.getX1(), y1 = l1.getY1(), x2 = l1.getX2(), y2 = l1 - .getY2(), x3 = l2.getX1(), y3 = l2.getY1(), x4 = l2.getX2(), y4 = l2 - .getY2(); - - intersection.x = det(det(x1, y1, x2, y2), x1 - x2, det(x3, y3, x4, y4), - x3 - x4) - / det(x1 - x2, y1 - y2, x3 - x4, y3 - y4); - intersection.y = det(det(x1, y1, x2, y2), y1 - y2, det(x3, y3, x4, y4), - y3 - y4) - / det(x1 - x2, y1 - y2, x3 - x4, y3 - y4); - - return intersection; - } - - private double det(double a, double b, double c, double d) { - return a * d - b * c; - } - - - @Override - public void disposeInternal(){ - super.disposeInternal(); - if(mixRatioShape!=null) - mixRatioShape.dispose(); - if(dryAdiabatsShape!=null) - dryAdiabatsShape.dispose(); - if(moistAdiabatsShape!= null) - moistAdiabatsShape.dispose(); - if(temperatureLineShape!=null) - temperatureLineShape.dispose(); - if(presslinesNumbersShape!=null) - presslinesNumbersShape.dispose(); - if(tempNumbersShape!=null) - tempNumbersShape.dispose(); - } - @Override - public void initInternal(IGraphicsTarget target){ - super.initInternal(target); - - //temperature line shape - temperatureLineShape = target.createWireframeShape(false,desc ); - temperatureLineShape.allocate(54); - for (int i = 70; i > -200; i -= 10) { - Coordinate coorStart = NsharpWxMath.getSkewTXY(1050, i); - Coordinate coorEnd = NsharpWxMath.getSkewTXY(100, i); - double [][] lines = {{world.mapX(coorStart.x), world.mapY(coorStart.y)}, - {world.mapX(coorEnd.x), world.mapY(coorEnd.y)}}; - temperatureLineShape.addLineSegment(lines); - } - temperatureLineShape.compile(); - - //moist Adiabats shape - moistAdiabatsShape = target.createWireframeShape(false,desc ); - moistAdiabatsShape.allocate(2500); - for (Iterator> iterator = saturatedPoints - .iterator(); iterator.hasNext();) { - List points = iterator.next(); - UAPoint firstPoint = points.get(0); - Coordinate coor1 = NsharpWxMath.getSkewTXY(firstPoint.pressure, - NsharpConstants.kelvinToCelsius.convert(firstPoint.temperature)); - for (Iterator iter = points.iterator(); iter.hasNext();) { - UAPoint p = iter.next(); - Coordinate coor2 = NsharpWxMath.getSkewTXY(p.pressure, - NsharpConstants.kelvinToCelsius.convert(p.temperature)); - double [][] lines = {{world.mapX(coor1.x), world.mapY(coor1.y)},{world.mapX(coor2.x), world.mapY(coor2.y)}}; - moistAdiabatsShape.addLineSegment(lines); - coor1 = coor2; - } - } - moistAdiabatsShape.compile(); - //DryAdiabats shape - dryAdiabatsShape = target.createWireframeShape(false,desc ); - dryAdiabatsShape.allocate(1500); - for (Iterator> iterator = dryPoints - .iterator(); iterator.hasNext();) { - List points = iterator.next(); - UAPoint firstPoint = points.get(0); - Coordinate startCoor = NsharpWxMath.getSkewTXY(firstPoint.pressure, - NsharpConstants.kelvinToCelsius.convert(firstPoint.temperature)); - for (Iterator iter = points.iterator(); iter.hasNext();) { - UAPoint p = iter.next(); - Coordinate endCoor = NsharpWxMath.getSkewTXY(p.pressure, - NsharpConstants.kelvinToCelsius.convert(p.temperature)); - double [][] lines = {{world.mapX(startCoor.x), world.mapY( - startCoor.y)},{world.mapX(endCoor.x), - world.mapY(endCoor.y)}}; - dryAdiabatsShape.addLineSegment(lines); - - - startCoor = endCoor; - } - } - dryAdiabatsShape.compile(); - - //mixing ratio shape - // get the location of the 850 pressure line... - mixRatioShape = target.createWireframeShape(false,desc ); - mixRatioShape.allocate(12); - Coordinate coorStart = NsharpWxMath.getSkewTXY(850, -50); - Coordinate coorEnd = NsharpWxMath.getSkewTXY(850, 50); - - double startX = world.mapX(coorStart.x); - double startY = world.mapY(coorStart.y); - - double endX = world.mapX(coorEnd.x); - double endY = world.mapY(coorEnd.y); - - Line2D.Double line = new Line2D.Double(startX, startY, endX, endY); - Line2D.Double line2 = new Line2D.Double(); - UAPoint p1 = new UAPoint(); - p1.pressure = 1000; - UAPoint p2 = new UAPoint(); - p2.pressure = 400; - String num=""; - for (float ratio : mixingRatios) { - p1.temperature = Equations - .invMixingRatio(p1.pressure, ratio / 1000); - p2.temperature = Equations - .invMixingRatio(p2.pressure, ratio / 1000); - Coordinate coor1 = NsharpWxMath.getSkewTXY(p1.pressure, - p1.temperature - 273.15); - Coordinate coor2 = NsharpWxMath.getSkewTXY(p2.pressure, - p2.temperature - 273.15); - double [][] lines = {{world.mapX(coor1.x), world.mapY(coor1.y)},{world.mapX(coor2.x), world.mapY(coor2.y)}}; - mixRatioShape.addLineSegment(lines); - - line2.setLine(world.mapX(coor1.x), world.mapY(coor1.y), - world.mapX(coor2.x), world.mapY(coor2.y)); - num = num + ratio; - Point2D.Double point = null; - if ((point = getLineIntersection(line, line2)) != null) { - double [] lblXy = {point.x, point.y}; - mixRatioShape.addLabel(num, lblXy); - } - num = ""; - } - mixRatioShape.compile(); - - //pressureLineNumberShape - String s = ""; - presslinesNumbersShape = target.createWireframeShape(false,desc ); - presslinesNumbersShape.allocate(150); - //System.out.println("NsharpConstants.left="+NsharpConstants.left+"NsharpConstants.right"+NsharpConstants.right+" top="+NsharpConstants.top + " bot="+ NsharpConstants.bottom); - for (int i = 0; i < NsharpConstants.PRESSURE_MAIN_LEVELS.length; i++) { - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MAIN_LEVELS[i],0); - - double [][] lines = {{world.mapX(NsharpConstants.left), world.mapY(coor.y)},{world.mapX(NsharpConstants.right), - world.mapY(coor.y)}}; - presslinesNumbersShape.addLineSegment(lines); - //System.out.println("coor.x="+coor.x+"coor.y="+coor.y); - //System.out.println("x1="+world.mapX(NsharpConstants.left)+"y1=" +world.mapY(coor.y)+"x2="+world.mapX(NsharpConstants.right)+"y2="+ - // world.mapY(coor.y)); - } - for (int i = 0; i < NsharpConstants.PRESSURE_MARK_LEVELS.length; i++) { - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MARK_LEVELS[i],0); - - double [][] lines = {{world.mapX(NsharpConstants.left), world.mapY(coor.y)},{ world.mapX(NsharpConstants.left)+10, - world.mapY(coor.y)}}; - presslinesNumbersShape.addLineSegment(lines); - } - for (int i = 0; i < NsharpConstants.PRESSURE_NUMBERING_LEVELS.length; i++) { - s = NsharpConstants.pressFormat.format(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i]); - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i],0); - - double [] lblXy = {world.mapX(NsharpConstants.left)-30,world.mapY(coor.y)+5}; - presslinesNumbersShape.addLabel(s, lblXy); - - } - presslinesNumbersShape.compile(); - - createTempNumberShape(); - } - private void createTempNumberShape(){ - if(graphConfigProperty!=null){ - tempOffset = graphConfigProperty.getTempOffset(); - NsharpWxMath.setTempOffset(tempOffset); - } - //System.out.println("Skew temp offset="+tempOffset); - if(tempNumbersShape!= null) - tempNumbersShape.dispose(); - tempNumbersShape = target.createWireframeShape(false,desc ); - tempNumbersShape.allocate(2); - //Chin: to fix the problem that wire frame shape need to have at least one - //line. add a virtual line. - double [][] lines = {{0,0},{0, - 0}}; - tempNumbersShape.addLineSegment(lines); - //int lowTemp = - for (int i = 50+tempOffset; i > -40+tempOffset; i -= 10) { - Coordinate coorS = NsharpWxMath.getSkewTXY(1050, i); - double startX1 = world.mapX(coorS.x); - double startY1 = world.mapY(coorS.y); - double [] lblXy = {startX1,startY1+20}; - tempNumbersShape.addLabel(Integer.toString(i), lblXy); - } - for (int i = -30+tempOffset; i > -110+tempOffset; i -= 10) { - Coordinate coorEnd1 = NsharpWxMath.getSkewTXY(100, i); - - //System.out.println("X = "+ startX + " Y = "+ startY); - double endX1 = world.mapX(coorEnd1.x); - double endY1 = world.mapY(coorEnd1.y); - - double [] lblXy = {endX1,endY1-10}; - tempNumbersShape.addLabel(Integer.toString(i), lblXy); - } - tempNumbersShape.compile(); - } - - @Override - public void paintInternal(IGraphicsTarget target, PaintProperties paintProps) - throws VizException { - - target.setupClippingPlane(pe); - if(graphConfigProperty != null ){ - if(graphConfigProperty.isMixratio() == true) - target.drawWireframeShape(mixRatioShape, NsharpConstants.mixingRatioColor, 1, LineStyle.DASHED,smallFont); - if(graphConfigProperty.isDryAdiabat() == true) - target.drawWireframeShape(dryAdiabatsShape, NsharpConstants.dryAdiabatColor, 1, LineStyle.SOLID,smallFont); - if(graphConfigProperty.isMoistAdiabat() == true) - target.drawWireframeShape(moistAdiabatsShape, NsharpConstants.moistAdiabatColor, 1, LineStyle.DOTTED,smallFont); - } - else{ - target.drawWireframeShape(dryAdiabatsShape, NsharpConstants.dryAdiabatColor, 1, LineStyle.SOLID,smallFont); - } - - target.drawWireframeShape(temperatureLineShape, NsharpConstants.temperatureColor, 1, LineStyle.DOTS,smallFont); - target.drawRect(pe, NsharpConstants.backgroundColor, 1.0f, 1.0f); - target.clearClippingPlane(); - target.drawWireframeShape(presslinesNumbersShape, NsharpConstants.pressureColor, 1, LineStyle.SOLID,smallFont); - target.drawWireframeShape(tempNumbersShape, NsharpConstants.pressureColor, 1, LineStyle.DEFAULT, smallFont); - } - //this function is used for printing - public void paintForPrint( WGraphics world, GC gc){ - try { - gc.setLineStyle(SWT.LINE_DASH); - printDryAdiabats(world, gc); - gc.setLineStyle(SWT.LINE_DOT); - printTempLines(world,gc); - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.skewt.ui.AbstractSkewTBackground#computeWorld() - */ - @Override - protected WGraphics computeWorld() { - return world; - } - - - - public void setGraphConfigProperty(NsharpGraphProperty graphConfigProperty) { - this.graphConfigProperty = graphConfigProperty; - createTempNumberShape(); - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpTurbulenceBackground.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpTurbulenceBackground.java deleted file mode 100644 index e684a22f68..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/bkgd/NsharpTurbulenceBackground.java +++ /dev/null @@ -1,170 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpTurblenceBackground - * - * This java class performs the NSHARP NsharpTurblenceBackground functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 02/01/2012	TBD			Chin Chen	Initial coding
- * 03/21/2012                           "Refactor" to new name
- * 										
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd; - -import java.util.HashMap; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; - -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.drawables.IRenderable; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.WGraphics; - -public class NsharpTurbulenceBackground extends NsharpAbstractBackground implements - IRenderable { - private NsharpSkewTDescriptor desc; - private PixelExtent pe; - private IWireframeShape linesNumbersShape; - private IWireframeShape lNLabelShape; //Richardson Number - private IWireframeShape windShearLabelShape; - public NsharpTurbulenceBackground(NsharpSkewTDescriptor desc) { - super(); - - this.rectangle = new Rectangle(NsharpConstants.TURB_REC_X_ORIG, NsharpConstants.TURB_REC_Y_ORIG, - NsharpConstants.TURB_REC_WIDTH, NsharpConstants.TURB_REC_HEIGHT); - pe = new PixelExtent(this.rectangle); - world = new WGraphics(this.rectangle); - this.desc = desc; - } - public double toLogScale (double j) { - return(Math.log(j)/Math.log(1000)*1000); - } - public PixelExtent getPe() { - return pe; - } - @Override - protected WGraphics computeWorld() { - // TODO Auto-generated method stub - return null; - } - - @Override - public synchronized void initInternal(IGraphicsTarget target) { - // TODO Auto-generated method stub - super.initInternal(target); - String s = ""; - linesNumbersShape = target.createWireframeShape(false,desc ); - windShearLabelShape = target.createWireframeShape(false,desc ); - lNLabelShape = target.createWireframeShape(false,desc ); - linesNumbersShape.allocate(100); - windShearLabelShape.allocate(20); - lNLabelShape.allocate(20); - //set world based on pressure/In - world.setWorldCoordinates(NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_LEFT, toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP), - NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_RIGHT, toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM)); - //pressure lines and labels - for (double i = NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP; i <= NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM; i=i+ NsharpConstants.TURBULENCE_PRESSURE_LEVEL_INC) { - //Pressure lines - double [][] lines = {{NsharpConstants.TURB_REC_X_ORIG, world.mapY(toLogScale(i))},{NsharpConstants.TURB_VIEW_X_END, world.mapY(toLogScale(i))}}; - linesNumbersShape.addLineSegment(lines); - s = NsharpConstants.pressFormat.format(i); - //pressure labels - double [] lblXy = {NsharpConstants.TURB_REC_X_ORIG-30,world.mapY(toLogScale(i))+5}; - linesNumbersShape.addLabel(s, lblXy); - } - //LN label - double [] lblRhXy = {NsharpConstants.TURB_REC_X_ORIG+ 50, NsharpConstants.TURB_REC_Y_ORIG-50}; - lNLabelShape.addLabel("*****TURBULENCE Display*****", lblRhXy); - double [] lblRhXy1 = {NsharpConstants.TURB_REC_X_ORIG+ 500, NsharpConstants.TURB_REC_Y_ORIG-50}; - lNLabelShape.addLabel("LN(RICHARDSON NUMBER)", lblRhXy1); - double [][] lineRH = {{0,0},{0,0}}; - lNLabelShape.addLineSegment(lineRH);//add dummy line - - for (double i = NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_LEFT; i >= NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_RIGHT; i= i+NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_INC) { - // temperature/LN vertical lines - double [][] lines = {{world.mapX(i), NsharpConstants.TURB_REC_Y_ORIG},{world.mapX(i), NsharpConstants.TURB_VIEW_Y_END}}; - linesNumbersShape.addLineSegment(lines); - //RH label - s = NsharpConstants.pressFormat.format(i); - double [] lblXy = {world.mapX(i), NsharpConstants.TURB_REC_Y_ORIG-20}; - lNLabelShape.addLabel(s, lblXy); - } - //wind shear label - double [] lblTXy = {NsharpConstants.TURB_REC_X_ORIG+ 500, NsharpConstants.TURB_VIEW_Y_END+50}; - windShearLabelShape.addLabel("WIND SHEAR TKE PRODUCTION x 1E3 joules/sec", lblTXy); - double [][] lineT = {{0,0},{0,0}}; - windShearLabelShape.addLineSegment(lineT);//add dummy line - //set world based on pressure/windShear - world.setWorldCoordinates(NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_LEFT, toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP), - NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_RIGHT, toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM)); - for (double i = NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_LEFT; i <= NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_RIGHT; i= i+NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_INC) { - // temperature label - s = NsharpConstants.pressFormat.format(i); - double [] lblXy = {world.mapX(i), NsharpConstants.TURB_VIEW_Y_END+20}; - windShearLabelShape.addLabel(s, lblXy); - } - linesNumbersShape.compile(); - lNLabelShape.compile(); - windShearLabelShape.compile(); - } - - @Override - protected void paintInternal(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - // TODO Auto-generated method stub - //super.paintInternal(target, paintProps); - target.setupClippingPlane(pe); - target.drawRect(pe, NsharpConstants.backgroundColor, 1.0f, 1.0f); - target.clearClippingPlane(); - target.drawWireframeShape(linesNumbersShape, NsharpConstants.pressureColor, 1, LineStyle.SOLID,smallFont); - HashMap lpMap = this.desc.getSkewtResource().getLinePropertyMap(); - if(lpMap!=null){ - NsharpLineProperty lp =lpMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_TURBULENCE_LN]); - target.drawWireframeShape(lNLabelShape,lp.getLineColor(), 1, LineStyle.SOLID,smallFont); - lp =lpMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_TURBULENCE_WS]); - target.drawWireframeShape(windShearLabelShape, lp.getLineColor(), 1, LineStyle.SOLID,smallFont); - } - else{ - target.drawWireframeShape(lNLabelShape, NsharpConstants.color_violet_red, 1, LineStyle.SOLID,smallFont); - target.drawWireframeShape(windShearLabelShape, NsharpConstants.color_pink, 1, LineStyle.SOLID,smallFont); - } - - - - - } - @Override - public void disposeInternal() { - // TODO Auto-generated method stub - super.disposeInternal(); - if(linesNumbersShape!= null){ - linesNumbersShape.dispose(); - } - if(lNLabelShape!= null){ - lNLabelShape.dispose(); - } - if(windShearLabelShape!= null){ - windShearLabelShape.dispose(); - } - } - - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBackgroundResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBackgroundResource.java deleted file mode 100644 index e322e6e542..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBackgroundResource.java +++ /dev/null @@ -1,489 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTBackgroundResource - * - * This java class performs the NSHARP NsharpSkewTBackgroundResource functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 03/09/2011               Chin Chen   Updated for R1G2-9
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpWxMath; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaletteWindow; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpHodoBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpIcingBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpInsetBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpSkewTBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpTurbulenceBackground; - -import javax.measure.converter.UnitConverter; -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; - -import org.eclipse.swt.graphics.Rectangle; - -import com.raytheon.uf.common.geospatial.ReferencedCoordinate; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; -import com.raytheon.uf.common.sounding.WxMath; -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpBackgroundResource extends -AbstractVizResource { - private static final UnitConverter celciusToFahrenheit = SI.CELSIUS.getConverterTo(NonSI.FAHRENHEIT); - private static final UnitConverter celciusToKelvin = SI.CELSIUS.getConverterTo(SI.KELVIN); - private String sTemperatureC= ""; - private String sTemperatureF = ""; - private String sThetaInK = ""; - private String sWThetaInK = ""; - private String sEThetaInK=""; - private String sMixingRatio = ""; - private String sPressure = ""; - private double dPressure; - private String sWindSpeed =""; - private String sWindDirection=""; - private NsharpSkewTBackground skewTBackground; - private NsharpIcingBackground icingBackground; - private NsharpTurbulenceBackground turbBackground; - private NsharpHodoBackground hodoBackground; - private NsharpInsetBackground thetaEHeightBackground; - private NsharpInsetBackground srWindsBackground; - private NsharpInsetBackground dataTimelineBackground; - private NsharpInsetBackground stormSlinkyBackground; - private NsharpInsetBackground srWindVectorBackground; - private NsharpInsetBackground psblWatchTypeBackground; - private NsharpInsetBackground thetaEPresureBackground; - private NsharpInsetBackground dataPanel1Background; - private NsharpInsetBackground dataPanel2Background; - private NsharpInsetBackground dataPanel3Background; - private NsharpInsetBackground dataPanel4Background; - private NsharpInsetBackground stationIdBackground; - private NsharpInsetBackground colorNotationsBackground; - private NsharpInsetBackground verticalWindBackground; - private NsharpInsetBackground windMotionBackground; - private int currentGraphMode= NsharpConstants.GRAPH_SKEWT; - - public int getCurrentGraphMode() { - return currentGraphMode; - } - - public void setCurrentGraphMode(int currentGraphMode) { - this.currentGraphMode = currentGraphMode; - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - } - - - @Override - public void setDescriptor(NsharpSkewTDescriptor descriptor) { - super.setDescriptor(descriptor); - //System.out.println("NsharpBackgroundResource setDescriptor called"); - } - /* #10438 - public float getSmSpd() { - return smSpd; - } - - public void setSmSpd(float smSpd) { - this.smSpd = smSpd; - } - - public float getSmDir() { - return smDir; - } - - public void setSmDir(float smDir) { - this.smDir = smDir; - }*/ - - public String getSWindSpeed() { - return sWindSpeed; - } - - public String getSWindDirection() { - return sWindDirection; - } - - public String getSEThetaInK() { - return sEThetaInK; - } - - public String getSWThetaInK() { - return sWThetaInK; - } - - public String getSMixingRatio() { - return sMixingRatio; - } - - public double getDPressure() { - return dPressure; - } - - public String getSTemperatureC() { - return sTemperatureC; - } - - public String getSTemperatureF() { - return sTemperatureF; - } - - public String getSThetaInK() { - return sThetaInK; - } - - public String getSPressure() { - return sPressure; - } - - public NsharpInsetBackground getWindMotionBackground() { - return windMotionBackground; - } - - public NsharpInsetBackground getVerticalWindBackground() { - return verticalWindBackground; - } - public NsharpInsetBackground getColorNotationsBackground() { - return colorNotationsBackground; - } - - public NsharpInsetBackground getDataPanel1Background() { - return dataPanel1Background; - } - - public NsharpInsetBackground getDataPanel2Background() { - return dataPanel2Background; - } - - public NsharpInsetBackground getDataPanel3Background() { - return dataPanel3Background; - } - - public NsharpInsetBackground getDataPanel4Background() { - return dataPanel4Background; - } - - public NsharpInsetBackground getThetaEPresureBackground() { - return thetaEPresureBackground; - } - - public NsharpInsetBackground getPsblWatchTypeBackground() { - return psblWatchTypeBackground; - } - - public NsharpInsetBackground getSrWindVectorBackground() { - return srWindVectorBackground; - } - - public NsharpInsetBackground getStormSlinkyBackground() { - return stormSlinkyBackground; - } - - public NsharpInsetBackground getDataTimelineBackground() { - return dataTimelineBackground; - } - - public NsharpInsetBackground getStationIdBackground() { - return stationIdBackground; - } - - public NsharpInsetBackground getSrWindsBackground() { - return srWindsBackground; - } - - /** - * @return the skewTBackground - */ - public NsharpSkewTBackground getSkewTBackground() { - return skewTBackground; - } - - /** - * @return the hodoBackground - */ - public NsharpHodoBackground getHodoBackground() { - return hodoBackground; - } - - - - public NsharpTurbulenceBackground getTurbBackground() { - return turbBackground; - } - - public NsharpIcingBackground getIcingBackground() { - return icingBackground; - } - - public NsharpInsetBackground getThetaEHeightBackground() { - return thetaEHeightBackground; - } - - public NsharpBackgroundResource(NsharpBkgResourceData rscData, - LoadProperties loadProperties, NsharpSkewTDescriptor desc) { - super(rscData, loadProperties); - System.out.println("NsharpBackgroundResource constructor called"); - skewTBackground = new NsharpSkewTBackground(desc); - hodoBackground = new NsharpHodoBackground(desc); - icingBackground = new NsharpIcingBackground(desc); - turbBackground = new NsharpTurbulenceBackground(desc); - thetaEHeightBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.THETAH_REC_X_ORIG,NsharpConstants.THETAH_REC_Y_ORIG, - NsharpConstants.THETAH_REC_WIDTH,NsharpConstants.THETAH_REC_HEIGHT)); - srWindsBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.SRWINDS_REC_X_ORIG,NsharpConstants.SRWINDS_REC_Y_ORIG, - NsharpConstants.SRWINDS_REC_WIDTH,NsharpConstants.SRWINDS_REC_HEIGHT)); - dataTimelineBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.DATA_TIMELINE_REC_X_ORIG,NsharpConstants.DATA_TIMELINE_REC_Y_ORIG, - NsharpConstants.DATA_TIMELINE_REC_WIDTH,NsharpConstants.DATA_TIMELINE_REC_HEIGHT)); - stationIdBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.STATION_ID_REC_X_ORIG,NsharpConstants.STATION_ID_REC_Y_ORIG, - NsharpConstants.STATION_ID_REC_WIDTH,NsharpConstants.STATION_ID_REC_HEIGHT)); - stormSlinkyBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.STORMSLINKY_REC_X_ORIG,NsharpConstants.STORMSLINKY_REC_Y_ORIG, - NsharpConstants.STORMSLINKY_REC_WIDTH,NsharpConstants.STORMSLINKY_REC_HEIGHT)); - srWindVectorBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.SRWINDVTRS_REC_X_ORIG,NsharpConstants.SRWINDVTRS_REC_Y_ORIG, - NsharpConstants.SRWINDVTRS_REC_WIDTH,NsharpConstants.SRWINDVTRS_REC_HEIGHT)); - psblWatchTypeBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.PSBLWATCH_REC_X_ORIG,NsharpConstants.PSBLWATCH_REC_Y_ORIG, - NsharpConstants.PSBLWATCH_REC_WIDTH,NsharpConstants.PSBLWATCH_REC_HEIGHT));//NsharpPsblWatchTypeBackground(); - thetaEPresureBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.THETAP_REC_X_ORIG,NsharpConstants.THETAP_REC_Y_ORIG, - NsharpConstants.THETAP_REC_WIDTH,NsharpConstants.THETAP_REC_HEIGHT)); - dataPanel1Background = new NsharpInsetBackground(new Rectangle(NsharpConstants.DATAPANEL1_REC_X_ORIG,NsharpConstants.DATAPANEL1_REC_Y_ORIG, - NsharpConstants.DATAPANEL1_REC_WIDTH,NsharpConstants.DATAPANEL1_REC_HEIGHT)); - dataPanel2Background = new NsharpInsetBackground(new Rectangle(NsharpConstants.DATAPANEL2_REC_X_ORIG,NsharpConstants.DATAPANEL2_REC_Y_ORIG, - NsharpConstants.DATAPANEL2_REC_WIDTH,NsharpConstants.DATAPANEL2_REC_HEIGHT)); - //dataPanel3Background = new NsharpInsetBackground(new Rectangle(NsharpConstants.DATAPANEL3_REC_X_ORIG,NsharpConstants.DATAPANEL3_REC_Y_ORIG, - // NsharpConstants.DATAPANEL3_REC_WIDTH,NsharpConstants.DATAPANEL3_REC_HEIGHT)); - dataPanel4Background = new NsharpInsetBackground(new Rectangle(NsharpConstants.DATAPANEL4_REC_X_ORIG,NsharpConstants.DATAPANEL4_REC_Y_ORIG, - NsharpConstants.DATAPANEL4_REC_WIDTH,NsharpConstants.DATAPANEL4_REC_HEIGHT)); - colorNotationsBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.COLOR_NOTATION_REC_X_ORIG,NsharpConstants.COLOR_NOTATION_REC_Y_ORIG, - NsharpConstants.COLOR_NOTATION_REC_WIDTH,NsharpConstants.COLOR_NOTATION_REC_HEIGHT)); - verticalWindBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.VERTICAL_WIND_X_ORIG,NsharpConstants.VERTICAL_WIND_Y_ORIG, - NsharpConstants.VERTICAL_WIND_WIDTH,NsharpConstants.VERTICAL_WIND_HEIGHT)); - - windMotionBackground = new NsharpInsetBackground(new Rectangle(NsharpConstants.WIND_MOTION_REC_X_ORIG,NsharpConstants.WIND_MOTION_REC_Y_ORIG, - NsharpConstants.WIND_MOTION_REC_WIDTH,NsharpConstants.WIND_MOTION_REC_HEIGHT)); - currentGraphMode = NsharpPaletteWindow.getCurrentGraphMode(); - } - // NOTE:::Chin. It should only be called on new displays. Descriptor is passed to here as it is needed for - // creating SkewT and Hodo background in NsharpBackgroundResource constructor(). - //NsharpBackgroundResource's own setDescriptor() will be called to set descriptor, but it is a bit too late when - // within "constructor()". - public static NsharpBackgroundResource createSkewTBkGResource(NsharpSkewTDescriptor desc) { - //System.out.println("NsharpBackgroundResource createSkewTBkGResource called"); - - LoadProperties loadProperties = new LoadProperties(); - ColorableCapability colorable1 = new ColorableCapability(); - colorable1.setColor(NsharpConstants.backgroundColor); - loadProperties.getCapabilities().addCapability(colorable1); - return new NsharpBackgroundResource(new NsharpBkgResourceData(desc), - loadProperties, desc); - } - - @Override - protected void disposeInternal() { - //System.out.println("NsharpBackgroundResource disposeInternal called"); - skewTBackground.disposeInternal(); - hodoBackground.disposeInternal(); - icingBackground.disposeInternal(); - turbBackground.disposeInternal(); - hodoBackground=null; - skewTBackground=null; - //Chin Note: currently, all other backgrounds (all are NsharpInsetBackground) do not have to call disposeInternal() - psblWatchTypeBackground=null; - thetaEHeightBackground=null; - srWindsBackground=null; - dataTimelineBackground=null; - stormSlinkyBackground=null; - srWindVectorBackground=null; - thetaEPresureBackground=null; - dataPanel1Background=null; - dataPanel2Background=null; - dataPanel3Background=null; - dataPanel4Background=null; - stationIdBackground=null; - colorNotationsBackground=null; - verticalWindBackground=null; - windMotionBackground=null; - } - - @Override - protected void initInternal(IGraphicsTarget target) throws VizException { - //System.out.println("NsharpBackgroundResource initInternal called"); - skewTBackground.initInternal(target); - hodoBackground.initInternal(target); - icingBackground.initInternal(target); - turbBackground.initInternal(target); - //Chin Note: currently, all other backgrounds (all are NsharpInsetBackground) do not have to call initInternal() - } - - @Override - protected void paintInternal(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - if(currentGraphMode== NsharpConstants.GRAPH_SKEWT) - skewTBackground.paint(target, paintProps); - else if(currentGraphMode == NsharpConstants.GRAPH_ICING) - icingBackground.paint(target, paintProps); - else if(currentGraphMode == NsharpConstants.GRAPH_TURB) - turbBackground.paint(target, paintProps); - else - //default - skewTBackground.paint(target, paintProps); - hodoBackground.paint(target, paintProps); - thetaEHeightBackground.paint(target, paintProps); - srWindsBackground.paint(target, paintProps); - dataTimelineBackground.paint(target, paintProps); - stationIdBackground.paint(target, paintProps); - stormSlinkyBackground.paint(target, paintProps); - srWindVectorBackground.paint(target, paintProps); - psblWatchTypeBackground.paint(target, paintProps); - thetaEPresureBackground.paint(target, paintProps); - dataPanel1Background.paint(target, paintProps); - dataPanel2Background.paint(target, paintProps); - //dataPanel3Background.paint(target, paintProps); - dataPanel4Background.paint(target, paintProps); - colorNotationsBackground.paint(target, paintProps); - verticalWindBackground.paint(target, paintProps); - //TBD windMotionBackground.paint(target, paintProps); - } - - /* - * - * (non-Javadoc) - * @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#inspect(com.raytheon.uf.common.geospatial.ReferencedCoordinate) - * Chin:::this may not be used any more.... - */ - - @Override - public String inspect(ReferencedCoordinate rCoord) throws VizException { - //System.out.print("NsharpSkewTBKResource ::: inspect entered!!!!!\n"); - Coordinate c; - try { - c = rCoord.asPixel(this.getDescriptor().getGridGeometry()); - //DECP NsharpPaletteWindow win = NsharpPaletteWindow.getAccess(); - //if(win == null) - // return ""; - - if (skewTBackground.contains(c)) { - c = NsharpWxMath.reverseSkewTXY(skewTBackground.getWorld() - .unMap(c.x, c.y)); - double p_mb = c.y; - double t_C = c.x; // Celsius - double t_F = celciusToFahrenheit.convert(c.x); - double theta = celciusToKelvin.convert(WxMath.theta(p_mb, t_C, - 1000)); - double wtheta = celciusToKelvin.convert(WxMath.thetaw(p_mb, - t_C, t_C)); - double etheta = celciusToKelvin.convert(WxMath.thetae(p_mb, - t_C, t_C)); - double mixRatio = WxMath.mixingRatio(p_mb, t_C); - dPressure = p_mb; - - sPressure = String.format( - "%.0f mb",p_mb, NsharpConstants.THETA_SYMBOL); - sTemperatureC = String.format("%4.1f%cC", - t_C, NsharpConstants.DEGREE_SYMBOL); - sTemperatureF = String.format("%4.1f%cF", - t_F,NsharpConstants.DEGREE_SYMBOL); - - sThetaInK = String.format("%c=%.0fK", - NsharpConstants.THETA_SYMBOL,theta); - sWThetaInK = String.format("%cw=%.0fK", - NsharpConstants.THETA_SYMBOL,wtheta); - sEThetaInK = String.format("%ce=%.0fK", - NsharpConstants.THETA_SYMBOL,etheta); - sMixingRatio = String.format("%.0fg/Kg",mixRatio); - } - if (hodoBackground.contains(c)) { - - c = hodoBackground.getWorld().unMap(c.x, c.y); - c = WxMath.speedDir((float) c.x, (float) c.y); - - - sWindDirection = String.format("%.0f%c", c.y, NsharpConstants.DEGREE_SYMBOL); - sWindSpeed = String.format("%.0f Knots (%.0f m/s)",c.x, c.x * NsharpConstants.KnotsToMetersPerSecond /*metersPerSecondToKnots.convert(c.x)*/); - - // 10438 smSpd = (float) c.x; - //smDir = (float) c.y; - } - - - } catch (Exception e) { - UFStatus.getHandler().handle(Priority.PROBLEM, "Exception translating coordinate", e); - } - return ""; - } - public String updateDynamicData(Coordinate c) throws VizException { - - try { - //System.out.println(" updateDynamicData entered!!!!!C.x="+c.x + " c.y="+c.y); - - if (skewTBackground.contains(c)) { - c = NsharpWxMath.reverseSkewTXY(skewTBackground.getWorld() - .unMap(c.x, c.y)); - double p_mb = c.y; - double t_C = c.x; // Celsius - double t_F = celciusToFahrenheit.convert(c.x); - double theta = celciusToKelvin.convert(WxMath.theta(p_mb, t_C, - 1000)); - double wtheta = celciusToKelvin.convert(WxMath.thetaw(p_mb, - t_C, t_C)); - double etheta = celciusToKelvin.convert(WxMath.thetae(p_mb, - t_C, t_C)); - double mixRatio = WxMath.mixingRatio(p_mb, t_C); - dPressure = p_mb; - - sPressure = String.format( - "%.0f mb",p_mb, NsharpConstants.THETA_SYMBOL); - sTemperatureC = String.format("%.0f%cC", - t_C, NsharpConstants.DEGREE_SYMBOL); - sTemperatureF = String.format("%.0f%cF", - t_F,NsharpConstants.DEGREE_SYMBOL); - - sThetaInK = String.format("%c=%.0fK", - NsharpConstants.THETA_SYMBOL,theta); - sWThetaInK = String.format("%cw=%.0fK", - NsharpConstants.THETA_SYMBOL,wtheta); - sEThetaInK = String.format("%ce=%.0fK", - NsharpConstants.THETA_SYMBOL,etheta); - sMixingRatio = String.format("%.0fg/Kg",mixRatio); - } - if (hodoBackground.contains(c)) { - - c = hodoBackground.getWorld().unMap(c.x, c.y); - c = WxMath.speedDir((float) c.x, (float) c.y); - - - sWindDirection = String.format("%.0f%c", c.y, NsharpConstants.DEGREE_SYMBOL); - sWindSpeed = String.format("%.0f Knots (%.0f m/s)",c.x, c.x * NsharpConstants.KnotsToMetersPerSecond /*metersPerSecondToKnots.convert(c.x)*/); - - //#10438 smSpd = (float) c.x; - //smDir = (float) c.y; - } - - - } catch (Exception e) { - UFStatus.getHandler().handle(Priority.PROBLEM, "Exception translating coordinate", e); - } - return ""; - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBkgResourceData.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBkgResourceData.java deleted file mode 100644 index 654f1d4282..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpBkgResourceData.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTBkgResourceData - * - * This java class performs the NSHARP NsharpSkewTBkgResourceData functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; - -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.LoadProperties; - -public class NsharpBkgResourceData extends AbstractResourceData { - private NsharpSkewTDescriptor desc; - public NsharpBkgResourceData(NsharpSkewTDescriptor desc) { - this.desc = desc; - } - - @Override - public AbstractVizResource construct(LoadProperties loadProperties, - IDescriptor descriptor) throws VizException { - return new NsharpBackgroundResource(this, loadProperties, desc); - } - // Chin MERGE - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - return true; - } - - @Override - public void update(Object updateData) { - // TODO Auto-generated method stub - - } - // Chin MERGE added simple hashCode - @Override - public int hashCode() { - return NsharpBkgResourceData.class.hashCode(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpDrawPanels.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpDrawPanels.java deleted file mode 100644 index 0918ea7fd7..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpDrawPanels.java +++ /dev/null @@ -1,3734 +0,0 @@ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - - -import java.util.List; - -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._lplvalues; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._parcel; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpParcelDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; -import org.eclipse.swt.graphics.Rectangle; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; -import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; -import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; -import com.raytheon.uf.viz.core.drawables.IFont; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.graphing.LineStroke; -import com.raytheon.viz.core.graphing.WindBarbFactory; -import com.sun.jna.ptr.FloatByReference; -import com.vividsolutions.jts.geom.Coordinate; - - - -public class NsharpDrawPanels { - //private NsharpNative nsharpNative = NsharpNative.getInstance(); - private static final String NO_DATA = "NO VALID DATA AVAILABLE"; - private double charHeight = 40; - private double curY; - private double parcelLineYStart, parcelLineYEnd; - private double firstToken, secondToken, thirdToken, forthToken, fifthToken, sixthToken; - private FloatByReference fValue= new FloatByReference(0); - private FloatByReference fValue1= new FloatByReference(0); - private FloatByReference fValue2= new FloatByReference(0); - private FloatByReference fValue3= new FloatByReference(0); - private FloatByReference fValue4= new FloatByReference(0); - private FloatByReference fValue5= new FloatByReference(0); - private FloatByReference fValue6= new FloatByReference(0); - private FloatByReference fValue7= new FloatByReference(0); - private FloatByReference fValue8= new FloatByReference(0); - private PixelExtent extent; - private NsharpBackgroundResource bkRsc; - private NsharpSkewTResource rsc; - // physical number of panel in editor display - - // total software defined panels to be displayed - private final int virtualPanelSize = 10; - private Rectangle[] panelRectArray= new Rectangle[NsharpConstants.dsiplayPanelSize] ; - private IFont myFont; - - //private String fontName = "Monospace"; - //private int fontSize =11; - private NsharpNative nsharpNative=null; - private short currentParcel= NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE;; - private static NsharpDrawPanels instance=null; - - - public void setMyFont(IFont myFont) { - this.myFont = myFont; - } - - public static NsharpDrawPanels getInstance(){ - return instance; - } - - public void setCurrentParcel(short currentParcel) { - this.currentParcel = currentParcel; - } - - public short getCurrentParcel() { - return currentParcel; - } - public void resetCurrentParcel() { - currentParcel= NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - } - - /*class ShapeAndColor { - IWireframeShape shape; - RGB color; - } - //dynamic resource shapes - private Listpanel1ShapeList = new ArrayList(); - - public void disposeShapes(){ - if(panel1ShapeList.size()>0){ - for(ShapeAndColor shapeColor: panel1ShapeList){ - shapeColor.shape.dispose(); - } - panel1ShapeList.clear(); - } - //if(myFont != null) { - // myFont.dispose(); - // myFont = null; - //} - } - public void createShape(IGraphicsTarget target, int virtualPanelNumber, int dsiplayPanelNumber){ - if(virtualPanelNumber > virtualPanelSize || dsiplayPanelNumber > NsharpConstants.dsiplayPanelSize) - return; - int physicalPanelNumber = dsiplayPanelNumber -1; - NsharpSkewTDescriptor desc = bkRsc.getDescriptor(); - if( desc != null) { - NsharpSkewTResource rsc = desc.getSkewtResource(); - if(rsc != null) - nsharpNative = rsc.getNsharpNative(); - } - if(nsharpNative == null) - return; - switch(virtualPanelNumber){ - case 1: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 2: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 3: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 4: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 5: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 6: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 7: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 8: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 9: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - case 10: - createPanel1Shape(target, panelRectArray[physicalPanelNumber]); - break; - default: - break; - } - } - */ - /*private void createPanel1Shape(IGraphicsTarget target, Rectangle rect){ - - * Chin's NOTE:::: - * Use wire frame shape for drawing string (lable) cause a problem that - * it can not put strings in line properly. Therefore, I dont use - * it for draw panel for now. Until there is a better solution to - * draw stings in line. - * - * This pages based on newer version nsharp from SPC. We dont have source code as of 5/24/2011. - * Therefore, coding is purly based on a captured screen shot given by SPC's John Hart. - * This function is coded based on native nsharp codes which can be found - * in other pages's show functions. - * - * - * - ShapeAndColor shNcolor = new ShapeAndColor(); - IWireframeShape shapeR = shNcolor.shape = target.createWireframeShape(false,bkRsc.getDescriptor() ); - shNcolor.color = NsharpConstants.color_red; - panel1ShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); - IWireframeShape shapeW= shNcolor.shape = target.createWireframeShape(false,bkRsc.getDescriptor() ); - shNcolor.color = NsharpConstants.color_white; - panel1ShapeList.add(shNcolor); - shNcolor = new ShapeAndColor(); - IWireframeShape shapeY= shNcolor.shape = target.createWireframeShape(false,bkRsc.getDescriptor() ); - shNcolor.color = NsharpConstants.color_yellow; - panel1ShapeList.add(shNcolor); - //if we can not Interpolates a temp with 700 mb pressure, then we dont have enough raw data - if ((nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0)) - { - double [] lblXy = {rect.x, rect.y}; - shapeR.addLabel(" " +NO_DATA, lblXy); - shapeR.compile(); - shapeW.compile(); - shapeY.compile(); - return; - } - - String textStr; - curY=rect.y; - - // - // Start with Parcel Data - // - double widthGap = (rect.width-200)/6; - xbegin = rect.x + 80; - firstToken=xbegin+120.0; - secondToken=firstToken+widthGap; - thirdToken=secondToken+widthGap; - forthToken=thirdToken+widthGap; - fifthToken = forthToken+widthGap; - sixthToken = fifthToken+widthGap; - curY = curY+charHeight; - double [] lblXy = {firstToken,curY}; - shapeW.addLabel("CAPE", lblXy); - double [] lblXy1 = {secondToken,curY}; - shapeW.addLabel("CINH", lblXy1); - double [] lblXy2 = {thirdToken,curY}; - shapeW.addLabel("LCL", lblXy2); - double [] lblXy3 = {forthToken,curY}; - shapeW.addLabel("LI", lblXy3); - double [] lblXy4 = {fifthToken,curY}; - shapeW.addLabel("LFC", lblXy4); - double [] lblXy5 = {sixthToken,curY}; - shapeW.addLabel("EL", lblXy5); - - double [][] lines = {{rect.x, curY},{rect.x+rect.width, curY}}; - shapeW.addLineSegment(lines); - float layerPressure = 0; - short currentParcel; - - for (short parcelNumber=1; parcelNumber <= NsharpNativeConstants.PARCEL_MAX ; parcelNumber++){ - curY = curY+charHeight; - //call native define_parcel() with parcel type and user defined pressure (if user defined it) - textStr = NsharpNativeConstants.parcelToTypeStrMap.get(parcelNumber); - - //draw parcel name - double [] lblXy6 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy6); - { - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(parcelNumber); - if(parcelNumber == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){ - //get user selected parcel type, if available - if(NsharpParcelDialog.getAccess() != null){ - layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - } - } - - nsharpNative.nsharpLib.define_parcel(parcelNumber,layerPressure); - - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - _parcel pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - //draw CAPE - if(pcl.bplus != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(String.format( "%.0f", pcl.bplus), lblXy7); - } - else { - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel("M", lblXy7); - } - - //draw CINH - if(pcl.bminus != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel(String.format( "%.0f", pcl.bminus), lblXy7); - } - else { - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel("M", lblXy7); - } - //draw LCL - float lcl = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )); - if(lcl != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel(String.format("%.0fm", lcl), lblXy7); - } - else { - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel("M", lblXy7); - } - //draw LI - if(pcl.li5 != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {forthToken,curY}; - shapeW.addLabel(String.format("%.0f", pcl.li5), lblXy7); - } - else { - double [] lblXy7 = {forthToken,curY}; - shapeW.addLabel("M", lblXy7); - } - //draw LFC - float lfc = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres )); - if(lfc != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {fifthToken,curY}; - shapeW.addLabel(String.format("%.0fm", lfc), lblXy7); - } - else { - double [] lblXy7 = {fifthToken,curY}; - shapeW.addLabel("M", lblXy7); - } - // draw EL - float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres )); - if(el != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double [] lblXy7 = {sixthToken,curY}; - shapeW.addLabel(String.format("%.0fm", el), lblXy7); - } - else { - double [] lblXy7 = {sixthToken,curY}; - shapeW.addLabel("M", lblXy7); - } - } - } - double [][] lines1 = {{rect.x, curY},{rect.x+rect.width, curY}}; - shapeW.addLineSegment(lines1); - curY = curY+charHeight; //move to new line - //reset and define current parcel - if(NsharpParcelDialog.getAccess() != null){ - - currentParcel = NsharpParcelDialog.getAccess().getCurrentParcel(); - if(currentParcel == NsharpNativeConstants.PARCELTYPE_USER_DEFINED) - layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - else - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - } - else {//default - use mU - currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - } - nsharpNative.nsharpLib.define_parcel(currentParcel,layerPressure); - // - // THERMO DYNAMIC DATA - // - firstToken = xbegin + rect.width/3; - secondToken = firstToken+ rect.width/4; - thirdToken = secondToken + rect.width/4; - fValue.setValue(0); - nsharpNative.nsharpLib.precip_water(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("PW=%.2f in", fValue.getValue()); - } - else { - textStr = "PW= M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - //dont know what is 3CAPE... - { - textStr = "3CAPE= M"; - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - fValue.setValue(0); - float wbzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(wbzft)==1) { - textStr = String.format("WBZ=%.0f'",wbzft); - } - else { - textStr = "WBZ= M"; - } - { - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - {//dont know what is WNDG... - textStr = "WNDG= M"; - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - nsharpNative.nsharpLib.k_index(fValue); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("K=%.0f",fValue.getValue()); - } - else { - textStr = "K= M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - //dont know what is DCAPE... - { - textStr = "DCAPE= M"; - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - fValue.setValue(0); - float fgzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(fgzft)==1) { - textStr = String.format("FZL=%.0f'",fgzft); - } - else { - textStr = "FZL= M"; - } - { - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - {//dont know what is ESP... - textStr = "ESP= M"; - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_relhum(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("MidRH=%.1f %c",fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = "MidRH = M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - {//dont know what is DownT... - textStr = "DownT= M"; - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - fValue.setValue(0); - float conTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.cnvtv_temp( fValue, -50)); - - if(nsharpNative.nsharpLib.qc( conTempF )==1) { - textStr = String.format("ConvT=%.0fF",conTempF); - } - else { - textStr = "ConvT = M"; - } - { - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - {//dont know what is MMP... - textStr = "MMP= M"; - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - fValue1.setValue(0); - // get surface pressure (fValue1) before getting mean LRH value - nsharpNative.nsharpLib.get_surface(fValue1, fValue2, fValue3); //fValue 2 and fValue3 are not of concern here - nsharpNative.nsharpLib.mean_relhum( fValue, -1.0F, fValue1.getValue() - 150 ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_MEANLRH_LINE; - textStr = String.format("LowRH=%.1f %c",fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = "LowRH = M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - fValue.setValue(0); - nsharpNative.nsharpLib.mean_mixratio(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("MeanW=%.1f g/Kg",fValue.getValue()); - } - else { - textStr = "MeanW = M"; - } - { - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - fValue.setValue(0); - float maxT= nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.max_temp( fValue, -1)); - if(nsharpNative.nsharpLib.qc(maxT)==1) { - textStr = String.format("MaxT=%.0fF",maxT); - } - else { - textStr = "MaxT= M"; - } - { - double [] lblXy7 = {secondToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - {//dont know what is NCAPE... - textStr = "NCAPE= M"; - double [] lblXy7 = {thirdToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - - double [][] lines2 = {{rect.x, curY},{rect.x+rect.width, curY}}; - shapeW.addLineSegment(lines2); - - //draw a vertical line from 2/3 of x axis - firstToken = rect.x + rect.width/3*2+ 50; - double [][] lines3 = {{firstToken-10, curY},{firstToken-10, rect.y+rect.height}}; - shapeW.addLineSegment(lines3); - - curY = curY+charHeight; //move to new line - // more thermodynamic data - - // sfc-3km Lapse rate - // - // Chin: NOTE: I just "guess" and follow how 850-500 mb Lapse rate is calculated to calculate sfc-3km and 3-6km Lapse rate - // - - fValue.setValue(0); - // get surface pressure (fValue) - nsharpNative.nsharpLib.get_surface(fValue, fValue1, fValue2); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - // get 3 km pressure (fValue) - float threekmPre = nsharpNative.nsharpLib.ipres(3000); - fValue1.setValue(0); - nsharpNative.nsharpLib.lapse_rate( fValue1, fValue.getValue(), threekmPre ); - if(nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("sfc-3km Agl Lapse Rate=M/%.1fC/Km", fValue1.getValue()); - } - else { - textStr = "sfc-3km Agl Lapse Rate= M"; - } - } - else { - textStr = "sfc-3km Agl Lapse Rate= M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - //place holder for "Supercell" - { - textStr = "Supercell = M"; - double [] lblXy7 = {firstToken,curY}; - shapeY.addLabel(textStr, lblXy7); - } - curY = curY+charHeight; //move to new line - - // 3km-6km Lapse rate - fValue.setValue(0); - fValue1.setValue(0); - // get 3 and 6km pressure (fValue) - float threekmPre = nsharpNative.nsharpLib.ipres(3000); - float sixkmPre = nsharpNative.nsharpLib.ipres(6000); - fValue1.setValue(0); - nsharpNative.nsharpLib.lapse_rate( fValue1, threekmPre,sixkmPre ); - if(nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("3-6km Agl Lapse Rate =M/%.1fC/Km", fValue1.getValue()); - } - else { - textStr = "3-6km Agl Lapse Rate = M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - //place holder for "STP (CIN)" - { - textStr = "STP(CIN) = M"; - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - curY = curY+charHeight; //move to new line - - - fValue.setValue(0); - fValue1.setValue(0); - nsharpNative.nsharpLib.vert_tot(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 850.0F, 500.0F ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("850-500mb Lapse Rate =%.0fC/%.1fC/Km",fValue.getValue(), fValue1.getValue()); - } - else { - textStr = "850-500mb Lapse Rate = M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - //place holder for "STP(fixed)" - { - textStr = "STP(fixed) = M"; - double [] lblXy7 = {firstToken,curY}; - shapeW.addLabel(textStr, lblXy7); - } - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - fValue1.setValue(0); - nsharpNative.nsharpLib.delta_t(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 700.0F, 500.0F ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("700-500mb Lapse Rate =%.0fC/%.1fC/Km",fValue.getValue(), fValue1.getValue()); - } - else { - textStr = "700-500mb Lapse Rate = M"; - } - { - double [] lblXy7 = {xbegin,curY}; - shapeW.addLabel(textStr, lblXy7); - } - //place holder for "SHIP" - { - textStr = "SHIP = M"; - double [] lblXy7 = {firstToken,curY}; - shapeR.addLabel(textStr, lblXy7); - } - - shapeR.compile(); - shapeW.compile(); - shapeY.compile(); - - try { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - target.drawWireframeShape(shapeW, NsharpConstants.color_white, 1); - target.drawWireframeShape(shapeY, NsharpConstants.color_yellow, 1); - target.drawWireframeShape(shapeR, NsharpConstants.color_red, 1); - target.clearClippingPlane(); - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - }*/ - public NsharpDrawPanels(NsharpBackgroundResource backgroundResource, IFont font) { - bkRsc = backgroundResource; - NsharpSkewTDescriptor desc = bkRsc.getDescriptor(); - if( desc != null) { - rsc = desc.getSkewtResource(); - } - if (bkRsc != null) { - panelRectArray[0] = bkRsc.getDataPanel1Background().getRectangle(); - panelRectArray[1] = bkRsc.getDataPanel2Background().getRectangle(); - //panelRectArray[2] = bkRsc.getDataPanel3Background().getRectangle(); - //panelRectArray[3] = bkRsc.getDataPanel4Background().getRectangle(); - } - myFont = font; - instance = this; - } - public void drawPanel(IGraphicsTarget target, int virtualPanelNumber, int dsiplayPanelNumber - ) throws VizException { - if(virtualPanelNumber > virtualPanelSize || dsiplayPanelNumber > NsharpConstants.dsiplayPanelSize) - return; - int physicalPanelNumber = dsiplayPanelNumber -1; - NsharpSkewTDescriptor desc = bkRsc.getDescriptor(); - NsharpSkewTResource rsc; - if( desc != null) { - rsc = desc.getSkewtResource(); - if(rsc != null) - nsharpNative = rsc.getNsharpNative(); - } - if(nsharpNative == null) - return; - //if(myFont == null) { - // myFont = target.initializeFont(fontName, 10, null); - //} - switch(virtualPanelNumber){ - case 1: - drawPanel1(target, panelRectArray[physicalPanelNumber]); - break; - case 2: - drawPanel2(target, panelRectArray[physicalPanelNumber]); - break; - case 3: - drawPanel3(target, panelRectArray[physicalPanelNumber]); - break; - case 4: - drawPanel4(target, panelRectArray[physicalPanelNumber]); - break; - case 5: - drawPanel5(target, panelRectArray[physicalPanelNumber]); - break; - case 6: - drawPanel6(target, panelRectArray[physicalPanelNumber]); - break; - case 7: - drawPanel7(target, panelRectArray[physicalPanelNumber]); - break; - case 8: - drawPanel8(target, panelRectArray[physicalPanelNumber]); - break; - case 9: - drawPanel9(target, panelRectArray[physicalPanelNumber]); - break; - case 10: - drawPanel10(target, panelRectArray[physicalPanelNumber]); - break; - default: - break; - } - } - public void setUserPickedParcelLine(Coordinate c) { - //make sure is in virtualPanel 1 as Parcel Line is defined in it. - if(rsc != null){ - if(rsc.getParcelLinesInPhysicalPanelNumber()==0) - return; - } - else - return; - //System.out.println("setUserPickedParcelLine c.y="+ c.y+ " parcelLineYStart="+ parcelLineYStart+" parcelLineYEnd="+parcelLineYEnd); - //make sure within parcel line area - if(c.y >= parcelLineYStart && c.y <=parcelLineYEnd){ - int index =((int)(c.y - parcelLineYStart))/ (int)charHeight; - if( index < NsharpNativeConstants.PARCEL_MAX){ - currentParcel = (short) (index + 1); - //System.out.println("setUserPickedParcelLine at "+ currentParcel); - //notify skewtRsc - rsc.updateParcelFromPanel(currentParcel); - } - } - } - @SuppressWarnings("deprecation") - private void drawPanel1(IGraphicsTarget target, Rectangle rect - ) throws VizException { - - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, 10, null); - /* - * Chin's NOTE:::: - * This pages based on newer version nsharp from SPC. We dont have source code as of 7/8/2010. - * Therefore, coding is purly based on a captured screen shot given by SPC's John Hart. - * This function is coded based on native nsharp codes which can be found - * in other pages's show functions. - * - * - */ - //if we can not Interpolates a temp with 700 mb pressure, then we dont have enough raw data - if ((nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0)) - { - target.drawString(myFont, " " +NO_DATA, rect.x, rect.y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - return; - } - - //call get_topBotPres to set p_top and p_bot - FloatByReference topPF= new FloatByReference(0); - FloatByReference botPF= new FloatByReference(0); - nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); - - String textStr, CAPE3Str="3CAPE= M", NCAPEStr = "NCAPE= M"; - curY=rect.y; - - // - // Start with Parcel Data - // - double widthGap = (rect.width-200)/6; - firstToken=rect.x+200.0; - secondToken=firstToken+widthGap; - thirdToken=secondToken+widthGap; - forthToken=thirdToken+widthGap; - fifthToken = forthToken+widthGap; - sixthToken = fifthToken+widthGap; - - target.drawString(myFont, "CAPE", firstToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "CINH", secondToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "LCL", thirdToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "LI", forthToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "LFC", fifthToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "EL", sixthToken, rect.y , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - parcelLineYStart = curY; - float layerPressure = 0; - - - //get current parcel type here to use it later - //if(NsharpParcelDialog.getAccess() != null){ - - //currentParcel = NsharpParcelDialog.getAccess().getCurrentParcel(); - //if(currentParcel == NsharpNativeConstants.PARCELTYPE_USER_DEFINED) - // layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - //else - //layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - //} - - //else {//default - use mU - // currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - // layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - //} - //get user selected parcel type - _lplvalues lpvls; - _parcel pcl; - for (short parcelNumber=1; parcelNumber <= NsharpNativeConstants.PARCEL_MAX ; parcelNumber++){ - if(parcelNumber == currentParcel ){ - PixelExtent pixExt = new PixelExtent(rect.x, rect.x+ rect.width-10,curY, curY+charHeight); - //target.setupClippingPlane(pixExt); - target.drawRect(pixExt, NsharpConstants.color_gold, 1.0f, 1.0f); - } - //call native define_parcel() with parcel type and user defined pressure (if user defined it) - textStr = NsharpNativeConstants.parcelToTypeStrMap.get(parcelNumber); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - float layerPressure1 = NsharpNativeConstants.parcelToLayerMap.get(parcelNumber); - if(parcelNumber == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){ - //get user selected parcel type, if available - if(NsharpParcelDialog.getAccess() != null){ - layerPressure1 = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - } - } - //System.out.println("drawPanel1-1 called define_parcel pType="+parcelNumber+" pre="+ layerPressure1); - - nsharpNative.nsharpLib.define_parcel(parcelNumber,layerPressure1); - - lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - //draw parcel name - //draw CAPE - if(pcl.bplus != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format( "%.0f", pcl.bplus), firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - else - target.drawString(myFont, "M", firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //draw CINH - if(pcl.bminus != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format("%.0f", pcl.bminus), secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - else - target.drawString(myFont, "M", secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //draw LCL - float lcl = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )); - if(lcl != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format("%.0fm", lcl), thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - else - target.drawString(myFont, "M", thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //draw LI - if(pcl.li5 != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format("%5.0f", pcl.li5), forthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - else - target.drawString(myFont, "M", forthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //draw LFC - float lfc = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres )); - if(lfc != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format("%.0fm", lfc), fifthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - else - target.drawString(myFont, "M", fifthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - // draw EL - float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres )); - if(el != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - target.drawString(myFont, String.format("%.0f'", NsharpConstants.metersToFeet.convert(el)), sixthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - else - target.drawString(myFont, "M", sixthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; - //get 3CAPE value for later to use - if(parcelNumber == NsharpNativeConstants.PARCELTYPE_MEAN_MIXING){ - if(nsharpNative.nsharpLib.qc(pcl.cape3km)==1) { - CAPE3Str = String.format("3CAPE=%.0fJ/kg", pcl.cape3km); - } - else { - CAPE3Str = "3CAPE= M"; - } - }//get NCAPE value for later to use - else if(parcelNumber == NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE){ - float j1 = pcl.bplus; - float j2 = nsharpNative.nsharpLib.ihght(pcl.elpres) - nsharpNative.nsharpLib.ihght(pcl.lfcpres); - if(nsharpNative.nsharpLib.qc(j1/j2)==1) { - NCAPEStr = String.format("NCAPE=%.2f",j1/j2); - } - else { - NCAPEStr = "NCAPE= M"; - } - } - } - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - parcelLineYEnd= curY; - if(currentParcel == NsharpNativeConstants.PARCELTYPE_USER_DEFINED){ - if(NsharpParcelDialog.getAccess() != null){ - layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - } - else - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - } - else - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - //System.out.println("drawPanel1-2 called define_parcel pType="+currentParcel+" pre="+ layerPressure); - - //reset and define current parcel - nsharpNative.nsharpLib.define_parcel(currentParcel,layerPressure); - lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - // - // THERMO DYNAMIC DATA - // - firstToken = rect.x + rect.width/48*11; - secondToken = rect.x + rect.width/48*27; - thirdToken = rect.x + rect.width/48*38; - fValue.setValue(0); - nsharpNative.nsharpLib.precip_water(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("PW=%.2f in", fValue.getValue()); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - else { - target.drawString(myFont, "PW=M", rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - //3CAPE...value was retrieved earlier - target.drawString(myFont, CAPE3Str, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - fValue.setValue(0); - float wbzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(wbzft)==1) { - textStr = String.format("WBZ=%.0f'",wbzft); - } - else { - textStr = "WBZ= M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //WNDG - float wndg = nsharpNative.nsharpLib.damaging_wind(); - if(nsharpNative.nsharpLib.qc(wndg)==1) { - textStr = String.format("WNDG=%.2f",wndg); - } - else { - textStr = "WNDG= M"; - } - - target.drawString(myFont, textStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - nsharpNative.nsharpLib.k_index(fValue); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("K=%.0f",fValue.getValue()); - } - else { - textStr = "K= M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //DCAPE - //fValue1 will be used for DownT to use - float dcape= nsharpNative.nsharpLib.dcape(fValue, fValue1); - float downT = fValue1.getValue(); - if(nsharpNative.nsharpLib.qc(dcape)==1) { - textStr = String.format("DCAPE=%.0fJ/kg",dcape); - } - else { - textStr = "DCAPE= M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //FZL - fValue.setValue(0); - float fgzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(fgzft)==1) { - textStr = String.format("FZL=%.0f'",fgzft); - } - else { - textStr = "FZL= M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //ESP - float esp= nsharpNative.nsharpLib.esp(); - if(nsharpNative.nsharpLib.qc(esp)==1) { - textStr = String.format("ESP=%.2f",esp); - } - else { - textStr = "ESP= M"; - } - target.drawString(myFont, textStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - //MidRH - nsharpNative.nsharpLib.get_surface(fValue1, fValue2, fValue3); //fValue 2 and fValue3 are not of concern here - nsharpNative.nsharpLib.mean_relhum( fValue, fValue1.getValue() - 150, fValue1.getValue() - 350 ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("MidRH=%.0f%c",fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = "MidRH = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //DownT - downT = nsharpNative.nsharpLib.ctof(downT) ; //convert to F - if(nsharpNative.nsharpLib.qc( downT)==1) { - textStr = String.format("DownT=%.0fF",downT); - } - else { - textStr = "DownT= M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //ConvT - fValue.setValue(0); - float conTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.cnvtv_temp( fValue, -1)); - - if(nsharpNative.nsharpLib.qc( conTempF )==1) { - textStr = String.format("ConvT=%.0fF",conTempF); - } - else { - textStr = "ConvT = M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //MMP: Coniglio MCS Maintenance Parameter - float mmp = nsharpNative.nsharpLib.coniglio1(); - if(nsharpNative.nsharpLib.qc( mmp )==1) { - textStr = String.format("MMP=%.2f",mmp); - } - else { - textStr = "MMP= M"; - } - target.drawString(myFont, textStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - fValue1.setValue(0); - // get surface pressure (fValue1) before getting mean LRH value - nsharpNative.nsharpLib.get_surface(fValue1, fValue2, fValue3); //fValue 2 and fValue3 are not of concern here - nsharpNative.nsharpLib.mean_relhum( fValue, -1.0F, fValue1.getValue() - 150 ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - //textStr = NsharpNativeConstants.THERMO_MEANLRH_LINE; - textStr = String.format("LowRH=%.0f%c",fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = "LowRH = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_mixratio(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = String.format("MeanW=%.1fg/kg",fValue.getValue()); - } - else { - textStr = "MeanW = M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - fValue.setValue(0); - float maxT= nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.max_temp( fValue, -1)); - if(nsharpNative.nsharpLib.qc(maxT)==1) { - textStr = String.format("MaxT=%.0fF",maxT); - } - else { - textStr = "MaxT= M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //NCAPE - /*float j1 = pcl.bplus; - float j2 = nsharpNative.nsharpLib.ihght(pcl.elpres) - nsharpNative.nsharpLib.ihght(pcl.lfcpres); - if(nsharpNative.nsharpLib.qc(j1/j2)==1) { - textStr = String.format("NCAPE=%.2f",j1/j2); - } - else { - textStr = "NCAPE= M"; - } */ - target.drawString(myFont, NCAPEStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; //move to new line - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - //draw a vertical line from 2/3 of x axis - firstToken = rect.x + rect.width/3*2+ 50; - target.drawLine(firstToken-10, curY, 0.0, firstToken-10, rect.y+rect.height, 0.0, NsharpConstants.color_white, 1); - - // more thermodynamic data - // the following follow show_parcel_new() at xwvid.c of bigNsharp implementation - // sfc-3km Lapse rate - // - float htsfc =0; - float tDelta = nsharpNative.nsharpLib.aglT(0, 3000); - fValue.setValue(0); - // get surface pressure (fValue) - nsharpNative.nsharpLib.get_surface(fValue, fValue1, fValue2); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - htsfc = nsharpNative.nsharpLib.ihght(fValue.getValue()); - // get sfc to (sfc+ 3 km) pressure (fValue) - float threekmPre = nsharpNative.nsharpLib.ipres(htsfc+3000); - fValue1.setValue(0); - nsharpNative.nsharpLib.lapse_rate( fValue1, fValue.getValue(), threekmPre ); - if(nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("sfc-3km AglLapseRate=%.0fC/%.1fC/km", tDelta, fValue1.getValue()); - } - else { - textStr = "sfc-3km AglLapseRate= M"; - } - } - else { - textStr = "sfc-3km AglLapseRate= M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - //"Supercell" - NsharpSkewTResource rsc = bkRsc.getDescriptor().getSkewtResource(); - float smdir = rsc.getSmWindDir();//bkRsc.getSmDir(); #10438 - float smspd = rsc.getSmWindSpd();//bkRsc.getSmSpd(); - float superCell = nsharpNative.nsharpLib.scp(smdir, smspd); - if(nsharpNative.nsharpLib.qc(superCell)==1) { - textStr = String.format("Supercell=%.1f",superCell); - } - else { - textStr = "Supercell = M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; //move to new line - - // 3km-6km Lapse rate - fValue.setValue(0); - fValue1.setValue(0); - tDelta = nsharpNative.nsharpLib.aglT(3000, 6000); - // get 3 and 6km pressure (fValue) - float threekmPre = nsharpNative.nsharpLib.ipres(htsfc+3000); - float sixkmPre = nsharpNative.nsharpLib.ipres(htsfc+6000); - fValue1.setValue(0); - nsharpNative.nsharpLib.lapse_rate( fValue1, threekmPre,sixkmPre ); - if(nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("3-6km AglLapseRate=%.0fC/%.1fC/km", tDelta, fValue1.getValue()); - - } - else { - textStr = "3-6km AglLapseRate = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - // "STP (CIN)" - float cin = nsharpNative.nsharpLib.sigtorn_cin(smdir, smspd); - if(nsharpNative.nsharpLib.qc(cin)==1) { - textStr = String.format("STP(CIN)=%.1f",cin); - } - else { - textStr = "STP(CIN) = M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; //move to new line - - - fValue.setValue(0); - fValue1.setValue(0); - //nsharpNative.nsharpLib.vert_tot(fValue); - float delta= nsharpNative.nsharpLib.itemp(850) - nsharpNative.nsharpLib.itemp(500); - nsharpNative.nsharpLib.lapse_rate( fValue1, 850.0F, 500.0F ); - if(nsharpNative.nsharpLib.qc(delta)==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("850-500mb LapseRate=%3.0fC/%3.1fC/km",delta, fValue1.getValue()); - } - else { - textStr = "850-500mb LapseRate = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - // "STP(fixed)" - float fixedStp = nsharpNative.nsharpLib.sigtorn_fixed(smdir, smspd); - if(nsharpNative.nsharpLib.qc(fixedStp)==1) { - textStr = String.format("STP(fixed)=%.1f",fixedStp); - } - else { - textStr = "STP(fixed) = M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY+charHeight; //move to new line - - fValue.setValue(0); - fValue1.setValue(0); - //nsharpNative.nsharpLib.delta_t(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 700.0F, 500.0F ); - delta= nsharpNative.nsharpLib.itemp(700) - nsharpNative.nsharpLib.itemp(500); - if(nsharpNative.nsharpLib.qc(/*fValue.getValue())*/delta)==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = String.format("700-500mb LapseRate=%3.0fC/%3.1fC/km",delta/*fValue.getValue()*/, fValue1.getValue()); - } - else { - textStr = "700-500mb LapseRate = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - // "SHIP" - float ship = nsharpNative.nsharpLib.cave_ship(); - if(nsharpNative.nsharpLib.qc(ship)==1) { - textStr = String.format("SHIP=%4.1f",ship); - } - else - textStr = "SHIP = M"; - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //System.out.println("shop="+ship); - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel2(IGraphicsTarget target, Rectangle rect) - throws VizException { - /* - * Chin's NOTE:::: - * This pages based on BigNsharp - * show_shear_new() at xwvid3.c - * - */ - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, 10, null); - curY= rect.y; - String textStr; - - //if we can not Interpolates a temp with 700 mb pressure, then we dont have enough raw data - if (nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0) - { - target.drawString(myFont, " " +NO_DATA, rect.x, rect.y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - return; - } - - // - // Start with Header SRH(m%c/s%c) Shear(kt) MnWind SRW - // - firstToken=rect.x+200.0; - secondToken=firstToken+140; - thirdToken=secondToken+120; - forthToken=thirdToken+120; - - textStr = String.format("SRH(m%c/s%c)",NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "Shear(kt)", secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "MnWind", thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - target.drawString(myFont, "SRW", forthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - FloatByReference smdir=new FloatByReference(0), smspd = new FloatByReference(0); - nsharpNative.nsharpLib.get_storm(smspd, smdir); - FloatByReference topPF= new FloatByReference(0); - FloatByReference botPF= new FloatByReference(0); - nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); - //System.out.println("top="+topPF.getValue()+" bot="+botPF.getValue()); - for (int i =0; i< NsharpNativeConstants.STORM_MOTION_TYPE_STR1.length; i++){ - float h1, h2; - if(NsharpNativeConstants.STORM_MOTION_TYPE_STR1[i].equals("Eff Inflow Layer")){ - - if(botPF.getValue()>0){ - h1 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(botPF.getValue())); - h2 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(topPF.getValue())); - } - else{ - h1=-999; - h2=-999; - } - } - else { - h1 = NsharpNativeConstants.STORM_MOTION_HEIGHT1[i][0]; - h2 = NsharpNativeConstants.STORM_MOTION_HEIGHT1[i][1]; - } - //h1 = NsharpNativeConstants.STORM_MOTION_HEIGHT1[i][0]; - //h2 = NsharpNativeConstants.STORM_MOTION_HEIGHT1[i][1]; - if(h1!=-999&& h2!=-999){ - //SRH - //calculate helicity - - float totHeli = nsharpNative.nsharpLib.helicity( h1, - h2, smdir.getValue(), smspd.getValue(), fValue, fValue1); - target.drawString(myFont, NsharpNativeConstants.STORM_MOTION_TYPE_STR1[i], rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //gc.drawText(NsharpNativeConstants.STORM_MOTION_TYPE_STR[i],0, textLineNumber*textHeight + graphLineNumber); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1&&nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - //textStr = NsharpNativeConstants.STORM_MOTION_TYPE_STR[i]+" %.0f"; - textStr = String.format("%.0f", totHeli); - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, firstToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //Calculate wind shear - //Note: -1 as first parameter indicating bottom layer is surface layer, see wind.c for wind_shear() source code - nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1))/*-1*/, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), - fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue3.getValue())==1) { - textStr = String.format("%.0f",fValue3.getValue()); - - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //Calculate mean wind - nsharpNative.nsharpLib.mean_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue2.getValue())==1&&nsharpNative.nsharpLib.qc(fValue3.getValue())==1) { - textStr = String.format("%.0f/%.0f",fValue2.getValue(), fValue3.getValue()); - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //calculate pressure-weighted SR mean wind - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), smdir.getValue(), smspd.getValue(), - fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue2.getValue())==1) { - textStr = String.format("%.0f/%.0f",fValue2.getValue(), fValue3.getValue()); - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, forthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - if(NsharpNativeConstants.STORM_MOTION_TYPE_STR1[i].equals("Eff Inflow Layer")){ - //draw bax around it - Rectangle rectangle = new Rectangle(rect.x,(int)curY,rect.width-10,(int)charHeight); - //System.out.println("rect.x="+ rectangle.x+ " y="+ rectangle.y+" w="+rectangle.width+ " h="+rectangle.height); - PixelExtent pixExt = new PixelExtent(rectangle); - target.drawRect(pixExt,NsharpConstants.color_gold, 1.0f, 1.0f); - } - } - curY = curY+charHeight; //move to new line - - } - float pres=0; - short oldlplchoice=3; - float sfctemp, sfcdwpt, sfcpres; - _lplvalues lpvls; - _parcel pcl; - lpvls = new _lplvalues(); - //nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - //sfctemp = lpvls.temp; - //sfcdwpt = lpvls.dwpt; - //sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - pcl = new _parcel(); - for (int i =0; i< NsharpNativeConstants.STORM_MOTION_TYPE_STR2.length; i++){ - float h1, h2; - - h1=-999; - h2=-999; - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - if(NsharpNativeConstants.STORM_MOTION_TYPE_STR2[i].equals("LCL-EL(Cloud Layer)")){ - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - if (pcl.bplus > 0) - { - h1 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres)); - h2 = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres)); - } - } - else if (NsharpNativeConstants.STORM_MOTION_TYPE_STR2[i].equals("Lower Half Storm Depth")){ - oldlplchoice = lpvls.flag; - nsharpNative.nsharpLib.define_parcel(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE, NsharpNativeConstants.MU_LAYER); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls);//regain lpvls value after defined parcel - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres)); - if (pcl.bplus >= 100.0) - { - - float base = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(botPF.getValue())); - float depth = (el - base); - h1 = base; - h2 = base + (depth * 0.5f); - - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - } - // set parcel back to user selection - if (oldlplchoice == 1) - pres = 0; - else if (oldlplchoice == 2) - pres = 0; - else if (oldlplchoice == 3) - pres = NsharpNativeConstants.MU_LAYER; - else if (oldlplchoice == 4) - pres = NsharpNativeConstants.MML_LAYER; - else if (oldlplchoice == 5) - pres = NsharpNativeConstants.USER_LAYER; - else if (oldlplchoice == 6) - pres = NsharpNativeConstants.MU_LAYER; - //System.out.println("drawPanel2-2 called define_parcel pType="+oldlplchoice+" pre="+ pres); - - nsharpNative.nsharpLib.define_parcel(oldlplchoice, pres); - } - else { - h1 = NsharpNativeConstants.STORM_MOTION_HEIGHT2[i][0]; - h2 = NsharpNativeConstants.STORM_MOTION_HEIGHT2[i][1]; - } - if(h1!=-999&& h2!=-999){ - //SRH - //calculate helicity - float totHeli = nsharpNative.nsharpLib.helicity( h1, - h2, smdir.getValue(), smspd.getValue(), fValue, fValue1); - target.drawString(myFont, NsharpNativeConstants.STORM_MOTION_TYPE_STR2[i], rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //gc.drawText(NsharpNativeConstants.STORM_MOTION_TYPE_STR[i],0, textLineNumber*textHeight + graphLineNumber); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1&&nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - //textStr = NsharpNativeConstants.STORM_MOTION_TYPE_STR[i]+" %.0f"; - textStr = String.format("%.0f", totHeli); - } - else { - textStr = "M"; - } - // SR Helicity is not shown for these 4 storm motions, see oroginal BigNsharp show_shear_new() - //target.drawString(myFont, textStr, firstToken, curY , 0.0, - // TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - // VerticalAlignment.TOP, null); - - //Calculate wind shear - //Note: -1 as first parameter indicating bottom layer is surface layer, see wind.c for wind_shear() source code - nsharpNative.nsharpLib.wind_shear( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), - fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue3.getValue())==1) { - textStr = String.format("%.0f",fValue3.getValue()); - - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, secondToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //Calculate mean wind - nsharpNative.nsharpLib.mean_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue2.getValue())==1&&nsharpNative.nsharpLib.qc(fValue3.getValue())==1) { - textStr = String.format("%.0f/%.0f",fValue2.getValue(), fValue3.getValue()); - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, thirdToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //calculate pressure-weighted SR mean wind - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h1)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(h2)), smdir.getValue(), smspd.getValue(), - fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue2.getValue())==1) { - textStr = String.format("%.0f/%.0f",fValue2.getValue(), fValue3.getValue()); - } - else { - textStr = "M"; - } - target.drawString(myFont, textStr, forthToken, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - if (NsharpNativeConstants.STORM_MOTION_TYPE_STR2[i].equals("Lower Half Storm Depth")){ - //draw bax around it - Rectangle rectangle = new Rectangle(rect.x,(int)curY,rect.width-10,(int)charHeight); - //System.out.println("rect.x="+ rectangle.x+ " y="+ rectangle.y+" w="+rectangle.width+ " h="+rectangle.height); - PixelExtent pixExt = new PixelExtent(rectangle); - target.drawRect(pixExt,NsharpConstants.color_gold, 1.0f, 1.0f); - } - } - curY = curY+charHeight; //move to new line - - - } - - //target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - //BRN Shear - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - // current parcel is reset earlief already we dont have to call define_parcel() again. - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - - nsharpNative.nsharpLib.cave_bulk_rich2( fValue ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) - textStr = String.format("BRN Shear = %.0f m%c/s%c",fValue.getValue(),NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - else - textStr = "BRN Shear = M"; - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - //4-6km srw - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(4000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), smdir.getValue(), smspd.getValue(), - fValue, fValue1,fValue2, fValue3); - if(nsharpNative.nsharpLib.qc(fValue2.getValue())==1) { - textStr = String.format("4-6km SR Wind = %.0f/%.0f kt",fValue2.getValue(), fValue3.getValue()); - } - else { - textStr = "4-6km SR Wind = M"; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - - //Corfidi Downshear, we use fValue3, fValue4 only by calling corfidi_MCS_motion - nsharpNative.nsharpLib.corfidi_MCS_motion(fValue1, fValue2, fValue3, fValue4, fValue5, fValue6, fValue7, fValue8); - textStr = String.format("Corfidi Downshear = %4.0f/%.0f kt",fValue3.getValue(), fValue4.getValue()); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - - //Corfidi Upshear, we use fValue7, fValue8 only by calling corfidi_MCS_motion - textStr = String.format("Corfidi Upshear = %4.0f/%.0f kt",fValue7.getValue(), fValue8.getValue()); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - - //Bunkers Right - nsharpNative.nsharpLib.bunkers_storm_motion(fValue1, fValue2, fValue3, fValue4); - textStr = String.format("Bunkers Right = %4.0f/%.0f kt",fValue3.getValue(), fValue4.getValue()); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - //Bunkers Left - nsharpNative.nsharpLib.bunkers_left_motion(fValue1, fValue2, fValue3, fValue4); - textStr = String.format("Bunkers Left = %4.0f/%.0f kt",fValue3.getValue(), fValue4.getValue()); - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - textStr = "1km"; - target.drawString(myFont, textStr, rect.x+370, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - textStr = " & "; - target.drawString(myFont, textStr, rect.x+420, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - textStr = "6km"; - target.drawString(myFont, textStr, rect.x+450, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - textStr = " AGL Wind Barbs"; - target.drawString(myFont, textStr, rect.x+500, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY+charHeight; //move to new line - - // STPC(test) - test STP using cape6km - //Chin Note: BigNsharp sigtorn_test always return -9999..a bug - float stpTest = nsharpNative.nsharpLib.sigtorn_test(smdir.getValue(), smspd.getValue()); - //System.out.println("smdir="+smdir.getValue()+"smspd="+ smspd.getValue()+"stpTest="+stpTest+ - // "p_bot="+botPF.getValue()+"p_top="+topPF.getValue()); - if(nsharpNative.nsharpLib.qc(stpTest)==1) - textStr = String.format("STPC(test) = %4.1f", stpTest); - else - textStr = "STPC(test) = M"; - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - //1 km wind barb - firstToken = rect.x+ rect.width * 3/4; - double yOri = curY-150; - double barbScaleF= 25; - List barb = WindBarbFactory.getWindGraphics( - (double)nsharpNative.nsharpLib.iwspd(nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(1000))), - (double)nsharpNative.nsharpLib.iwdir(nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(1000)))); - if (barb != null) { - WindBarbFactory.scaleBarb(barb, barbScaleF); - - double cur0X=firstToken, cur0Y=yOri, cur1X=firstToken, cur1Y=yOri,newY=0; - WindBarbFactory.translateBarb(barb,cur0X ,yOri ); - - for (LineStroke stroke : barb) { - Coordinate point = stroke.getPoint(); - // Chin NOte; when using WindBarbFactory.getWindGraphics() to create barb, the Y axis is growing - // upwards. However, on this canvas, Y axis is growing downwards. Therefore, the following Y coordinate - // adjustment is necessary. - // - newY = yOri - (point.y - yOri ); - // Note: stroke.render(gc, relativeX, relativeY) is not working here. Therefore, need to - // draw wind barb ourself. - if(stroke.getType() == "M"){ - cur0X = point.x; - cur0Y = newY; - } - else if(stroke.getType() == "D"){ - cur1X = point.x; - cur1Y = newY; - target.drawLine(cur0X,cur0Y, 0.0, cur1X, cur1Y,0.0, NsharpConstants.color_red, 1); - // bsteffen added these two lines to fix 50 kts wind barbs - cur0X = cur1X; - cur0Y = cur1Y; - } - } - } - //6 km wind barb - barb.clear(); - barb = WindBarbFactory.getWindGraphics( - (double)nsharpNative.nsharpLib.iwspd(nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000))), - (double)nsharpNative.nsharpLib.iwdir(nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)))); - if (barb != null) { - WindBarbFactory.scaleBarb(barb, barbScaleF); - - double cur0X=firstToken, cur0Y=yOri, cur1X=firstToken, cur1Y=yOri,newY=0; - WindBarbFactory.translateBarb(barb,cur0X ,yOri ); - - for (LineStroke stroke : barb) { - Coordinate point = stroke.getPoint(); - // Chin NOte; when using WindBarbFactory.getWindGraphics() to create barb, the Y axis is growing - // upwards. However, on this canvas, Y axis is growing downwards. Therefore, the following Y coordinate - // adjustment is necessary. - newY = yOri - (point.y - yOri ); - // - // Note: stroke.render(gc, relativeX, relativeY) is not working here. Therefore, need to - // draw wind barb ourself. - if(stroke.getType() == "M"){ - cur0X = point.x; - cur0Y = newY; - } - else if(stroke.getType() == "D"){ - cur1X = point.x; - cur1Y = newY; - target.drawLine(cur0X,cur0Y, 0.0, cur1X, cur1Y,0.0, NsharpConstants.color_cyan, 1); - // bsteffen added these two lines to fix 50 kts wind barbs - cur0X = cur1X; - cur0Y = cur1Y; - } - } - } - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel3(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - //Chin's NOTE::::this function is coded based on native nsharp show_parcel() in xwvid3.c - // moved from NsharpPaletteWindow.showParcelData() - - - //if we can not Interpolates a temp with 700 mb pressure, then we dont have enough raw data - if (nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(700.0F)) == 0) - return; - String title = NsharpNativeConstants.PARCEL_DATA_STR; - - target.drawString(myFont, title, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - - String hdrStr; - //short currentParcel; - float layerPressure = 0;; - //get user selected parcel type - hdrStr = NsharpNativeConstants.parcelToHdrStrMap.get(currentParcel); - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - if(currentParcel == NsharpNativeConstants.PARCELTYPE_USER_DEFINED ){ - if(NsharpParcelDialog.getAccess() != null){ - layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - } - - hdrStr = String.format(hdrStr, layerPressure); - } - curY = curY + charHeight; - target.drawString(myFont, hdrStr, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - //call native define_parcel() with parcel type and user defined pressure (if user defined it) - nsharpNative.nsharpLib.define_parcel(currentParcel,layerPressure); - - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - _parcel pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - textStr = NsharpNativeConstants.PARCEL_LPL_LINE_; - textStr = String.format(textStr, (int)pcl.lplpres,(int)pcl.lpltemp,(int)pcl.lpldwpt, - (int)nsharpNative.nsharpLib.ctof(pcl.lpltemp),(int)nsharpNative.nsharpLib.ctof(pcl.lpldwpt)); - // Chin: note: target.drawString does NOT handle formatted string. For example, "ABC\tabc" will be printed - // as "ABCabc" So, we have to add '_' to separate each value when formatting String. - // Then, use String.split() to have each value in a sub-string. - - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - curY = curY + 2*charHeight; - - if(nsharpNative.nsharpLib.qc(pcl.bplus)==1){ - textStr = NsharpNativeConstants.PARCEL_CAPE_LINE; - textStr = String.format(textStr,pcl.bplus); - } - else { - textStr = NsharpNativeConstants.PARCEL_CAPE_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - if(nsharpNative.nsharpLib.qc(pcl.li5)==1){ - textStr = NsharpNativeConstants.PARCEL_LI_LINE; - textStr = String.format(textStr,pcl.li5); - } - else { - textStr = NsharpNativeConstants.PARCEL_LI_MISSING; - } - target.drawString(myFont, textStr, rect.x+rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - if(nsharpNative.nsharpLib.qc(pcl.bfzl)==1){ - textStr = NsharpNativeConstants.PARCEL_BFZL_LINE; - textStr = String.format(textStr,pcl.bfzl); - } - else{ - textStr = NsharpNativeConstants.PARCEL_BFZL_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - if(nsharpNative.nsharpLib.qc(pcl.limax)==1){ - textStr = NsharpNativeConstants.PARCEL_LIMIN_LINE; - textStr = String.format(textStr,pcl.limax,pcl.limaxpres); - } - else{ - textStr = NsharpNativeConstants.PARCEL_LIMIN_MISSING; - } - target.drawString(myFont, textStr, rect.x+rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - if(nsharpNative.nsharpLib.qc(pcl.bminus)==1){ - textStr = NsharpNativeConstants.PARCEL_CINH_LINE; - textStr = String.format(textStr,pcl.bminus); - } - else { - textStr = NsharpNativeConstants.PARCEL_CINH_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - if(nsharpNative.nsharpLib.qc(pcl.cap)==1){ - textStr = NsharpNativeConstants.PARCEL_CAP_LINE; - textStr = String.format(textStr, pcl.cap, pcl.cappres); - } - else { - textStr = NsharpNativeConstants.PARCEL_CAP_MISSING; - } - target.drawString(myFont, textStr, rect.x+rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + 2* charHeight; - - - textStr = NsharpNativeConstants.PARCEL_LEVEL_LINE_; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - if(nsharpNative.nsharpLib.qc(pcl.lclpres)==1&& - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres ))))==1 ) - { - textStr = NsharpNativeConstants.PARCEL_LCL_LINE_; - textStr = String.format(textStr,pcl.lclpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )))); - } - else { - textStr = NsharpNativeConstants.PARCEL_LCL_MISSING_; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(pcl.lfcpres)==1 && - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres ))))==1 && - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(pcl.lfcpres ))==1) - { - textStr = NsharpNativeConstants.PARCEL_LFC_LINE_; - textStr = String.format(textStr,pcl.lfcpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres ))), - nsharpNative.nsharpLib.itemp(pcl.lfcpres )); - } - else { - textStr = NsharpNativeConstants.PARCEL_LFC_MISSING_; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(pcl.elpres) ==1&& - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres )))) ==1&& - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(pcl.elpres ))==1) - { - textStr = NsharpNativeConstants.PARCEL_EL_LINE_; - textStr = String.format(textStr,pcl.elpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres ))), - nsharpNative.nsharpLib.itemp(pcl.elpres )); - } - else { - textStr = NsharpNativeConstants.PARCEL_EL_MISSING_; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(pcl.mplpres)==1 && - nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.mplpres ))))==1 ) - { - textStr = NsharpNativeConstants.PARCEL_MPL_LINE_; - textStr = String.format(textStr,pcl.mplpres, nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.mplpres )))); - } - else { - textStr = NsharpNativeConstants.PARCEL_MPL_MISSING_; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - /* - * Compute CCL (TL) - */ - /* - FloatByReference pccl = new FloatByReference(0); - FloatByReference tccl = new FloatByReference(0); - FloatByReference zccl = new FloatByReference(0); - nsharpNative.nsharpLib.cave_ccl (-9999.F, pccl, tccl, zccl); - System.out.println (" \n\n surface-based CCL "); - System.out.println (" pccl (mb): " + pccl.getValue() ); - System.out.println (" tccl (C): " + tccl.getValue() ); - System.out.println (" zccl (m): " + zccl.getValue() ); - */ - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel4(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String textStr; - curY = rect.y; - - /* - * Chin's NOTE::::this function is coded based on legacy native nsharp software show_thermoparms(), - * show_moisture(),show_instability() in xwvid3.c - * - * Moved from NsharpPaletteWindow.showThermoparms() - */ - - target.drawString(myFont, NsharpNativeConstants.THERMO_DATA_STR, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - target.drawString(myFont, NsharpNativeConstants.THERMO_MOISTURE_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - nsharpNative.nsharpLib.precip_water(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_PWATER_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_PWATER_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_relhum(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_MEANRH_LINE; - textStr = String.format(textStr,fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANRH_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - nsharpNative.nsharpLib.mean_mixratio(fValue, -1.0F, -1.0F); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_MEANW_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANW_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - fValue.setValue(0); - fValue1.setValue(0); - // get surface pressure (fValue1) before getting mean LRH value - nsharpNative.nsharpLib.get_surface(fValue1, fValue2, fValue3); //fValue 2 and fValue3 are not of concern here - nsharpNative.nsharpLib.mean_relhum( fValue, -1.0F, fValue1.getValue() - 150 ); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_MEANLRH_LINE; - textStr = String.format(textStr,fValue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.THERMO_MEANLRH_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - nsharpNative.nsharpLib.top_moistlyr(fValue); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_TOP_LINE; - textStr = String.format(textStr,fValue.getValue(),nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(fValue.getValue())))); - } - else { - textStr = NsharpNativeConstants.THERMO_TOP_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - //instability data--------------// - //yellow and bold for parcel header - target.drawString(myFont, NsharpNativeConstants.THERMO_INSTABILITY_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - curY = curY + charHeight; - - - fValue.setValue(0); - fValue1.setValue(0); - - nsharpNative.nsharpLib.delta_t(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 700.0F, 500.0F ); - - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_700500mb_LINE; - textStr = String.format(textStr,fValue.getValue(), fValue1.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_700500mb_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - fValue1.setValue(0); - - nsharpNative.nsharpLib.vert_tot(fValue); - nsharpNative.nsharpLib.lapse_rate( fValue1, 850.0F, 500.0F ); - - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1 && nsharpNative.nsharpLib.qc(fValue1.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_850500mb_LINE; - textStr = String.format(textStr,fValue.getValue(), fValue1.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_850500mb_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - //misc parameters data--------------// - target.drawString(myFont, NsharpNativeConstants.THERMO_MISC_PARMS_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - fValue.setValue(0); - fValue1.setValue(0); - fValue2.setValue(0); - nsharpNative.nsharpLib.t_totals(fValue, fValue1, fValue2); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_TOTAL_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_TOTAL_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - fValue.setValue(0); - nsharpNative.nsharpLib.k_index(fValue); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_KINDEX_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_KINDEX_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - nsharpNative.nsharpLib.sweat_index(fValue); - if(nsharpNative.nsharpLib.qc(fValue.getValue())==1) { - textStr = NsharpNativeConstants.THERMO_SWEAT_LINE; - textStr = String.format(textStr,fValue.getValue()); - } - else { - textStr = NsharpNativeConstants.THERMO_SWEAT_MISSING; - } - - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - fValue.setValue(0); - float maxTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.max_temp( fValue, -1)); - if(nsharpNative.nsharpLib.qc(maxTempF)==1) { - textStr = NsharpNativeConstants.THERMO_MAXT_LINE; - textStr = String.format(textStr,maxTempF); - } - else { - textStr = NsharpNativeConstants.THERMO_MAXT_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - fValue.setValue(0); - float theDiff = nsharpNative.nsharpLib.ThetaE_diff( fValue); - if(nsharpNative.nsharpLib.qc(theDiff)==1) { - textStr = NsharpNativeConstants.THERMO_THETAE_LINE; - textStr = String.format(textStr,theDiff); - } - else { - textStr = NsharpNativeConstants.THERMO_THETAE_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - fValue.setValue(0); - float conTempF = nsharpNative.nsharpLib.ctof(nsharpNative.nsharpLib.cnvtv_temp( fValue, -1)); - if(nsharpNative.nsharpLib.qc(conTempF)==1) { - textStr = NsharpNativeConstants.THERMO_CONVT_LINE; - textStr = String.format(textStr,conTempF); - } - else { - textStr = NsharpNativeConstants.THERMO_CONVT_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - fValue.setValue(0); - float wbzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(wbzft)==1) { - textStr = NsharpNativeConstants.THERMO_WBZ_LINE; - textStr = String.format(textStr,wbzft); - } - else { - textStr = NsharpNativeConstants.THERMO_WBZ_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - fValue.setValue(0); - float fgzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fValue )))); - if(nsharpNative.nsharpLib.qc(fgzft)==1) { - textStr = NsharpNativeConstants.THERMO_FGZ_LINE; - textStr = String.format(textStr,fgzft); - } - else { - textStr = NsharpNativeConstants.THERMO_FGZ_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel5(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_gradient() - * in xwvid3.c - */ - FloatByReference Surfpressure= new FloatByReference(0); - FloatByReference surfTemp= new FloatByReference(0); - FloatByReference surfDewpt= new FloatByReference(0); - target.drawString(myFont, NsharpNativeConstants.OPC_LOW_LEVEL_STR, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - target.drawString(myFont, NsharpNativeConstants.OPC_SURFACE975_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - textStr = NsharpNativeConstants.OPC_LEVEL_LINE_; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - - float ht = nsharpNative.nsharpLib.ihght(975); - if(ht == NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - textStr = NsharpNativeConstants.OPC_975_LINE_MISSING_; - else{ - textStr = NsharpNativeConstants.OPC_975_LINE_; - textStr = String.format(textStr, nsharpNative.nsharpLib.ihght(975), nsharpNative.nsharpLib.itemp(975)); - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - ht=0; - // get surface pressure (fValue1), Surface_temp (fValue2) - nsharpNative.nsharpLib.get_surface(Surfpressure, surfTemp, surfDewpt); - if(nsharpNative.nsharpLib.qc(Surfpressure.getValue())==1) - ht = nsharpNative.nsharpLib.ihght( Surfpressure.getValue() ); - if(nsharpNative.nsharpLib.qc(Surfpressure.getValue())==1 && nsharpNative.nsharpLib.qc(surfTemp.getValue())==1) { - textStr = NsharpNativeConstants.OPC_SURFACE_LINE_; - textStr = String.format(textStr,Surfpressure.getValue(), ht,surfTemp.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_SURFACE_MISSING_; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - /* ----- Sfc-975 Grad ----- */ - /* make sure both 975mb layer and surface layer temperatures are available */ - if(nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.itemp(975))==1 && nsharpNative.nsharpLib.qc(surfTemp.getValue())==1){ - textStr = NsharpNativeConstants.OPC_975_SURFACE_LINE; - textStr = String.format(textStr,nsharpNative.nsharpLib.itemp(975)-surfTemp.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_975_SURFACE_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_inversion() - * in xwvid3.c - * - * inv_mb - Pressure of inversion level (mb) - * inv_dC - Change in temperature (C) - * - */ - FloatByReference inv_mb= new FloatByReference(0); - FloatByReference inv_dC= new FloatByReference(0); - ; - //yellow and bold for parcel header - target.drawString(myFont, NsharpNativeConstants.OPC_LOWEST_INV_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - nsharpNative.nsharpLib.low_inv(inv_mb, inv_dC); - if(nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.ihght(inv_mb.getValue()))==1) { - textStr = NsharpNativeConstants.OPC_BASEHEIGHT_LINE; - textStr = String.format(textStr,nsharpNative.nsharpLib.ihght(inv_mb.getValue())); - } - else { - textStr = NsharpNativeConstants.OPC_BASEHEIGHT_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(inv_mb.getValue())==1) { - textStr = NsharpNativeConstants.OPC_BASEPRESSURE_LINE; - textStr = String.format(textStr,inv_mb.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_BASEPRESSURE_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(inv_dC.getValue())==1) { - textStr = NsharpNativeConstants.OPC_CHANGE_IN_TEMP_LINE; - textStr = String.format(textStr,inv_dC.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_CHANGE_IN_TEMP_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel6(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_mixheight() - * in xwvid3.c - * Calculates the mixing height using legacy mix_height() - * - * void mix_height ( float *mh_mb, float *mh_drct, float *mh_sped, - * float *mh_dC, float *mh_lr, float *mh_drct_max, - * float *mh_sped_max, short flag ) - * - * Where: - * flag = 0 Surface-based lapse rate - * flag = 1 Layer-based lapse rate - * - * mh_mb - Pressure at mixing height (mb) - * mh_drct - Wind direction at mixing height (deg) - * mh_sped - Wind speed at mixing height (kt) - * mh_dC - Layer change in temperature (C) - * mh_lr - Layer lapse rate (C/km) - * mh_drct_max - Layer maximum wind direction (deg) - * mh_sped_max - Layer maximum wind speed (kt) - */ - FloatByReference mh_mb= new FloatByReference(0); - FloatByReference mh_drct= new FloatByReference(0); - FloatByReference mh_sped= new FloatByReference(0); - FloatByReference mh_dC= new FloatByReference(0); - FloatByReference mh_lr= new FloatByReference(0); - FloatByReference mh_drct_max= new FloatByReference(0); - FloatByReference mh_sped_max= new FloatByReference(0); - short flag; - - //yellow and bold for parcel header - target.drawString(myFont, NsharpNativeConstants.OPC_MIXING_HGT_STR, rect.x + rect.width /10, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - textStr = NsharpNativeConstants.OPC_DRY_AD_LINE; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - textStr = NsharpNativeConstants.OPC_THRESH_LAPSE_LINE; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - // Cyan color for Layer Based string - target.drawString(myFont, NsharpNativeConstants.OPC_LAYER_BASED_STR, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - // calculate Layer-based lapse rate data - flag = 1; - nsharpNative.nsharpLib.mix_height(mh_mb,mh_drct,mh_sped,mh_dC,mh_lr,mh_drct_max,mh_sped_max,flag); - - - if(nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.ihght(mh_mb.getValue()))==1) { - textStr = NsharpNativeConstants.OPC_MIXINGHEIGHT_LINE; - textStr = String.format(textStr,nsharpNative.nsharpLib.ihght(mh_mb.getValue())); - } - else { - textStr = NsharpNativeConstants.OPC_MIXINGHEIGHT_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_mb.getValue())==1) { - textStr = NsharpNativeConstants.OPC_MIXINGPRESSURE_LINE; - textStr = String.format(textStr,mh_mb.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_MIXINGPRESSURE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_drct.getValue())==1 && nsharpNative.nsharpLib.qc(mh_sped.getValue())==1) { - textStr = NsharpNativeConstants.OPC_TOPMIXLAYER_LINE; - //System.out.println("speed = " + mh_sped.getValue()); - textStr = String.format(textStr,(int)mh_drct.getValue(),NsharpConstants.DEGREE_SYMBOL,(int)(mh_sped.getValue())); - } - else { - textStr = NsharpNativeConstants.OPC_TOPMIXLAYER_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_drct_max.getValue()) ==1 && nsharpNative.nsharpLib.qc(mh_sped_max.getValue())==1) { - textStr = NsharpNativeConstants.OPC_MIXLAYERMAX_LINE; - textStr = String.format(textStr,(int)mh_drct_max.getValue(),NsharpConstants.DEGREE_SYMBOL,(int)mh_sped_max.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_MIXLAYERMAX_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_dC.getValue()) ==1 && nsharpNative.nsharpLib.qc(mh_lr.getValue())==1) { - textStr = NsharpNativeConstants.OPC_LAYER_LAPSE_LINE; - textStr = String.format(textStr,mh_dC.getValue(),mh_lr.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_LAYER_LAPSE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - - // Purple color for Layer Based string - target.drawString(myFont, NsharpNativeConstants.OPC_SURFACE_BASED_STR, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_violet, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - // calculate Surface-based lapse rate data - flag = 0; - mh_mb.setValue(0); - mh_drct.setValue(0); - mh_sped.setValue(0); - mh_dC.setValue(0); - mh_lr.setValue(0); - mh_drct_max.setValue(0); - mh_sped_max.setValue(0);; - nsharpNative.nsharpLib.mix_height(mh_mb,mh_drct,mh_sped,mh_dC,mh_lr,mh_drct_max,mh_sped_max,flag); - - //white color for text - if(nsharpNative.nsharpLib.qc(nsharpNative.nsharpLib.ihght(mh_mb.getValue()))==1) { - textStr = NsharpNativeConstants.OPC_MIXINGHEIGHT_LINE; - textStr = String.format(textStr,nsharpNative.nsharpLib.ihght(mh_mb.getValue())); - } - else { - textStr = NsharpNativeConstants.OPC_MIXINGHEIGHT_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_mb.getValue())==1) { - textStr = NsharpNativeConstants.OPC_MIXINGPRESSURE_LINE; - textStr = String.format(textStr,mh_mb.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_MIXINGPRESSURE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_drct.getValue()) == 1 && nsharpNative.nsharpLib.qc(mh_sped.getValue())==1) { - textStr = NsharpNativeConstants.OPC_TOPMIXLAYER_LINE; - textStr = String.format(textStr,(int)mh_drct.getValue(),NsharpConstants.DEGREE_SYMBOL,(int)mh_sped.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_TOPMIXLAYER_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_drct_max.getValue()) ==1 && nsharpNative.nsharpLib.qc(mh_sped_max.getValue())==1) { - textStr = NsharpNativeConstants.OPC_MIXLAYERMAX_LINE; - textStr = String.format(textStr,(int)mh_drct_max.getValue(),NsharpConstants.DEGREE_SYMBOL,(int)mh_sped_max.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_MIXLAYERMAX_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - if(nsharpNative.nsharpLib.qc(mh_dC.getValue())==1 && nsharpNative.nsharpLib.qc(mh_lr.getValue())==1) { - textStr = NsharpNativeConstants.OPC_LAYER_LAPSE_LINE; - textStr = String.format(textStr,mh_dC.getValue(),mh_lr.getValue()); - } - else { - textStr = NsharpNativeConstants.OPC_LAYER_LAPSE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - /* - * Momentum transfer (TL) - */ - /* - FloatByReference drct_mean = new FloatByReference(-9999.F); - FloatByReference sped_mean = new FloatByReference(-9999.F); - FloatByReference pres = new FloatByReference(-9999.F); - FloatByReference drct = new FloatByReference(-9999.F); - FloatByReference sped = new FloatByReference(-9999.F); - FloatByReference del_t = new FloatByReference(-9999.F); - FloatByReference lr = new FloatByReference(-9999.F); - FloatByReference drct_max = new FloatByReference(-9999.F); - FloatByReference sped_max = new FloatByReference(-9999.F); - - flag = 0; - nsharpNative.nsharpLib.nc_mix_height(pres,drct,sped,del_t,lr,drct_mean, sped_mean, drct_max,sped_max,flag); - System.out.println (" \n\n Surface-based momentum transfer "); - System.out.println (" pressure at mix height: " + pres.getValue() ); - System.out.println (" wind dir at mix height: " + drct.getValue() ); - System.out.println (" wind speed at mix height: " + sped.getValue() ); - System.out.println (" layer change in temp (C): " + del_t.getValue() ); - System.out.println (" Layer lapse rate: " + lr.getValue() ); - System.out.println (" mean wind direction: " + drct_mean.getValue() ); - System.out.println (" mean wind speed: " + sped_mean.getValue() ); - System.out.println (" max wind direction: " + drct_max.getValue() ); - System.out.println (" max wind speed: " + sped_max.getValue() ); - - flag = 1; - nsharpNative.nsharpLib.nc_mix_height(pres,drct,sped,del_t,lr,drct_mean, sped_mean, drct_max,sped_max,flag); - System.out.println (" \n\n Layer-based momentum transfer "); - System.out.println (" pressure at mix height: " + pres.getValue() ); - System.out.println (" wind dir at mix height: " + drct.getValue() ); - System.out.println (" wind speed at mix height: " + sped.getValue() ); - System.out.println (" layer change in temp (C): " + del_t.getValue() ); - System.out.println (" Layer lapse rate: " + lr.getValue() ); - System.out.println (" mean wind direction: " + drct_mean.getValue() ); - System.out.println (" mean wind speed: " + sped_mean.getValue() ); - System.out.println (" max wind direction: " + drct_max.getValue() ); - System.out.println (" max wind speed: " + sped_max.getValue() ); - */ - - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel7(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_srdata() in xwvid3.c. - * Hard coded numerical numbers are directly copied from it. - * - * float helicity ( float lower, float upper, float sdir, float sspd, - * float *phel, float *nhel ) - * Calculates the storm-relative helicity (m2/s2) of a - * layer from LOWER(m, agl) to UPPER(m, agl). Uses the - * storm motion vector (sdir, sspd). - * - * lower - Bottom level of layer (m, AGL)[-1=LPL] - * upper - Top level of layer (m, AGL) [-1=LFC] - * sdir - Storm motion direction (degrees) - * sspd - Storm motion speed (kt) - * phel - Positive helicity in layer (m2/s2) - * nhel - Negative helicity in layer (m2/s2) - * RETURN VALUE - Total helicity (m2/s2) - * - * void sr_wind ( float pbot, float ptop, float sdir, float sspd, - * float *mnu, float *mnv, float *wdir, float *wspd ) - * Calculates a pressure-weighted SR mean wind thru the - * layer (pbot-ptop). Default layer is LFC-EL. - * pbot - Bottom level of layer (mb) - * ptop - Top level of layer (mb) - * sdir - Storm motion dirction (deg) - * sspd - Storm motion speed (kt) - * mnu - U-Component of mean wind (kt) - * mnv - V-Component of mean wind (kt) / - */ - - //FloatByReference sspd= new FloatByReference(0); - //FloatByReference sdir= new FloatByReference(0); - FloatByReference phel= new FloatByReference(0); - FloatByReference nhel= new FloatByReference(0); - FloatByReference mnu= new FloatByReference(0); - FloatByReference mnv= new FloatByReference(0); - FloatByReference smdir= new FloatByReference(0); - FloatByReference smspd= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - float totHeli; - - target.drawString(myFont, NsharpNativeConstants.STORM_RELATIVE_STR, rect.x + rect.width /3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - nsharpNative.nsharpLib.get_storm(smspd, smdir); - - if(nsharpNative.nsharpLib.qc(smspd.getValue()) == 1 && nsharpNative.nsharpLib.qc(smdir.getValue())==1) { - textStr = NsharpNativeConstants.STORM_MOTION_LINE; - textStr = String.format(textStr,smdir.getValue(),NsharpConstants.DEGREE_SYMBOL, - smspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(smspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_MOTION_MISSING; - } - target.drawString(myFont, textStr, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //yellow and bold for parcel header - target.drawString(myFont, NsharpNativeConstants.STORM_HELICITY_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - textStr = NsharpNativeConstants.STORM_LAYER_POS_STR; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - //calculate helicity for sfc-2 km - totHeli = nsharpNative.nsharpLib.helicity( (float)0, (float)2000, smdir.getValue(), smspd.getValue(), phel, nhel); - if(nsharpNative.nsharpLib.qc(phel.getValue()) ==1 && nsharpNative.nsharpLib.qc(nhel.getValue())==1) { - textStr = NsharpNativeConstants.STORM_SFC2KM_LINE; - textStr = String.format(textStr,phel.getValue(), nhel.getValue(), totHeli, - NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - - } - else { - textStr = NsharpNativeConstants.STORM_SFC2KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - //calculate helicity for sfc-3 km - totHeli = nsharpNative.nsharpLib.helicity( (float)0, (float)3000, smdir.getValue(), smspd.getValue(), phel, nhel); - if(nsharpNative.nsharpLib.qc(phel.getValue()) == 1 && nsharpNative.nsharpLib.qc(nhel.getValue())==1) { - textStr = NsharpNativeConstants.STORM_SFC3KM_LINE; - textStr = String.format(textStr,phel.getValue(), nhel.getValue(), totHeli, - NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - } - else { - textStr = NsharpNativeConstants.STORM_SFC3KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - //calculate helicity for LPL - LFC - totHeli = nsharpNative.nsharpLib.helicity( (float)-1, (float)-1, smdir.getValue(), smspd.getValue(), phel, nhel); - if(nsharpNative.nsharpLib.qc(phel.getValue())==1 && nsharpNative.nsharpLib.qc(nhel.getValue())==1) { - textStr = NsharpNativeConstants.STORM_LPL_LFC_LINE; - textStr = String.format(textStr,phel.getValue(), nhel.getValue(), totHeli, - NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - } - else { - textStr = NsharpNativeConstants.STORM_LPL_LFC_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - //yellow and bold for header - target.drawString(myFont, NsharpNativeConstants.STORM_WIND_STR, rect.x + rect.width /4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - textStr = NsharpNativeConstants.STORM_LAYER_VECTOR_STR; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - //calculate pressure-weighted SR mean wind at sfc-2 km - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(nsharpNative.nsharpLib.qc(wdir.getValue())==1) { - textStr = NsharpNativeConstants.STORM_SFC2KM_VECT_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_SFC2KM_VECT_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //calculate pressure-weighted SR mean wind at 4-6 km - //System.out.println("msl(4000))="+ nsharpNative.nsharpLib.msl(4000) + "i_pres(msl(4000))" + nsharpNative.nsharpLib.i_pres(nsharpNative.nsharpLib.msl(4000))); - //System.out.println("msl(6000))="+ nsharpNative.nsharpLib.msl(6000) + "i_pres(msl(6000))" + nsharpNative.nsharpLib.i_pres(nsharpNative.nsharpLib.msl(6000))); - //System.out.println("dir "+ smdir.getValue()+ " spd " + smspd.getValue()); - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(4000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(nsharpNative.nsharpLib.qc(wdir.getValue()) == 1) { - textStr = NsharpNativeConstants.STORM_4_6KM_VECT_LINE; - //System.out.println("wdir "+ wdir.getValue() + " widSp " + wspd.getValue()); - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_4_6KM_VECT_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //calculate pressure-weighted SR mean wind at 9-11 km - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(9000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(11000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - if(nsharpNative.nsharpLib.qc(wdir.getValue())==1) { - textStr = NsharpNativeConstants.STORM_9_11KM_VECT_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_9_11KM_VECT_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel8(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_meanwind() - * in xwvid3.c - * - * void mean_wind ( float pbot, float ptop, float *mnu, float *mnv, - * float *wdir, float *wspd ) - * Calculates a pressure-weighted mean wind thru the - * layer (pbot-ptop). Default layer is LFC-EL. - * - * pbot - Bottom level of layer (mb) - * ptop - Top level of layer (mb) - * mnu - U-Component of mean wind (kt) - * mnv - V-Component of mean wind (kt) - */ - FloatByReference mnu= new FloatByReference(0); - FloatByReference mnv= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - target.drawString(myFont, NsharpNativeConstants.MEAN_WIND_STR, rect.x + rect.width*0.4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //Calculate mean wind at 0-6 km - nsharpNative.nsharpLib.mean_wind( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.agl(6000)), mnu, mnv, wdir, wspd); - //System.out.println("wsp ="+ wspd.getValue()+ " wdir "+ wdir.getValue() + " agl(6000)="+nsharpNative.nsharpLib.agl(6000)+ " preAt6000="+nsharpNative.nsharpLib.i_pres(nsharpNative.nsharpLib.agl(6000))); - if(nsharpNative.nsharpLib.qc(wdir.getValue()) == 1 && nsharpNative.nsharpLib.qc(wspd.getValue())== 1) { - textStr = NsharpNativeConstants.MEANWIND_SFC6KM_LINE; - textStr = String.format(textStr,(wdir.getValue()), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_SFC6KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - //Calculate mean wind at LFC-EL - nsharpNative.nsharpLib.mean_wind( -1, -1, mnu, mnv, wdir, wspd); - if(nsharpNative.nsharpLib.qc(wdir.getValue())==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - textStr = NsharpNativeConstants.MEANWIND_LFC_EL_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_LFC_EL_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - //Calculate mean wind at 850-200 mb - nsharpNative.nsharpLib.mean_wind( 850,200, mnu, mnv, wdir, wspd); - if(nsharpNative.nsharpLib.qc(wdir.getValue()) ==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - textStr = NsharpNativeConstants.MEANWIND_850_200MB_LINE; - textStr = String.format(textStr,wdir.getValue(), wspd.getValue(), - nsharpNative.nsharpLib.kt_to_mps(wspd.getValue())); - } - else { - textStr = NsharpNativeConstants.MEANWIND_850_200MB_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_shear() - * in xwvid3.c - * - * void wind_shear ( float pbot, float ptop, float *shu, float *shv, - * float *sdir, float *smag ) - * - * Calculates the shear between the wind at (pbot) and - * (ptop). Default lower wind is a 1km mean wind, while - * the default upper layer is 3km. - * - * pbot - Bottom level of layer (mb) - * ptop - Top level of layer (mb) - * shu - U-Component of shear (m/s) - * shv - V-Component of shear (m/s) - * sdir - Direction of shear vector (degrees) - * smag - Magnitude of shear vector (m/s) - */ - FloatByReference shu= new FloatByReference(0); - FloatByReference shv= new FloatByReference(0); - FloatByReference sdir= new FloatByReference(0); - FloatByReference smag= new FloatByReference(0); - target.drawString(myFont, NsharpNativeConstants.ENVIRONMENTAL_SHEAR_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - - textStr = NsharpNativeConstants.SHEAR_LAYER_DELTA_STR; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - target.drawLine(rect.x, curY, 0.0, rect.x+rect.width, curY, 0.0, NsharpConstants.color_white, 1); - - //Calculate wind shear at Low - 3 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(3000)), - shu,shv,sdir,smag); - if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { - textStr = NsharpNativeConstants.SHEAR_LOW_3KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.3F); - //System.out.println("from cave "+smag.getValue() + " kt, " + nsharpNative.nsharpLib.kt_to_mps(smag.getValue())+ " m/s, Tot="+ nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.3F); - } - else { - textStr = NsharpNativeConstants.SHEAR_LOW_3KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //Calculate wind shear at Sfc - 2 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), - shu,shv,sdir,smag); - if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { - textStr = NsharpNativeConstants.SHEAR_SFC_2KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.2F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_2KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //Calculate wind shear at Sfc - 6 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), - shu,shv,sdir,smag); - if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { - textStr = NsharpNativeConstants.SHEAR_SFC_6KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/.6F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_6KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //Calculate wind shear at Sfc - 12 km - nsharpNative.nsharpLib.wind_shear( -1, nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(12000)), - shu,shv,sdir,smag); - if(nsharpNative.nsharpLib.qc(smag.getValue())==1) { - textStr = NsharpNativeConstants.SHEAR_SFC_12KM_LINE; - textStr = String.format(textStr,smag.getValue(), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue()), - nsharpNative.nsharpLib.kt_to_mps(smag.getValue())/1.2F); - } - else { - textStr = NsharpNativeConstants.SHEAR_SFC_12KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - //myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel9(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_initiation(): Displays thunderstorm initiation parameters, - * show_heavypcpn(), show_preciptype() and show_stormtype() - * in xwvid3.c - * - */ - FloatByReference fvalue2= new FloatByReference(0); - FloatByReference fvalue3= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - FloatByReference fvalue= new FloatByReference(0); - FloatByReference fvalue1= new FloatByReference(0); - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - // current parcel is already decided when page 1 is displyed. Note that page 1 is always - // displayed before this page (page 4). Therefore, we dont have to call define_parcel() again. - // set default - //short currentParcel; - float layerPressure; - if(currentParcel == NsharpNativeConstants.PARCELTYPE_USER_DEFINED && NsharpParcelDialog.getAccess() != null){ - layerPressure = NsharpParcelDialog.getAccess().getUserDefdParcelMb(); - } - else - layerPressure = NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - nsharpNative.nsharpLib.define_parcel(currentParcel,layerPressure); - - - _parcel pcl = new _parcel();; - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - //_parcel.ByValue pcl_byvalue = new _parcel.ByValue(); - //nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl_byvalue); - - - //CONVECTIVE_INITIATION - target.drawString(myFont, NsharpNativeConstants.CONVECTIVE_INITIATION_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - //CINH - if(nsharpNative.nsharpLib.qc(pcl.bminus)==1) { - textStr = NsharpNativeConstants.CONVECTIVE_CINH_LINE; - textStr = String.format(textStr,pcl.bminus); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_CINH_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //cap - if(nsharpNative.nsharpLib.qc(pcl.cap)==1 && nsharpNative.nsharpLib.qc(pcl.cappres)==1) { - textStr = NsharpNativeConstants.CONVECTIVE_CAP_LINE; - textStr = String.format(textStr,pcl.cap, pcl.cappres); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_CAP_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //K-index - nsharpNative.nsharpLib.k_index(fvalue); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.CONVECTIVE_KINDEX_LINE; - textStr = String.format(textStr,fvalue.getValue()); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_KINDEX_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //Mean RH - nsharpNative.nsharpLib.mean_relhum(fvalue, -1, -1); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.CONVECTIVE_MEANRH_LINE; - textStr = String.format(textStr,fvalue.getValue(), NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_MEANRH_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + 2*charHeight; - - //Top of M layer - nsharpNative.nsharpLib.top_moistlyr(fvalue); - //System.out.println("top_moistlyr=" + fvalue.getValue() ); - - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - float ht = - nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(fvalue.getValue()))); - if(nsharpNative.nsharpLib.qc(ht)==1){ - textStr = NsharpNativeConstants.CONVECTIVE_TOP_LINE; - textStr = String.format(textStr,fvalue.getValue(),ht); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_TOP_MISSING; - } - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_TOP_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - //LFC height - if(nsharpNative.nsharpLib.qc(pcl.lfcpres)==1) { - float ht = - nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres))); - if(nsharpNative.nsharpLib.qc(ht)==1){ - textStr = NsharpNativeConstants.CONVECTIVE_LFC_LINE; - textStr = String.format(textStr,pcl.lfcpres,ht); - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_LFC_MISSING; - } - } - else { - textStr = NsharpNativeConstants.CONVECTIVE_LFC_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //STORM TYPE - target.drawString(myFont, NsharpNativeConstants.STORM_TYPE_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //CAPE - if(nsharpNative.nsharpLib.qc(pcl.bplus)==1) { - textStr = NsharpNativeConstants.STORM_TYPE_CAPE_LINE; - textStr = String.format(textStr,pcl.bplus); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_CAPE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //EFF. SREH - float hel=0; - nsharpNative.nsharpLib.get_storm(wspd,wdir); - if(nsharpNative.nsharpLib.qc(wdir.getValue()) ==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - hel = - nsharpNative.nsharpLib.helicity( -1.0F, -1.0F, wdir.getValue(), wspd.getValue(), fvalue, fvalue1); - if(nsharpNative.nsharpLib.qc(hel)==1){ - textStr = NsharpNativeConstants.STORM_TYPE_EFF_LINE; - textStr = String.format(textStr,hel,NsharpConstants.SQUARE_SYMBOL,NsharpConstants.SQUARE_SYMBOL); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EFF_MISSING; - } - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EFF_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //EHI - if(nsharpNative.nsharpLib.qc(pcl.bplus)==1) { - float ehi = - nsharpNative.nsharpLib.ehi( pcl.bplus, hel); - if(nsharpNative.nsharpLib.qc(ehi)==1){ - textStr = NsharpNativeConstants.STORM_TYPE_EHI_LINE; - textStr = String.format(textStr,ehi); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EHI_MISSING; - } - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_EHI_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //3km Shear - nsharpNative.nsharpLib.wind_shear( -1, -1, fvalue, fvalue1,fvalue2,fvalue3); - if(nsharpNative.nsharpLib.qc(fvalue3.getValue())==1) { - textStr = NsharpNativeConstants.STORM_TYPE_3KM_LINE; - textStr = String.format(textStr,nsharpNative.nsharpLib.kt_to_mps(fvalue3.getValue())); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_3KM_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //BRN - if(nsharpNative.nsharpLib.qc(pcl.brn)==1) { - textStr = NsharpNativeConstants.STORM_TYPE_BRN_LINE; - textStr = String.format(textStr,pcl.brn); - } - else { - textStr = NsharpNativeConstants.STORM_TYPE_BRN_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //BRN Shear - //nsharpNative.nsharpLib.cave_bulk_rich(pcl.lplpres, pcl.bplus, fvalue ); - //System.out.println("bulk_rich fvalue = "+ fvalue.getValue()); - nsharpNative.nsharpLib.cave_bulk_rich2(fvalue ); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.STORM_TYPE_BRNSHEAR_LINE; - textStr = String.format(textStr,fvalue.getValue(),NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - } - else - textStr = NsharpNativeConstants.STORM_TYPE_BRNSHEAR_MISSING; - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //PRECIPITATION_TYPE - target.drawString(myFont, NsharpNativeConstants.PRECIPITATION_TYPE_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //Melting Level - float web = nsharpNative.nsharpLib.wb_lvl( 0, fvalue ); - if(nsharpNative.nsharpLib.qc(web)==1) { - - float aglft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(web))); - if(nsharpNative.nsharpLib.qc(aglft)==1){ - textStr = NsharpNativeConstants.PRECIPITATION_MELTING_LINE; - textStr = String.format(textStr,aglft, web); - } - else - textStr = NsharpNativeConstants.PRECIPITATION_MELTING_MISSING; - } - else { - textStr = NsharpNativeConstants.PRECIPITATION_MELTING_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - //HEAVY_RAINFAL - target.drawString(myFont, NsharpNativeConstants.HEAVY_RAINFALL_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //Rogash_QPF, Chin: note: BigNsharp has different implementation of Rogash_QPF() - // We are using bigNsharp now. - nsharpNative.nsharpLib.Rogash_QPF(fvalue); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.HEAVY_ROGASH_LINE; - textStr = String.format(textStr,fvalue.getValue()); - } - else { - textStr = NsharpNativeConstants.HEAVY_ROGASH_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - - /* - * Compute MDPI_WINDEX (TL) - */ - /* - FloatByReference windex = new FloatByReference(0); - float mdpi = nsharpNative.nsharpLib.cave_mdpi_windex(windex); - System.out.println (" \n\n MDPI: Microburst Day Potential Index"); - System.out.println (" MDPI: " + mdpi ); - System.out.println (" Max wind gust: " + windex.getValue() ); - */ - - /* - * Compute DMPI (TL) - */ - /* - int dmpi = nsharpNative.nsharpLib.cave_dmpi(); - System.out.println (" \n\n DMPI: Dry Microburst Potential Index"); - System.out.println (" DMPI: " + dmpi ); - */ - - /* - * Compute Soaring Index (TL) - */ - /* - FloatByReference ctax = new FloatByReference(0); - FloatByReference zconv = new FloatByReference(0); - FloatByReference tconv= new FloatByReference(0); - FloatByReference zthrm = new FloatByReference(0); - FloatByReference tthrm = new FloatByReference(0); - FloatByReference soar = new FloatByReference(0); - FloatByReference ttrig = new FloatByReference(0); - - nsharpNative.nsharpLib.cave_soar ( -9999.F, ctax, zconv,tconv, zthrm, tthrm, soar, ttrig); - System.out.println (" \n\n Soaring Index "); - System.out.println (" potential temp of forecast Tmax (C): " + ctax.getValue() ); - System.out.println (" height of minimum effective convection (m): " + zconv.getValue() ); - System.out.println (" temp of minimum effective convection (C): " + tconv.getValue() ); - System.out.println (" height at thrm altitude (m): " + zthrm.getValue() ); - System.out.println (" temperature at thrm altitude (C): " + tthrm.getValue() ); - System.out.println (" soaring index (ft/min): " + soar.getValue() ); - System.out.println (" triggering temp (C): " + ttrig.getValue() ); - */ - // myFont.dispose(); - } - @SuppressWarnings("deprecation") - private void drawPanel10(IGraphicsTarget target,Rectangle rect) - throws VizException { - extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //myFont = target.initializeFont(fontName, fontSize, null); - String splitedStr[]; - String textStr; - curY = rect.y; - /* - * Chin's NOTE::::this function is coded based on legacy nsharp software - * show_hailpot(), show_torpot() - * in xwvid3.c - * - */ - FloatByReference fvalue2= new FloatByReference(0); - FloatByReference fvalue3= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - FloatByReference fvalue= new FloatByReference(0); - FloatByReference fvalue1= new FloatByReference(0); - - target.drawString(myFont, NsharpNativeConstants.SEVERE_POTENTIAL_STR, rect.x + rect.width/3, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - target.drawString(myFont, NsharpNativeConstants.SEVERE_HAIL_POTENTIAL_STR, rect.x + rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - _parcel pcl = new _parcel();; - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - //CAPE - if(nsharpNative.nsharpLib.qc(pcl.bplus)==1) { - textStr = NsharpNativeConstants.SEVERE_CAPE_LINE; - textStr = String.format(textStr,pcl.bplus); - } - else { - textStr = NsharpNativeConstants.SEVERE_CAPE_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - // WBZ level - float wbzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fvalue )))); - if(nsharpNative.nsharpLib.qc(wbzft)==1) { - textStr = NsharpNativeConstants.SEVERE_WBZ_LINE; - textStr = String.format(textStr,wbzft); - } - else { - textStr = NsharpNativeConstants.SEVERE_WBZ_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //Mid Level RH - nsharpNative.nsharpLib.mean_relhum( fvalue, 700, 500); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_MIDRH_LINE; - textStr = String.format(textStr,fvalue.getValue(),NsharpConstants.PERCENT_SYMBOL); - } - else { - textStr = NsharpNativeConstants.SEVERE_MIDSRW_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - //FZG level - float fgzft = nsharpNative.nsharpLib.mtof(nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fvalue )))); - if(nsharpNative.nsharpLib.qc(fgzft)==1) { - textStr = NsharpNativeConstants.SEVERE_FGZ_LINE; - textStr = String.format(textStr,fgzft); - } - else { - textStr = NsharpNativeConstants.SEVERE_FGZ_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //EL Storm - nsharpNative.nsharpLib.get_storm(wspd,wdir); - nsharpNative.nsharpLib.sr_wind( pcl.elpres+25, pcl.elpres-25,wdir.getValue(), wspd.getValue(), fvalue,fvalue1,fvalue2,fvalue3); - if(nsharpNative.nsharpLib.qc(fvalue3.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_ELSTORM_LINE; - textStr = String.format(textStr,fvalue3.getValue()); - } - else { - textStr = NsharpNativeConstants.SEVERE_ELSTORM_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - // CHI1 - //_parcel.ByValue pcl_byvalue = new _parcel.ByValue(); - // pr = nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl_byvalue); - //Assigne values that needed for bulk_rich() - //pcl_byvalue.lplpres = sfcpres; - //pcl_byvalue.bplus = pcl.bplus; - nsharpNative.nsharpLib.cave_bulk_rich2( fvalue ); - float rtn = (pcl.bplus * fvalue.getValue()) / nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.wb_lvl( 0, fvalue1 ))); - if(nsharpNative.nsharpLib.qc(rtn)==1) { - textStr = NsharpNativeConstants.SEVERE_CHI1_LINE; - textStr = String.format(textStr,rtn); - } - else { - textStr = NsharpNativeConstants.SEVERE_CHI1_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - //CHI2 - nsharpNative.nsharpLib.Mean_WBtemp( fvalue2, -1, -1); - if(nsharpNative.nsharpLib.qc(rtn/fvalue2.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_CHI2_LINE; - textStr = String.format(textStr,rtn/fvalue2.getValue()); - } - else { - textStr = NsharpNativeConstants.SEVERE_CHI2_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + rect.width/2+ i*rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - //Avg BL - nsharpNative.nsharpLib.Mean_WBtemp( fvalue, -1, -1); - if(nsharpNative.nsharpLib.qc(fvalue.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_AVGBL_LINE; - textStr = String.format(textStr,fvalue.getValue(),NsharpConstants.DEGREE_SYMBOL); - } - else { - textStr = NsharpNativeConstants.SEVERE_AVGBL_MISSING; - } - target.drawString(myFont, textStr, rect.x, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //TORNADO_POTENTIAL - target.drawString(myFont, NsharpNativeConstants.SEVERE_TORNADO_POTENTIAL_STR, rect.x + rect.width/4, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - curY = curY + charHeight; - - //Low SRW Sfc - float blyr = nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(0)); - float tlyr = pcl.lfcpres; - if(tlyr > 0){ - nsharpNative.nsharpLib.sr_wind( blyr, tlyr, wdir.getValue(), wspd.getValue(), fvalue,fvalue1,fvalue2,fvalue3); - if(nsharpNative.nsharpLib.qc(fvalue3.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_LOWSRWSFC_LINE; - textStr = String.format(textStr,fvalue3.getValue()); - } - else { - textStr = NsharpNativeConstants.SEVERE_LOWSRWSFC_MISSING; - } - } - else { - textStr = NsharpNativeConstants.SEVERE_LOWSRWSFC_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - blyr = pcl.lfcpres; - tlyr = nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.ihght(pcl.lfcpres) + 4000); - if((tlyr > 0)&&(blyr > 0)) { - nsharpNative.nsharpLib.sr_wind( blyr, tlyr, wdir.getValue(), wspd.getValue(), fvalue,fvalue1,fvalue2,fvalue3); - if(nsharpNative.nsharpLib.qc(fvalue3.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_MIDSRW_LINE; - textStr = String.format(textStr,fvalue3.getValue()); - } - else { - textStr = NsharpNativeConstants.SEVERE_MIDSRW_MISSING; - } - - } - else { - textStr = NsharpNativeConstants.SEVERE_MIDSRW_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - curY = curY + charHeight; - - blyr = nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.ihght(pcl.elpres) - 4000); - tlyr = pcl.elpres; - if((tlyr > 0)&&(blyr > 0)) { - nsharpNative.nsharpLib.sr_wind( blyr, tlyr, wdir.getValue(), wspd.getValue(), fvalue,fvalue1,fvalue2,fvalue3); - if(nsharpNative.nsharpLib.qc(fvalue3.getValue())==1) { - textStr = NsharpNativeConstants.SEVERE_LOWSRWEL_LINE; - textStr = String.format(textStr,fvalue3.getValue()); - } - else { - textStr = NsharpNativeConstants.SEVERE_LOWSRWEL_MISSING; - } - - } - else { - textStr = NsharpNativeConstants.SEVERE_LOWSRWEL_MISSING; - } - splitedStr = textStr.split("_", -1); - for (int i =0; i < splitedStr.length; i++){ - target.drawString(myFont, splitedStr[i], rect.x + i*rect.width/2, curY , 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - - /* - * Compute vertical motion stemming from thermal buoyancy. (TL) - */ - /* - float [] vvel = null; - vvel = new float[150]; - float wmax = nsharpNative.nsharpLib.cave_wmax (vvel); - System.out.println (" \n\n Thermodynamic buoyancy "); - for (int i = 0; i < vvel.length; i++ ) { - if ( vvel[i] > 0. ) { - System.out.print ( " W [" + i +"]" + " = " + vvel[i] + "\n"); - } - } - System.out.println (" Max vertical motions: " + wmax ); - */ - //myFont.dispose(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTMouseHandler.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTMouseHandler.java deleted file mode 100644 index a097515e4e..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTMouseHandler.java +++ /dev/null @@ -1,574 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTMouseHandler - * - * This java class performs the NSHARP NsharpSkewTMouseHandler functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 03/09/2011               Chin Chen   Updated for R1G2-9
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - -import java.io.IOException; - -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpShowTextDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay; -import gov.noaa.nws.ncep.ui.pgen.tools.InputHandlerDefaultImpl; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; - -import com.raytheon.uf.viz.core.IDisplayPane; -import com.raytheon.uf.viz.core.IExtent; -import com.raytheon.uf.viz.core.IView; -import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeMode; -import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeOperation; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.viz.ui.UiPlugin; -import com.raytheon.viz.ui.editor.AbstractEditor; -import com.raytheon.viz.ui.input.preferences.MousePreferenceManager; -import com.vividsolutions.jts.geom.Coordinate; - -public class NsharpSkewTMouseHandler extends InputHandlerDefaultImpl{//implements IInputHandler { - - private enum Mode { - CREATE, SKEWT_DOWN, HODO_DOWN, HODO_DOWN_MOVE, TIMELINE_DOWN, STATIONID_DOWN, PARCELLINE_DOWN, HODO_WIND_MOTION_DOWN - }; - - private Display display; - - protected AbstractEditor editor; - - public void setEditor(AbstractEditor editor) { - this.editor = editor; - } - - private Mode mode = Mode.CREATE; - private boolean cursorInSkewT = false, cursorInHodo=false; - private double[] anchorPointxy; - private NsharpBackgroundResource skewBkRsc; - private MousePreferenceManager prefManager = MousePreferenceManager.getInstance(); - private static final String PAN_PREF = "com.raytheon.viz.ui.input.pan"; - private static final String PAN_PERCENTAGE = "panningPercentage"; - private static final String ZOOMIN_PREF = "com.raytheon.viz.ui.input.zoomin"; - - private static final String ZOOMOUT_PREF = "com.raytheon.viz.ui.input.zoomout"; - - private static final String CLEAR_PREF = "com.raytheon.viz.ui.clear"; - protected float theLastMouseX = 0; - - protected float theLastMouseY = 0; - protected Double panningPercentage = null; - private double getPanningPercentage() { - if (panningPercentage == null) { - HierarchicalPreferenceStore store = UiPlugin.getDefault() - .getPreferenceStore(); - panningPercentage = UiPlugin.getDefault().getPreferenceStore() - .getDouble(PAN_PERCENTAGE); - - if (panningPercentage < 0.0 || panningPercentage > 1.0) { - // bad value set, reset and store - panningPercentage = panningPercentage < 0.0 ? 0.0 : 1.0; - - store.setValue(PAN_PERCENTAGE, panningPercentage.doubleValue()); - try { - store.save(); - } catch (IOException e) { - UFStatus.getHandler().handle(Priority.PROBLEM, "Error saving panning percentage preference", e); - } - } - } - return panningPercentage.doubleValue(); - } - public NsharpSkewTMouseHandler(AbstractEditor editor) { - this.editor = editor; - display = Display.getCurrent(); - //Chin MERGE skewBkRsc = NsharpBackgroundResource.getInstance(); - skewBkRsc = getDescriptor().getSkewTBkGResource(); - } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.ui.input.IInputHandler#handleMouseWheel(int, int) - */ - public boolean handleMouseWheel(Event event, int x, int y) { - if(editor == null) { - return false; - } - //System.out.println("handleMouseWheel"); - //if set to false, preempt other handler, so zooming is disabled in SkewT editor. - com.raytheon.viz.ui.input.preferences.MouseEvent SCROLL_FORWARD = com.raytheon.viz.ui.input.preferences.MouseEvent.SCROLL_FORWARD; - com.raytheon.viz.ui.input.preferences.MouseEvent SCROLL_BACK = com.raytheon.viz.ui.input.preferences.MouseEvent.SCROLL_BACK; - if ((event.stateMask & SWT.SHIFT) == 0 - && editor.translateClick(x, y) != null) { - IDisplayPane[] panes = editor.getDisplayPanes(); - if ((event.count < 0 && prefManager.handleEvent(ZOOMIN_PREF, - SCROLL_FORWARD)) - || (event.count > 0 && prefManager.handleEvent( - ZOOMOUT_PREF, SCROLL_BACK))) { - for (IDisplayPane pane : panes) { - pane.zoom(event.count, event.x, event.y); - } - return true; - } else if ((event.count > 0 && prefManager.handleEvent( - ZOOMOUT_PREF, SCROLL_FORWARD)) - || (event.count < 0 && prefManager.handleEvent(ZOOMIN_PREF, - SCROLL_BACK))) { - for (IDisplayPane pane : panes) { - pane.zoom(-event.count, event.x, event.y); - } - return true; - } else if ((event.count > 0 && prefManager.handleEvent(CLEAR_PREF, - SCROLL_FORWARD)) - || (event.count < 0 && prefManager.handleEvent(CLEAR_PREF, - SCROLL_BACK))) { - - for (IDisplayPane pane : panes) { - pane.clear(); - } - return true; - } - } - return false; - } - - @Override - public boolean handleDoubleClick(int x, int y, int button) { - return false; - } - - private boolean shiftDown=false; - private boolean zDownWhileShiftDown=false; - private int KEY_Z= 122; - @Override - public boolean handleKeyDown(int keyCode) { - //System.out.println("key down="+(char)keyCode+ " code ="+keyCode); - if ((keyCode & SWT.SHIFT) != 0) { - shiftDown = true; - //System.out.println("shift pressed"); - return true; - } else if (shiftDown && keyCode == KEY_Z ) { - zDownWhileShiftDown=true; - return true; - } - return false; - } - - @Override - public boolean handleKeyUp(int keyCode) { - //String s = "key up="+(char)keyCode; - //System.out.println(s+ " code ="+keyCode); - if (keyCode == SWT.ARROW_DOWN) { - //System.out.println("Arrow down"); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - skewRsc.setSteppingStnIdList(FrameChangeOperation.NEXT) ; - return true; - }else if (keyCode == SWT.ARROW_UP) { - //System.out.println("Arrow up"); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - skewRsc.setSteppingStnIdList(FrameChangeOperation.PREVIOUS) ; - return true; - }else if (keyCode == SWT.ARROW_LEFT) { - //System.out.println("Arrow left"); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - skewRsc.setSteppingTimeLine(FrameChangeOperation.PREVIOUS, FrameChangeMode.TIME_ONLY) ; - return true; - }else if (keyCode == SWT.ARROW_RIGHT) { - //System.out.println("Arrow right"); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - skewRsc.setSteppingTimeLine(FrameChangeOperation.NEXT, FrameChangeMode.TIME_ONLY) ; - return true; - } else if (keyCode == SWT.SHIFT) { - shiftDown = false; - return true; - }else if (zDownWhileShiftDown && keyCode == KEY_Z ) { - //System.out.println("Shift+Z is entered"); - zDownWhileShiftDown = false; - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - skewRsc.toggleCurseDisplay(); - return true; - } - return false; - } - - @Override - public boolean handleMouseDown(int x, int y, int mouseButton) { - theLastMouseX = x; - theLastMouseY = y; - if (getSkewtDisplay() == null) { - return false; - } - else if (mouseButton == 1) { - //System.out.println("handleMouseDown"); - this.mode = Mode.CREATE; - // changeMouse(this.mode); - //System.out.println("current cursor x " + display.getCursorLocation().x + " y "+ display.getCursorLocation().y); - //System.out.println("picked pt before translate x " + x + " y "+ y); - Coordinate c = editor.translateClick(x, y); - //Chin MERGE NsharpSkewTResource skewRsc = NsharpSkewTResource.getOrCreateSkewtResource(); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - //Chin MERGE NsharpBackgroundResource bkRsc = NsharpBackgroundResource.getOrCreateSkewTBkGResource(); - NsharpBackgroundResource bkRsc = getDescriptor().getSkewTBkGResource(); - boolean graphEditOn = skewRsc.isEditGraphOn(); - if(bkRsc.getSkewTBackground().contains(c) == true && graphEditOn) { - //make sure it is clicked within skewt area - //save current cursor coordinate difference between display and view point - Point curPoint = display.getCursorLocation(); - int xdiff = x- curPoint.x; - int ydiff = y- curPoint.y; - Coordinate anchoredPtC; - anchoredPtC= skewRsc.getPickedTempPoint(c); - skewRsc.setInteractiveTempPointCoordinate(anchoredPtC); - //System.out.println("returned pt before reverse translate x " + anchoredPtC.x + " y "+ anchoredPtC.y); - - //Translate world screen coordinate to screen (x,y) coordinate - anchorPointxy = editor.translateInverseClick(anchoredPtC); - - //System.out.println("returned pt after reverse translate x " + (int)anchorPointxy[0] + " y "+ (int)anchorPointxy[1]); - - display.setCursorLocation((int)anchorPointxy[0]-xdiff,(int)anchorPointxy[1]-ydiff); - this.mode = Mode.SKEWT_DOWN; - //changeMouse(this.mode); - - //System.out.println("handleMouseDown x "+((int)pointxy[0]-xdiff)+ " y "+((int)pointxy[1]-ydiff)); - } - - else if(bkRsc.getHodoBackground().contains(c) == true) { - - if(graphEditOn){ - Point curPoint = display.getCursorLocation(); - int xdiff = x- curPoint.x; - int ydiff = y- curPoint.y; - Coordinate anchoredPtC = skewRsc.getClosestHodoPoint(c); - if(anchoredPtC.x != 0 && anchoredPtC.y !=0){ - anchorPointxy = editor.translateInverseClick(anchoredPtC); - display.setCursorLocation((int)anchorPointxy[0]-xdiff,(int)anchorPointxy[1]-ydiff); - this.mode = Mode.HODO_DOWN_MOVE; - } - } - else{ - this.mode = Mode.HODO_DOWN; - } - //changeMouse(this.mode); - } - else if(bkRsc.getDataPanel1Background().contains(c) == true && skewRsc.getParcelLinesInPhysicalPanelNumber() == 1 ) { - this.mode = Mode.PARCELLINE_DOWN; - //changeMouse(this.mode); - } - //else if(bkRsc.getDataPanel3Background().contains(c) == true && skewRsc.getParcelLinesInPhysicalPanelNumber() == 3 ) { - //this.mode = Mode.PARCELLINE_DOWN; - //changeMouse(this.mode); - //} - else if(bkRsc.getDataTimelineBackground().contains(c) == true) { - this.mode = Mode.TIMELINE_DOWN; - //changeMouse(this.mode); - } - else if(bkRsc.getStationIdBackground().contains(c) == true) { - this.mode = Mode.STATIONID_DOWN; - //changeMouse(this.mode); - } - editor.refresh(); - } - - return false; - } - - public boolean handleMouseDownMove(int aX, int aY, int button) { - - if (getSkewtDisplay() == null) { - return false; - } - else if (button == 1) { - - Coordinate c = editor.translateClick(aX, aY); - //make sure it is clicked within skewt area - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - NsharpBackgroundResource bkRsc = getDescriptor().getSkewTBkGResource(); - boolean graphEditOn = skewRsc.isEditGraphOn(); - if(bkRsc.getSkewTBackground().contains(c) == true && this.mode == Mode.SKEWT_DOWN && graphEditOn) { - - //NOTE::::keep y axis un-changed when moving mouse cursor - c = editor.translateClick(aX, anchorPointxy[1]); - skewRsc.setInteractiveTempPointCoordinate(c); - editor.refresh(); - return false; - } else if(bkRsc.getHodoBackground().contains(c) == true && this.mode == Mode.HODO_DOWN_MOVE && graphEditOn) { - c = editor.translateClick(aX, aY); - skewRsc.setInteractiveHodoPointCoordinate(c); - editor.refresh(); - return false; - } - /*else if(this.mode != Mode.HODO_DOWN_MOVE && this.mode != Mode.SKEWT_DOWN ){*/ - if (prefManager.handleLongClick(ZOOMIN_PREF, button) - || prefManager.handleLongClick(ZOOMOUT_PREF, button)) { - theLastMouseX = aX; - theLastMouseY = aY; - } - if ((!prefManager.handleDrag(PAN_PREF, button)) || editor == null) - return false; - IDisplayPane[] panes = editor.getDisplayPanes(); - for (IDisplayPane p : panes) { - IView tmpView = (IView) p.getRenderableDisplay().getView().clone(); - tmpView.shiftExtent(new double[] { aX, aY }, new double[] { - theLastMouseX, theLastMouseY }, p.getTarget()); - IExtent tmpExtent = tmpView.getExtent(); - double percentage = getPanningPercentage(); - double xMinThreshold = tmpExtent.getMinX() - + (tmpExtent.getMaxX() - tmpExtent.getMinX()) * percentage; - double xMaxThreshold = tmpExtent.getMinX() - + (tmpExtent.getMaxX() - tmpExtent.getMinX()) - * (1.0 - percentage); - double yMinThreshold = tmpExtent.getMinY() - + (tmpExtent.getMaxY() - tmpExtent.getMinY()) * percentage; - double yMaxThreshold = tmpExtent.getMinY() - + (tmpExtent.getMaxY() - tmpExtent.getMinY()) - * (1.0 - percentage); - - double height = p.getRenderableDisplay().getWorldHeight(); - double width = p.getRenderableDisplay().getWorldWidth(); - - int aX2 = aX, aY2 = aY; - - if ((0 <= xMinThreshold && width >= xMaxThreshold) == false) { - if (((width < xMaxThreshold && theLastMouseX < aX) || (0 > xMinThreshold && theLastMouseX > aX)) == false) { - aX2 = (int) theLastMouseX; - } - } - - if ((0 <= yMinThreshold && height >= yMaxThreshold) == false) { - if (((height < yMaxThreshold && theLastMouseY < aY) || (0 > yMinThreshold && theLastMouseY > aY)) == false) { - aY2 = (int) theLastMouseY; - } - } - - if (aX2 != theLastMouseX || aY2 != theLastMouseY) { - p.shiftExtent(new double[] { aX2, aY2 }, new double[] { - theLastMouseX, theLastMouseY }); - } - } - theLastMouseX = aX; - theLastMouseY = aY; - return true; - //} - - /* - IDisplayPane[] panes = editor.getDisplayPanes(); - for( IDisplayPane p : panes ) { - p.shiftExtent(new double[] { aX, aY }, new double[] { - theLastMouseX, theLastMouseY }); - } - - editor.refresh(); - - - theLastMouseX = aX; - theLastMouseY = aY; - return true;*/ - - } - return false; - } - - @Override - public boolean handleMouseHover(int x, int y) { - //System.out.println("mouseHandler handleMouseHover"); - if(editor != null) { - editor.setFocus(); - } - return true; - } - - @Override - public boolean handleMouseMove(int x, int y) { - if(editor != null) { - editor.setFocus(); - } - if (getSkewtDisplay() == null) { - return false; - } - //System.out.println("mouseHandler " + this+" handleMouseMove with editor"+editor); - this.mode = Mode.CREATE; - //changeMouse(); - if(editor != null) { - //Chin Merge next two lines commented out, the display pane should - // be handling this - //editor.getActiveDisplayPane().setLastMouseX(x); - //editor.getActiveDisplayPane().setLastMouseY(y); - - // getSkewtDisplay().handleMouseMove(lastMouseX, lastMouseY); - Coordinate c = editor.translateClick(x, y); - NsharpBackgroundResource bkRsc = getDescriptor().getSkewTBkGResource(); - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - if (bkRsc.getSkewTBackground().contains(c)){ - //always update coordinate C to SkewT editor - cursorInSkewT=true; - skewRsc.setCursorInSkewT(true,c); - skewRsc.setCursorInHodo(false); - try { - skewBkRsc.updateDynamicData(c); - editor.refresh(); - - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - else if (bkRsc.getHodoBackground().contains(c)){ - //always update coordinate C to SkewT editor - cursorInHodo=true; - skewRsc.setCursorInHodo(true); - skewRsc.setCursorInSkewT(false,c); - try { - skewBkRsc.updateDynamicData(c); - editor.refresh(); - - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - else { - if(cursorInSkewT== true){ - cursorInSkewT=false; - skewRsc.setCursorInSkewT(false,c); - } - if(cursorInHodo== true){ - cursorInHodo=false; - skewRsc.setCursorInHodo(false); - } - } - - - } - - return false; - - } - - @Override - public boolean handleMouseUp(int x, int y, int mouseButton) { - //System.out.println("skewtRsc handleMouseUp"); - if(editor!=null){ - NsharpSkewTResource skewRsc = getDescriptor().getSkewtResource(); - NsharpBackgroundResource bkRsc = getDescriptor().getSkewTBkGResource(); - - // button 1 is left mouse button - if (mouseButton == 1 ){ - Coordinate c = editor.translateClick(x, y); - if(bkRsc.getHodoBackground().contains(c) == true ) { - //make sure it is clicked within hodo area - boolean graphEditOn = skewRsc.isEditGraphOn(); - if(graphEditOn && this.mode == Mode.HODO_DOWN_MOVE){ - NsharpShowTextDialog osDia = NsharpShowTextDialog.getAccess( ); - if(osDia != null) - osDia.refreshTextData(); - }else if (this.mode == Mode.HODO_DOWN){ - skewRsc.setHodoHouseC(c); - /* fixed TTR 6191 Coordinate c1 = bkRsc.getHodoBackground().getWorld().unMap(c.x, c.y); - c1 = WxMath.speedDir((float) c1.x, (float) c1.y); - skewRsc.getNsharpNative().nsharpLib.set_storm((float) c1.x, (float) c1.y); */ - } - - } - else if(bkRsc.getDataTimelineBackground().contains(c) == true && this.mode == Mode.TIMELINE_DOWN) { - //data time line has been touched, and may be changed - skewRsc.handleUserClickOnTimeLine(c); - handleMouseMove(x,y); - - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - - } - else if(bkRsc.getStationIdBackground().contains(c) == true && this.mode == Mode.STATIONID_DOWN) { - //data time line has been touched, and may be changed - skewRsc.handleUserClickOnStationId(c); - handleMouseMove(x,y); - - - } - else if(bkRsc.getSkewTBackground().contains(c) == true && this.mode == Mode.SKEWT_DOWN) {// && mouseDownMove == true) { - skewRsc.setPlotInteractiveTemp(false); - skewRsc.applyInteractiveTempPoint(); - //System.out.println("skewtRsc handleMouseUp MOVE_POINT"); - NsharpShowTextDialog osDia = NsharpShowTextDialog.getAccess( ); - if(osDia != null) - osDia.refreshTextData(); - - } - else if((bkRsc.getDataPanel1Background().contains(c) == true /*|| bkRsc.getDataPanel3Background().contains(c) == true*/)&& this.mode == Mode.PARCELLINE_DOWN) { - //System.out.println("skewtRsc handleMouseUp panels"); - NsharpDrawPanels drawPanel = NsharpDrawPanels.getInstance(); - if(drawPanel != null){ - drawPanel.setUserPickedParcelLine(c); - } - } - this.mode = Mode.CREATE; - } else if(mouseButton == 3){ - //right mouse button - //System.out.println("skewtRsc handleMouseUp right button"); - NsharpMapResource.bringMapEditorToTop(); - } - editor.refresh(); - } - return false; - } - - //private void notifyResourceMiddleClicked(int x, int y) { - //} - - /** - * Gets the display you are using - * - * @return SkewTDisplay - */ - private NsharpSkewTDisplay getSkewtDisplay() { - if (editor != null) { - if (editor.getActiveDisplayPane().getDescriptor() instanceof NsharpSkewTDescriptor) { - // the ordering in the editor is paramount here!!!!! - if (editor.getActiveDisplayPane().getRenderableDisplay() instanceof NsharpSkewTDisplay) { - return ((NsharpSkewTDisplay) (editor.getActiveDisplayPane() - .getRenderableDisplay())); - } - } - } - return null; - } - - @Override - public boolean handleMouseExit(Event event) { - System.out.println("skewtRsc handleMouseExit"); - return false; - } - - public NsharpSkewTDescriptor getDescriptor() { - return (NsharpSkewTDescriptor) editor.getActiveDisplayPane() - .getDescriptor(); - } - - @Override - public boolean handleMouseEnter(Event event) { - // TODO Auto-generated method stub - return false; - } -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResource.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResource.java deleted file mode 100644 index 88b11ed1e4..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResource.java +++ /dev/null @@ -1,6795 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResource - * - * This java class performs the NSHARP NsharpSkewTResource functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- * 										Reused some software from com.raytheon.viz.skewt
- * 06/14/2011   11-5        Chin Chen   migration
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; - -import javax.measure.converter.UnitConverter; -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; - -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; - -import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigManager; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConfigStore; -import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; -import gov.noaa.nws.ncep.ui.nsharp.NsharpGraphProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpLineProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpSoundingElementStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationInfo; -import gov.noaa.nws.ncep.ui.nsharp.NsharpStationStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpTimeLineStateProperty; -import gov.noaa.nws.ncep.ui.nsharp.NsharpWxMath; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapMouseHandler; -import gov.noaa.nws.ncep.ui.nsharp.maprsc.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.menu.NsharpLoadDialog; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpDataHandling; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNativeConstants; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._lplvalues; -import gov.noaa.nws.ncep.ui.nsharp.natives.NsharpNative.NsharpLibrary._parcel; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpPaletteWindow; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpParcelDialog; -import gov.noaa.nws.ncep.ui.nsharp.palette.NsharpShowTextDialog; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDescriptor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTDisplay; -import gov.noaa.nws.ncep.ui.nsharp.skewt.NsharpSkewTEditor; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpIcingBackground; -import gov.noaa.nws.ncep.ui.nsharp.skewt.bkgd.NsharpTurbulenceBackground; - -import com.raytheon.uf.common.geospatial.ReferencedCoordinate; -import com.raytheon.uf.common.status.UFStatus; -import com.raytheon.uf.common.status.UFStatus.Priority; -import com.raytheon.uf.common.time.DataTime; -import com.raytheon.uf.viz.core.IDisplayPaneContainer; -import com.raytheon.uf.viz.core.IGraphicsTarget; -import com.raytheon.uf.viz.core.PixelExtent; -import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; -import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; -import com.raytheon.uf.viz.core.IGraphicsTarget.PointStyle; -import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; -import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; -import com.raytheon.uf.viz.core.datastructure.LoopProperties; -import com.raytheon.uf.viz.core.drawables.IFont; -import com.raytheon.uf.viz.core.drawables.IShadedShape; -import com.raytheon.uf.viz.core.drawables.IWireframeShape; -import com.raytheon.uf.viz.core.drawables.PaintProperties; -import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeMode; -import com.raytheon.uf.viz.core.drawables.IDescriptor.FrameChangeOperation; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.AbstractVizResource; -import com.raytheon.uf.viz.core.rsc.LoadProperties; -import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; -import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability; -import com.raytheon.uf.viz.sounding.SoundingParams; -import com.raytheon.uf.common.sounding.VerticalSounding; -import com.raytheon.uf.common.sounding.WxMath; -import com.raytheon.viz.core.ColorUtil; -import com.raytheon.viz.core.graphing.LineStroke; -import com.raytheon.viz.core.graphing.WGraphics; -import com.raytheon.viz.core.graphing.WindBarbFactory; -import com.sun.jna.ptr.FloatByReference; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.LineString; -@SuppressWarnings("deprecation") -public class NsharpSkewTResource extends AbstractVizResource { - private NsharpSkewTDescriptor desc=null; - NsharpNative nsharpNative=null; - private static final int DATAPAGEMAX =5; - private static final int INSETPAGEMAX =2; - private int currentTextPage= 1; - private int currentInsetPage= 1; - /* Hodograph Modes - definition is based on definitions in globals_xw.h of BigNsharp */ - private static final int HODO_NORMAL = 0; - //private static int HODO_EFFECTIVE= 1; not used in BigNsharp source code - private static final int HODO_STORMRELATIVE= 2; - private static final int HODO_BNDRY= 3; - private static final int HODO_MEANWIND= 4; - private int currentHodoWindMode = HODO_MEANWIND; - private NsharpConfigManager configMgr; - private NsharpConfigStore configStore; - private NsharpGraphProperty graphConfigProperty; - private HashMap linePropertyMap; - private int parcelLinesInPhysicalPanelNumber = 1; - private boolean overlayIsOn = false; - private boolean interpolateIsOn = false; - private boolean compareStnIsOn = false; - private boolean compareTmIsOn = false; - private boolean editGraphOn=false; - private boolean getTimeMatcher=false; - private static int CURSER_FONT_INC_STEP = 3; - private static int CURSER_FONT_10 =10; - private static int CURSER_STRING_OFF =CURSER_FONT_10+ 5*CURSER_FONT_INC_STEP; - private int curseToggledFontLevel= CURSER_FONT_10; //0:default 1:large 2:turn off display - private IGraphicsTarget target=null; - private RGB wwTypeColor; - private boolean cursorInSkewT = false, cursorInHodo=false; - private Coordinate cursorCor; - private double currentZoomLevel=1; - private int currentCanvasBoundWidth= NsharpConstants.DEFAULT_CANVAS_WIDTH; - private int currentCanvasBoundHeight= NsharpConstants.DEFAULT_CANVAS_HEIGHT; - public int TEMP_TYPE = 1; - public int DEWPOINT_TYPE = 2; - private int currentTempCurveType; - private int currentSoundingLayerIndex =0; - private int hodoEditingSoundingLayerIndex =0; - private boolean plotInteractiveTemp= false; - private Coordinate interactiveTempPointCoordinate; - private List intpSndLst = new ArrayList(); - public static final float INVALID_DATA = NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA; - protected static final double BARB_LENGTH = 3.5; - - private String soundingType= null; - - protected Map soundingMap; - - protected DataTime displayedSounding; - - private int currentGraphMode= NsharpConstants.GRAPH_SKEWT; - protected IFont font9=null; - protected IFont font10=null; - protected IFont font11=null; - protected IFont font12=null; - private float currentFont10Size=10; - - protected ListenerList listenerList = new ListenerList(); - - private List> soundingLysList = null; - - //current active sounding layer list - private List soundingLys = null; - private List previousSoundingLys = null; - private String pickedStnInfoStr; // current picked stn info with time line, e.g. "ATLH 2010-12-12 12:00:00" - private NsharpStationInfo pickedStnInfo = null; - private FrameChangeOperation currentOpDirection = FrameChangeOperation.NEXT; // next =forward - private int commonLinewidth; - private LineStyle commonLineStyle; - - private HashMap stormSlinkyColorMap = new HashMap(); - //list of sounding layer list for each data time line - private HashMap> dataTimelineSndLysListMap = new HashMap>(); - private HashMap> originalDataTimelineSndLysListMap= new HashMap>(); - //public enum State { - // CURRENT, ACTIVE, INACTIVE,NOTAVAIL ,OVERLAY, AVAIL//was , DISABLED - //} - //dataTimelineList: time line selected by user, but is updated based on available time line at DB at setRsc() - // this is derived from dataTimelineSndLysListMap. It has stn info + sounding time line info - // used field is used to identify if this time line is picked by user. user could pick multiple time lines for comparison - private List dataTimelineList= new ArrayList(); - public List getDataTimelineList() { - System.out.println("getDataTimelineList called"); - for(List stnList: stnTimeTable){ - for(NsharpSoundingElementStateProperty sndProp: stnList){ - ElementStateProperty elm = new ElementStateProperty(); - elm.elementDescription = sndProp.elementDescription; - elm.stnInfo = sndProp.stnInfo; - elm.elementState = sndProp.elementState; - dataTimelineList.add(elm); - } - } - Collections.sort(dataTimelineList, new ElementComparatorNameTime()); - return dataTimelineList; - } - - - // Chin Note: Store all sounding profiles property for GUI display control - // 1st index points to stnId and 2nd index points to time line. - // IN other words, the outer list is listed by stnId and inner list is listed by time line. - // It is same as [][] 2D matrix. When a new Stn with a time line loaded, - // We create a new stn list (in outer list) and fill in all (currently available) time lines (in inner list), even only one element is loaded. - // All unloaded element is marked as "NOTAVAIL" state. Only when user load new sounding at this stn at this time line, then change - // this element state out of "NOTAVAIL". - // stn1---> stn2--->stn3->... - // | | | - // V V V - // T1 T1 T1 - // | | | - // V V V - // T2 T2 T2 - // | | | - // V V V - // T3 T3 T3 - // | | | - // V V V - // Its outer list index should be in sync with stnStateList, and its inner list index should be in sync with timeLineStateList - // elementState should be AVAIL or NOTAVAIL only - private List>stnTimeTable = new ArrayList< List >(); - //timeLineStateList store time line administration state. Active, Inactive - private List timeLineStateList = new ArrayList(); - //stnStateList store stn administration states, Active, Inactive And stn info - private List stnStateList = new ArrayList(); - private NsharpSoundingElementStateProperty curSndProfileProp = null; - private NsharpSoundingElementStateProperty preSndProfileProp = null; - private int curTimeLinePage=1; - private int totalTimeLinePage=1; - private int curStnIdPage=1; - private int totalStnIdPage=1; - private int currentStnStateListIndex; - private int currentTimeLineStateListIndex; - private int previousTimeLineStateListIndex; - - public List> getStnTimeTable() { - return stnTimeTable; - } - - - public List getTimeLineStateList() { - return timeLineStateList; - } - - public List getStnStateList() { - return stnStateList; - } - - - private HashMap elementColorMap = new HashMap(); - public class ElementStateProperty { - String elementDescription; - NsharpConstants.State elementState; - NsharpStationInfo stnInfo; - public NsharpStationInfo getStnInfo() { - return stnInfo; - } - public void setStnInfo(NsharpStationInfo stnInfo) { - this.stnInfo = stnInfo; - } - public String getElementDescription() { - return elementDescription; - } - public NsharpConstants.State getElementState() { - return elementState; - } - } - - private NsharpDrawPanels drawPanel; - - public class ParcelData{ - short parcelType; - float parcelLayerPressure; - - public short getParcelType() { - return parcelType; - } - public void setParcelType(short parcelType) { - this.parcelType = parcelType; - } - public float getParcelLayerPressure() { - return parcelLayerPressure; - } - public void setParcelLayerPressure(float parcelLayerPressure) { - this.parcelLayerPressure = parcelLayerPressure; - } - - - }; - private List parcelList = new ArrayList(); - private short currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - private float currentParcelLayerPressure = NsharpNativeConstants.MU_LAYER; - private Integer markerWidth = 1; - private Coordinate hodoHouseC = new Coordinate(NsharpConstants.HODO_CENTER_X, NsharpConstants.HODO_CENTER_Y); - private float smWindDir, smWindSpd; - //shape and color storage - public class ShapeAndLineProperty { - IWireframeShape shape; - NsharpLineProperty lp; - public ShapeAndLineProperty() { - super(); - lp = new NsharpLineProperty(); - } - - } - //dynamic resource shapes - private IWireframeShape heightMarkRscShape=null; - private IWireframeShape omegaRscShape=null; - private IWireframeShape wetBulbTraceRscShape = null; - private IWireframeShape vtempTraceCurveRscShape = null; - private IWireframeShape thetaEPressureYRscShape = null; - private IWireframeShape thetaEPressureWRscShape = null; - private IWireframeShape thetaEPressureRRscShape = null; - private IWireframeShape thetaEHeightYRscShape = null; - private IWireframeShape thetaEHeightWRscShape = null; - private IWireframeShape thetaEHeightRRscShape = null; - private IWireframeShape srWindBRscShape = null; - private IWireframeShape srWindWRscShape = null; - private IWireframeShape srWindRRscShape = null; - private IWireframeShape srWindGRscShape = null; - private IWireframeShape srWindMRscShape = null; - private IWireframeShape verticalWindLabelShape = null; - private IWireframeShape verticalWindSbShape = null; - private IWireframeShape verticalWindRShape = null; - private IShadedShape cloudFMShape = null; - private IWireframeShape cloudFMLabelShape = null; - private IShadedShape cloudCEShape = null; - //ICING wireframe shape - private IWireframeShape icingTempShape = null; - private IWireframeShape icingRHShape = null; - private IWireframeShape icingEPIShape = null; - //Turbulence wireframe shape - private IWireframeShape turbLnShape = null; - private IWireframeShape turbWindShearShape = null; - - private List parcelTraceRscShapeList = new ArrayList(); - private ListhodoWindRscShapeList = new ArrayList(); - private ListpressureTempRscShapeList = new ArrayList(); - private ListwindBoxWindRscShapeList = new ArrayList(); - //static bk shape that not handled at background resource class - private IWireframeShape omegaBkgShape = null; - private IWireframeShape psblWatchTypeBkgShape = null; - private IWireframeShape windBoxBkgShape = null; - private IWireframeShape hodoWindMotionBoxShape = null; - public HashMap getLinePropertyMap() { - return linePropertyMap; - } - - public void toggleCurseDisplay() { - curseToggledFontLevel = curseToggledFontLevel + CURSER_FONT_INC_STEP; - if(curseToggledFontLevel > CURSER_STRING_OFF) - curseToggledFontLevel = CURSER_FONT_10; - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - } - - public boolean isCompareStnIsOn() { - return compareStnIsOn; - } - public boolean isCompareTmIsOn() { - return compareTmIsOn; - } - - public boolean isOverlayIsOn() { - return overlayIsOn; - } - - public void setCursorInSkewT(boolean cursorInSkewT, Coordinate c) { - this.cursorInSkewT = cursorInSkewT; - this.cursorCor = c; - } - public void setCursorInHodo(boolean cursorInHodo) { - this.cursorInHodo = cursorInHodo; - - } - public int getParcelLinesInPhysicalPanelNumber() { - return parcelLinesInPhysicalPanelNumber; - } - public NsharpNative getNsharpNative() { - return nsharpNative; - } - - public void setNextTextPage(){ - if(currentTextPage == DATAPAGEMAX){ - currentTextPage = 1; - } - else - currentTextPage++; - } - public void setNextInsetPage(){ - if(currentInsetPage == INSETPAGEMAX){ - currentInsetPage = 1; - } - else - currentInsetPage++; - } - - - public void setOverlayIsOn(boolean overlay) { - previousSoundingLys=null; - previousTimeLineStateListIndex=-1; - preSndProfileProp = null; - this.overlayIsOn = overlay; - - createRscHodoWindShapeAll(); - createRscPressTempCurveShapeAll(); - } - public void setInterpolateIsOn(boolean interpolateIsOn) { - this.interpolateIsOn = interpolateIsOn; - - } - - - public boolean isInterpolateIsOn() { - return interpolateIsOn; - } - public void setCompareStnIsOn(boolean compareIsOn) { - this.compareStnIsOn = compareIsOn; - /*if(compareStnIsOn){ - currentTimeLineStateListIndexBackup = currentTimeLineStateListIndex; - currentStnStateListIndexBackup = currentStnStateListIndex; - } - else{ - currentTimeLineStateListIndex = currentTimeLineStateListIndexBackup; - currentStnStateListIndex = currentStnStateListIndexBackup; - }*/ - //make sure soundingLys is not null - if(soundingLys==null && compareIsOn && currentTimeLineStateListIndex>=0){ - //find a new available stn for current time line - boolean found = false; - for(int i =0; i< stnStateList.size(); i++){ - if(stnStateList.get(i).stnState == NsharpConstants.State.ACTIVE - && stnTimeTable.get(i).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - found = true; - currentStnStateListIndex = i; - } - if(found) - break; - } - } - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - curStnIdPage = totalStnIdPage/numTimeLinePerPage + 1; - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - if(soundingLys!=null){ - createRscHodoWindShapeAll(); - createRscPressTempCurveShapeAll(); - } - } - public void setCompareTmIsOn(boolean compareIsOn) { - this.compareTmIsOn = compareIsOn; - /*if(compareTmIsOn){ - currentTimeLineStateListIndexBackup = currentTimeLineStateListIndex; - currentStnStateListIndexBackup = currentStnStateListIndex; - } - else{ - currentTimeLineStateListIndex = currentTimeLineStateListIndexBackup; - currentStnStateListIndex = currentStnStateListIndexBackup; - }*/ - //make sure soundingLys is not null - if(soundingLys==null && compareIsOn){ - //find a new available time line for current stn - boolean found = false; - for(int i =0; i< timeLineStateList.size(); i++){ - if(timeLineStateList.get(i).timeState == NsharpConstants.State.ACTIVE - && stnTimeTable.get(currentStnStateListIndex).get(i).elementState == NsharpConstants.State.AVAIL){ - found = true; - previousTimeLineStateListIndex = currentTimeLineStateListIndex; - currentTimeLineStateListIndex = i; - } - if(found) - break; - } - } - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - curTimeLinePage = currentTimeLineStateListIndex/numTimeLinePerPage + 1; - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - if(soundingLys!=null){ - createRscHodoWindShapeAll(); - createRscPressTempCurveShapeAll(); - } - } - - public void setEditGraphOn(boolean editGraphOn) { - this.editGraphOn = editGraphOn; - } - - public boolean isEditGraphOn() { - return editGraphOn; - } - - - public int getCurrentGraphMode() { - return currentGraphMode; - } - - public void setCurrentGraphMode(int currentGraphMode) { - this.currentGraphMode = currentGraphMode; - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - } - - - public short getCurrentParcel() { - return currentParcel; - } - - //native nsharp c/fortran lib - //NsharpNative is native nsharp lib awips/lib/libnsharp.so wrapper class - - public float getSmWindDir() { - return smWindDir; - } - public float getSmWindSpd() { - return smWindSpd; - } - - public void setCurrentHodoWindMode(int cursorPositionIndex) { - switch(cursorPositionIndex){ - case 0: - this.currentHodoWindMode = HODO_NORMAL; - break; - case 1: - this.currentHodoWindMode = HODO_STORMRELATIVE; - break; - case 2: - default: - this.currentHodoWindMode = HODO_MEANWIND; - break; - } - } - - public NsharpStationInfo getPickedStnInfo() { - return pickedStnInfo; - } - public String getSoundingType() { - return soundingType; - } - - - public void setSoundingType(String soundingType) { - this.soundingType = soundingType; - } - - public static NsharpSkewTResource createSkewtResource() { - LoadProperties loadProperties1 = new LoadProperties(); - ColorableCapability colorable1 = new ColorableCapability(); - colorable1.setColor(NsharpConstants.backgroundColor); - loadProperties1.getCapabilities().addCapability(colorable1); - return new NsharpSkewTResource(new NsharpSkewTResourceData(), - loadProperties1); - } - - public List> getSoundingLysList() { - return soundingLysList; - } - - public void setCurrentParcel(short currentParcel) { - this.currentParcel = currentParcel; - currentParcelLayerPressure=NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - //inform draw panel as well - if(drawPanel!=null){ - drawPanel.setCurrentParcel(currentParcel); - } - } - /* - * NOTE:::ONly one parcel will be in parcel list as current design changed to only show one configured parcel - * This is how BigNsharp does. - * Todo: replace List with just one ParcelData - */ - public void setParcelList(List parcelList) { - this.parcelList = parcelList; - if(parcelTraceRscShapeList.size()>0){ - for(IWireframeShape shape: parcelTraceRscShapeList){ - shape.dispose(); - } - parcelTraceRscShapeList.clear(); - } - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - for (ParcelData parData: parcelList){ - createRscParcelTraceShape( WGc, parData.parcelType,parData.parcelLayerPressure); - } - } - public void updateParcelFromPanel(short currentParcel){ - this.currentParcel = currentParcel; - currentParcelLayerPressure=NsharpNativeConstants.parcelToLayerMap.get(currentParcel); - //update parcel shape - List parcelList = new ArrayList(); - ParcelData pd= new ParcelData(); - pd.setParcelType(currentParcel); - pd.setParcelLayerPressure(currentParcelLayerPressure); - parcelList.add(pd); - setParcelList(parcelList); - } - /* - * NOTE:::when called, it assumed that this new element is current parcel. Therefore caller has to make sure of this. - * - public void addParcelToList(ParcelData parceldata) { - boolean addToList = true; - for(ParcelData pdata : parcelList){ - if((pdata.parcelType == parceldata.parcelType) && (pdata.parcelLayerPressure == parceldata.parcelLayerPressure)){ - addToList= false; - break; - } - } - if(addToList== true) - this.parcelList.add(parceldata); - - currentParcel = parceldata.getParcelType(); - currentParcelLayerPressure = parceldata.getParcelLayerPressure(); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - createRscParcelTraceShape( WGc, parceldata.parcelType,parceldata.parcelLayerPressure); - - }*/ - - - public void setSoundingLysList(List> soundingLysList) { - this.soundingLysList = soundingLysList; - } - - public void setHodoHouseC(Coordinate hodoHouseC) { - this.hodoHouseC = hodoHouseC; - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - Coordinate c = bkRsc.getHodoBackground().getWorld().unMap(hodoHouseC.x, hodoHouseC.y); - c = WxMath.speedDir((float) c.x, (float) c.y); - smWindDir = (float) c.y; - smWindSpd = (float)c.x; - nsharpNative.nsharpLib.set_storm(smWindSpd, smWindDir); - - WGraphics WGc = bkRsc.getPsblWatchTypeBackground().getWorld(); - createBkgPsblWatchShape(WGc); - //Sr wind vs Height graph shape need to recreate - WGc= bkRsc.getSrWindsBackground().getWorld(); - createRscSrWindShape(WGc); - - } - - //This function is called only when interpolation "on/off" is changed by user - public void resetInfoOnInterpolate(boolean interpolateIsOn) throws CloneNotSupportedException{ - //We dont want to assume previous interpolation on/off state. So, reset soundingLys any how. - this.interpolateIsOn = interpolateIsOn; - if(interpolateIsOn==false){ - //System.out.println(" interpolate is off "); - soundingLys = dataTimelineSndLysListMap.get(pickedStnInfoStr); - - } - else{ - //interpolation is on - //we dont want to change original raw data, so use a deep copy - //List intpSndLst = new ArrayList(); - intpSndLst.removeAll(intpSndLst); - for(NcSoundingLayer layer: dataTimelineSndLysListMap.get(pickedStnInfoStr)){ - intpSndLst.add((NcSoundingLayer) layer.clone()); - } - - // interpolation - intpSndLst = performInterpolation(intpSndLst); - - soundingLys = intpSndLst; - - } - - //#10440 test - nsharpNative.populateSndgData(soundingLys); - - //re-create shape - createRscWireFrameShapes(); - - } - /* - public void swapOverlay(){ - //System.out.println("swapOverlay entered"); - if(previousSoundingLys!=null && previousSoundingLys.size()>0){ - List tempSoundingLys = new ArrayList(); - tempSoundingLys = previousSoundingLys; - previousSoundingLys = soundingLys; - soundingLys = tempSoundingLys; - String tempStr = pickedStnInfoStr; - pickedStnInfoStr = preStnInfoStr; - preStnInfoStr = tempStr; - int tempIndex = preDataTimeLineIndex; - preDataTimeLineIndex = pickedDataTimeLineIndex; - pickedDataTimeLineIndex = tempIndex; - - resetData(); - } - }*/ - private void deepCopyDataMap(HashMap> src, HashMap> dest) { - dest.clear(); - Set keySet = src.keySet(); - for (String key: keySet){ - List oriLys = src.get(key); - List lys = new ArrayList(oriLys.size()); - for(NcSoundingLayer ly : oriLys){ - try { - lys.add((NcSoundingLayer)ly.clone()); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - } - dest.put(key, lys); - } - } - public void resetRsc() { - //System.out.println("resetRsc called"); - this.dataTimelineSndLysListMap.clear(); - //this.dataTimelineSndLysListMap = new HashMap>(); - deepCopyDataMap(this.originalDataTimelineSndLysListMap,this.dataTimelineSndLysListMap); - this.soundingLys = this.dataTimelineSndLysListMap.get(pickedStnInfoStr); - //Set default parcel trace data - parcelList.clear(); - ParcelData defParcel = new ParcelData(); - defParcel.setParcelType(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE ); - defParcel.setParcelLayerPressure(NsharpNativeConstants.MU_LAYER); - parcelList.add(defParcel); - setParcelList(parcelList); - setSoundingInfo(dataTimelineSndLysListMap.get(pickedStnInfoStr)); - currentTextPage = 1; - overlayIsOn = false; - interpolateIsOn = false; - compareStnIsOn = false; - editGraphOn = false; - resetData(); - - } - private synchronized void resetData(){ - //System.out.println("resetData called"); - //update active sounding layer and picked stn info - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - //re-populate snd data to nsharp native code lib for later calculating - nsharpNative.populateSndgData(soundingLys);// # 10440 test dataTimelineSndLysListMap.get(pickedStnInfoStr)); - //#10438 FloatByReference stwdir= new FloatByReference(-999); - //FloatByReference stwspd= new FloatByReference(-999); - //nsharpNative.nsharpLib.get_storm(stwspd, stwdir); - //#10438 bkRsc.setSmDir(stwdir.getValue()); - //bkRsc.setSmSpd(stwspd.getValue()); - //notify window pallet to change storm relative motion number - if(desc!=null){ - desc.setFrame(0); //NEW CODE - } - - if(soundingLys!= null && soundingLys.size() >0){ - //set initial hodohouseC - FloatByReference dummy1= new FloatByReference(-999); - FloatByReference dummy2= new FloatByReference(-999); - // #10438 FloatByReference wdir= new FloatByReference(-999); - // FloatByReference wspd= new FloatByReference(-999); - /* #10438 FloatByReference Surfpressure = new FloatByReference(-999); - nsharpNative.nsharpLib.get_surface(Surfpressure, dummy1, dummy2); - if(nsharpNative.nsharpLib.qc(Surfpressure.getValue()) == 1) { - nsharpNative.nsharpLib.mean_wind(Surfpressure.getValue(), nsharpNative.nsharpLib.ipres (nsharpNative.nsharpLib.msl (6000.0F)),dummy1, dummy2, wdir, wspd); - if( nsharpNative.nsharpLib.qc(wdir.getValue())==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - // ----- set hodo circle at Bunkers Right, Chin according to TTR6065 or RaytheonTicket#10438 - - smWindDir = (wdir.getValue() + 30.0f)%360; - smWindSpd = wspd.getValue() * 0.75f; - Coordinate c = WxMath.uvComp(smWindSpd,smWindDir); - hodoHouseC= bkRsc.getHodoBackground().getWorld().map(c); - nsharpNative.nsharpLib.set_storm(smWindSpd, smWindDir); - } - }*/ - // ----- set hodo circle at Bunkers Right, Chin according to TTR6065 or RaytheonTicket#10438 - FloatByReference bwdir= new FloatByReference(-999); - FloatByReference bwspd= new FloatByReference(-999); - nsharpNative.nsharpLib.bunkers_storm_motion(dummy1, dummy2, bwdir, bwspd); - Coordinate c = WxMath.uvComp(bwspd.getValue(),bwdir.getValue()); - hodoHouseC= bkRsc.getHodoBackground().getWorld().map(c); - smWindSpd = bwspd.getValue(); - smWindDir = bwdir.getValue(); - nsharpNative.nsharpLib.set_storm(smWindSpd, smWindDir); - //reset parcel - currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - currentParcelLayerPressure = NsharpNativeConstants.MU_LAYER; - //reset parcel dialog as well - if(NsharpParcelDialog.getAccess()!=null){ - NsharpParcelDialog.getAccess().resetUserDefParcel(); - } - //reset draw panel as well - if(drawPanel!=null){ - drawPanel.resetCurrentParcel(); - } - } - if(target != null){ - createRscWireFrameShapes(); - } - - - } - //NOTE: this comparator is coded only for dataTimelineList and stationIdList to use - //Typical time line string: e.g. KNJX 110810/00V000 (NAMS) meaning stnId=KNJX date=2011/Aug/10 Hour:00 - // we dont care about string after "V" - //compare station name first, then day/hour - //if only sta name available, then just compare sta name - //e.g. stationIdList only contain stn name in its element - public class ElementComparatorNameTime implements Comparator{ - @Override - public int compare(ElementStateProperty o1, ElementStateProperty o2) { - - String s1tok1="", s1tok2="";//, s1tok3=""; - String s2tok1="", s2tok2="";//, s2tok3=""; - StringTokenizer st1 = new StringTokenizer(o1.elementDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorNDH o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 < 2) - { - //stationIdList only contain stn name in its element - s1tok1 = st1.nextToken(); //stn name - } - else{ - s1tok1 = st1.nextToken(); //stn name - s1tok2 = st1.nextToken(); //date/hour - //int end = Math.min(9,s1tok2.length()); - //s1tok2 = s1tok2.substring(0,end); // get rind of Vxxx part if there is one - - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.elementDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorNDH o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 < 2) - { - s2tok1 = st2.nextToken(); //stn name - } - else{ - s2tok1 = st2.nextToken(); //stn name - s2tok2 = st2.nextToken(); //date/Hour - //int end = Math.min(9,s2tok2.length()); - //s2tok2 = s2tok2.substring(0,end);// get rind of Vxxx part if there is one - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - //same station name - if(s1tok2.compareTo(s2tok2) == 0){ - //same day - return 0; - }else if (s1tok2.compareTo(s2tok2) < 0){ - return 1; - } else if (s1tok2.compareTo(s2tok2) > 0) { - return -1; - } - - } else if (s1tok1.compareTo(s2tok1) < 0){ - return -1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return 1; - } - return 0; - } - } - public class SndPropElementComparatorStnId implements Comparator>{ - @Override - public int compare(List o1, List o2) { - - String s1tok1=""; - String s2tok1=""; - StringTokenizer st1 = new StringTokenizer(o1.get(0).stnDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorNDH o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 < 2) - { - //stationIdList only contain stn name in its element - s1tok1 = st1.nextToken(); //stn name - } - else{ - return 0; - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.get(0).stnDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorNDH o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 < 2) - { - s2tok1 = st2.nextToken(); //stn name - } - else{ - return 0; - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - //same station name - return 0; - - } else if (s1tok1.compareTo(s2tok1) < 0){ - return -1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return 1; - } - return 0; - } - } - public class StationStatePropertyComparator implements Comparator{ - @Override - public int compare(NsharpStationStateProperty o1, NsharpStationStateProperty o2) { - - String s1tok1=""; - String s2tok1=""; - StringTokenizer st1 = new StringTokenizer(o1.stnDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorNDH o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 < 2) - { - //stationIdList only contain stn name in its element - s1tok1 = st1.nextToken(); //stn name - } - else{ - return 0; - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.stnDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorNDH o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 < 2) - { - s2tok1 = st2.nextToken(); //stn name - } - else{ - return 0; - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - //same station name - return 0; - - } else if (s1tok1.compareTo(s2tok1) < 0){ - return -1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return 1; - } - return 0; - } - } - //NOTE: this comparator is coded only for dataTimelineList to use - //compare day/hour, then station name - //Typical time line string: e.g. KNJX 110810/00V000 (NAMS) - /*public class ElementComparatorTimeName implements Comparator{ - @Override - public int compare(T o1, T o2) { - - String s1tok1="", s1tok2=""; - String s2tok1="", s2tok2=""; - StringTokenizer st1 = new StringTokenizer(o1.elementDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorDHN o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 < 2) - { - if(tkCount1==0) - s1tok1= o2.elementDescription; - else - s1tok1 = st1.nextToken(); - } - else{ - s1tok1 = st1.nextToken(); //stn name - s1tok2 = st1.nextToken(); // - - - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.elementDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorDHN o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 < 2) - { - //return -1; - if(tkCount2==0) - s2tok1= o2.elementDescription; - else - s2tok1 = st2.nextToken(); - } - else{ - s2tok1 = st2.nextToken(); //stn name - s2tok2 = st2.nextToken(); // - - - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok2.compareTo(s2tok2) == 0){ //compare day/hour - //same - if(s1tok1.compareTo(s2tok1) == 0){//compare stn - return 0; - }else if (s1tok1.compareTo(s2tok1) < 0){ - return -1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return 1; - } - - } else if (s1tok2.compareTo(s2tok2) < 0){ - return 1; - } else if (s1tok2.compareTo(s2tok2) > 0) { - return -1; - } - return 0; - } - }*/ - //NOTE: this comparator is coded only for curAggregateTimeLineList to use - //compare day/hour at first tokne only - //Typical time line string: e.g. 110810/00V000 (NAMS) - public class ElementComparatorTimeLine implements Comparator{ - @Override - public int compare(ElementStateProperty o1, ElementStateProperty o2) { - - String s1tok1="";//, s1tok2=""; - String s2tok1="";//, s2tok2=""; - StringTokenizer st1 = new StringTokenizer(o1.elementDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorTimeLine o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 >= 1) - { - s1tok1 = st1.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.elementDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorTimeLine o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 >= 1) - { - s2tok1 = st2.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - return 0; - }else if (s1tok1.compareTo(s2tok1) < 0){ - return 1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return -1; - } - return 0; - } - } - public class SndPropElementComparatorTimeLine implements Comparator{ - @Override - public int compare(NsharpSoundingElementStateProperty o1, NsharpSoundingElementStateProperty o2) { - - String s1tok1="";//, s1tok2=""; - String s2tok1="";//, s2tok2=""; - StringTokenizer st1 = new StringTokenizer(o1.timeDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorTimeLine o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 >= 1) - { - s1tok1 = st1.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.timeDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorTimeLine o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 >= 1) - { - s2tok1 = st2.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - return 0; - }else if (s1tok1.compareTo(s2tok1) < 0){ - return 1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return -1; - } - return 0; - } - } - public class TimeLineStateComparator implements Comparator{ - @Override - public int compare(NsharpTimeLineStateProperty o1, NsharpTimeLineStateProperty o2) { - - String s1tok1="";//, s1tok2=""; - String s2tok1="";//, s2tok2=""; - StringTokenizer st1 = new StringTokenizer(o1.timeDescription); - int tkCount1 = st1.countTokens(); - //System.out.println("ElementComparatorTimeLine o1="+o1.elementDescription+"c1 = "+tkCount1); - if(tkCount1 >= 1) - { - s1tok1 = st1.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s1tok1+" t2="+s1tok2); - StringTokenizer st2 = new StringTokenizer(o2.timeDescription); - int tkCount2 = st2.countTokens(); - //System.out.println("ElementComparatorTimeLine o2="+o2.elementDescription+"c2 = "+tkCount2); - if(tkCount2 >= 1) - { - s2tok1 = st2.nextToken(); - } - else{ - return 0; - - } - //System.out.println("t1="+s2tok1+" t2="+s2tok2); - if(s1tok1.compareTo(s2tok1) == 0){ - return 0; - }else if (s1tok1.compareTo(s2tok1) < 0){ - return 1; - } else if (s1tok1.compareTo(s2tok1) > 0) { - return -1; - } - return 0; - } - } - - private int getTmLineIndexFromTimeLineStateList(String tmLine){ - for(NsharpTimeLineStateProperty sndProp: timeLineStateList){ - if(sndProp.timeDescription.equals(tmLine) ) - return timeLineStateList.indexOf(sndProp); - } - - return -1; - } - private int getStnIndexFromStnStateList(String stnId){ - for(NsharpStationStateProperty sndProp: stnStateList){ - if(sndProp.stnDescription.equals(stnId) ) - return stnStateList.indexOf(sndProp); - - } - return -1; - } - private void setCurrentTimeLineStateIndexForCurrentState(){ - boolean found = false; - for(NsharpTimeLineStateProperty tl:timeLineStateList){ - if(tl.timeState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(timeLineStateList.indexOf(tl)).elementState == NsharpConstants.State.AVAIL){ - currentTimeLineStateListIndex = timeLineStateList.indexOf(tl); - found = true; - break; // find a good time line state index - } - } - if(!found) - currentTimeLineStateListIndex = -1; - } - private void setCurrentStnStateIndexForCurrentTime(){ - boolean found = false; - for(NsharpStationStateProperty tl:stnStateList){ - if(tl.stnState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(stnStateList.indexOf(tl)).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - currentStnStateListIndex = stnStateList.indexOf(tl); - found = true; - break; // find a good stn state index - } - } - if(!found) - currentStnStateListIndex=-1; - } - - private void findCurrentElementIndexesAfterConfig(){ - if(stnStateList.size()<=0 || timeLineStateList.size() <=0){ - currentTimeLineStateListIndex=-1; - currentStnStateListIndex=-1; - return; - } - if(currentTimeLineStateListIndex <0 || currentTimeLineStateListIndex>=timeLineStateList.size()){ - //reset it - currentTimeLineStateListIndex = 0; - } - if(currentStnStateListIndex < 0 || currentStnStateListIndex >= stnStateList.size()){ - currentStnStateListIndex = 0; - } - if(timeLineStateList.get(currentTimeLineStateListIndex).timeState == NsharpConstants.State.ACTIVE && - stnStateList.get(currentStnStateListIndex).stnState == NsharpConstants.State.ACTIVE ) - return; - else if(timeLineStateList.get(currentTimeLineStateListIndex).timeState == NsharpConstants.State.INACTIVE && - stnStateList.get(currentStnStateListIndex).stnState == NsharpConstants.State.ACTIVE ){ - //find first active time line from list - for(NsharpTimeLineStateProperty sndProp: timeLineStateList){ - if(sndProp.timeState == NsharpConstants.State.ACTIVE ){ - currentTimeLineStateListIndex = timeLineStateList.indexOf(sndProp); - //current stn may not be available for this time line - if(stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == - NsharpConstants.State.AVAIL) - return; - else { - //need to find an available time line for this time line - setCurrentStnStateIndexForCurrentTime(); - return; - } - } - } - //come to here means nothing found, - currentTimeLineStateListIndex = -1; - } - else if(timeLineStateList.get(currentTimeLineStateListIndex).timeState == NsharpConstants.State.ACTIVE && - stnStateList.get(currentStnStateListIndex).stnState == NsharpConstants.State.INACTIVE ){ - for(NsharpStationStateProperty sndProp: stnStateList){ - if(sndProp.stnState == NsharpConstants.State.ACTIVE) { - currentStnStateListIndex = stnStateList.indexOf(sndProp); - //current time line may not be available for this stn - if(stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == - NsharpConstants.State.AVAIL) - return; - else { - //need to find an available time line for this stn - setCurrentTimeLineStateIndexForCurrentState(); - return; - } - } - } - //come to here means nothing found - currentStnStateListIndex = -1; - } - else{ - boolean found = false; - for(NsharpTimeLineStateProperty sndProp: timeLineStateList){ - if(sndProp.timeState == NsharpConstants.State.ACTIVE ){ - currentTimeLineStateListIndex = timeLineStateList.indexOf(sndProp); - found = true; - break; - } - if(!found) - currentTimeLineStateListIndex = -1; - } - for(NsharpStationStateProperty sndProp: stnStateList){ - if(sndProp.stnState == NsharpConstants.State.ACTIVE) { - currentStnStateListIndex = stnStateList.indexOf(sndProp); - return; - } - } - //come to here means nothing found - currentStnStateListIndex = -1; - } - - - } - //NEW CODE - private void findCurrentElementIndexesAfterDelete(){ - //find new indexes - for(NsharpTimeLineStateProperty tl:timeLineStateList){ - if(tl.timeState == NsharpConstants.State.ACTIVE){ - for(NsharpStationStateProperty stn: stnStateList){ - if(stn.stnState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(stnStateList.indexOf(stn)).get(timeLineStateList.indexOf(tl)).elementState == - NsharpConstants.State.AVAIL){ - currentStnStateListIndex = stnStateList.indexOf(stn); - currentTimeLineStateListIndex = timeLineStateList.indexOf(tl); - return; - } - } - } - } - currentStnStateListIndex = -1; - currentTimeLineStateListIndex = -1; - - } - - private void addElementToTableAndLists(String elementDesc,String stnId, String tmLine, NsharpStationInfo stnInfo){ - System.out.println("stn to be added "+ stnId + " timeline "+tmLine); - NsharpSoundingElementStateProperty newSndPropElem=null; - NsharpSoundingElementStateProperty dummySndPropElem=null; - int tmIndex = getTmLineIndexFromTimeLineStateList(tmLine);//getTmLineIndexByTimeLine(tmLine); - int stnIndex = getStnIndexFromStnStateList(stnId);//getStnIndexByStnId(stnId); - if(tmIndex>=0 && stnIndex>=0){ - if(stnTimeTable.get(stnIndex).get(tmIndex).elementState == NsharpConstants.State.AVAIL) - // this sounding element is already loaded - return; - else { - // this element is previous created but marked as NOTAVAIL state. - newSndPropElem = stnTimeTable.get(stnIndex).get(tmIndex); - newSndPropElem.setElementState(NsharpConstants.State.AVAIL); - newSndPropElem.setElementDescription(elementDesc); - currentTimeLineStateListIndex = tmIndex; - currentStnStateListIndex = stnIndex; - } - } - else if (tmIndex >=0 && stnIndex < 0){ - // a new stnId with existing time line - // Based on our design rules, we will create a new stn with a time line list same as timeLineStateList - // All time lines will marked as "NOTAVAIL" except this been loaded one - // need a new stn time line list in stnTimeTable - List newList = new ArrayList(); - for(NsharpTimeLineStateProperty sndProp: timeLineStateList){ - if(tmLine.equals(sndProp.timeDescription)){ - //stnId state should be active, but time line state should based on its peer in other stn - newSndPropElem = - new NsharpSoundingElementStateProperty(elementDesc, NsharpConstants.State.AVAIL,stnId, tmLine, stnInfo); - - newList.add(newSndPropElem); - } - else{ - //create time line for not avail sounding profiles - String elmDes= stnId+" "+sndProp.timeDescription; - dummySndPropElem = - new NsharpSoundingElementStateProperty(elmDes, NsharpConstants.State.NOTAVAIL,stnId, sndProp.timeDescription, stnInfo); - newList.add(dummySndPropElem); - } - - } - //finally, add this new stn list to table - stnTimeTable.add(newList); - //newList is created according to existing list, so, sorting on time line is not necessary. - //However, we have to sort stnId in stnTimeTable (outer list) - Collections.sort(stnTimeTable, new SndPropElementComparatorStnId()); - //add new stn to stnStateList - NsharpStationStateProperty stn = new NsharpStationStateProperty(stnId,NsharpConstants.State.ACTIVE,stnInfo); - stnStateList.add(stn); - Collections.sort(stnStateList, new StationStatePropertyComparator()); - currentStnStateListIndex = stnStateList.indexOf(stn); - currentTimeLineStateListIndex = tmIndex; - }else if (tmIndex < 0 && stnIndex >= 0){ - // a new time line with existing stnId - // Based on our design rules, we will add a new time line to each existing stns' time line list - // Time line element added to a stn which is not the new "coming stn" will marked as "NOTAVAIL" - for(List stnList: stnTimeTable){ - for(NsharpSoundingElementStateProperty sndProp: stnList){ - if(sndProp.stnDescription.equals(stnId) ){ - //time line state should be active, but stnId state should based on its peer in other time line - newSndPropElem = - new NsharpSoundingElementStateProperty(elementDesc, NsharpConstants.State.AVAIL,stnId, tmLine, stnInfo); - //newSndPropElem.elementState = decideNewLoadElementState(newSndPropElem); - stnList.add(newSndPropElem); - } - else{ - String elmDes= sndProp.stnDescription+" "+tmLine; - dummySndPropElem = - new NsharpSoundingElementStateProperty(elmDes, NsharpConstants.State.NOTAVAIL,sndProp.stnDescription, tmLine, sndProp.stnInfo); - stnList.add(dummySndPropElem); - } - - break; // only add one element for each list, break out of here. - } - // we have to sort time line - Collections.sort(stnList, new SndPropElementComparatorTimeLine()); - - } - //add new time line to NsharpTimeLineStateProperty - NsharpTimeLineStateProperty tl = new NsharpTimeLineStateProperty(tmLine, NsharpConstants.State.ACTIVE); - timeLineStateList.add(tl); - Collections.sort(timeLineStateList, new TimeLineStateComparator()); - currentTimeLineStateListIndex = timeLineStateList.indexOf(tl); - currentStnStateListIndex = stnIndex; - } else { - // an element with new time line and new stnId - // need to do both cases above - //add new time line to NsharpTimeLineStateProperty - NsharpTimeLineStateProperty tl = new NsharpTimeLineStateProperty(tmLine, NsharpConstants.State.ACTIVE); - timeLineStateList.add(tl); - Collections.sort(timeLineStateList, new TimeLineStateComparator()); - currentTimeLineStateListIndex = timeLineStateList.indexOf(tl); - //add new stn to stnStateList - NsharpStationStateProperty stn = new NsharpStationStateProperty(stnId,NsharpConstants.State.ACTIVE,stnInfo); - stnStateList.add(stn); - Collections.sort(stnStateList, new StationStatePropertyComparator()); - currentStnStateListIndex = stnStateList.indexOf(stn); - - // need a new stn time line list to stnTimeTable - List newList = new ArrayList(); - if(stnTimeTable.size()>0){ - // do new stn id case first, add element for each existing time line - for(NsharpTimeLineStateProperty sndProp: timeLineStateList){ - if(tmLine.equals(sndProp.timeDescription)){ - //stnId state should be active, but time line state should based on its peer in other stn - newSndPropElem = - new NsharpSoundingElementStateProperty(elementDesc, NsharpConstants.State.AVAIL,stnId, tmLine, stnInfo); - - newList.add(newSndPropElem); - } - else{ - //create time line for not avail sounding profiles - String elmDes= stnId+" "+sndProp.timeDescription; - dummySndPropElem = - new NsharpSoundingElementStateProperty(elmDes, NsharpConstants.State.NOTAVAIL,stnId, sndProp.timeDescription, stnInfo); - newList.add(dummySndPropElem); - } - - } - // we do not have to sort time line as we add it according to newly sorted timeLineStateList - //now add new time line element for each existing stns, except the new one, - //Note that we have NOT add "newList" to stnTimeTable yet, so just loop through "current" table. - for(List stnList: stnTimeTable){ - for(NsharpSoundingElementStateProperty sndProp: stnList){ - String elmDes= sndProp.stnDescription+" "+tmLine; - dummySndPropElem = - new NsharpSoundingElementStateProperty(elmDes, NsharpConstants.State.NOTAVAIL,sndProp.stnDescription, tmLine, sndProp.stnInfo); - stnList.add(dummySndPropElem); - break; // only add one element for each list, break out of here. - } - // we have to sort time line - Collections.sort(stnList, new SndPropElementComparatorTimeLine()); - } - //finally, add this new stn list to table - stnTimeTable.add(newList); - //we have to sort stnId in stnTimeTable (outer list) - Collections.sort(stnTimeTable, new SndPropElementComparatorStnId()); - } - else{ - //this is the case, we are adding first element to stnTimeTable - newSndPropElem = - new NsharpSoundingElementStateProperty(elementDesc, NsharpConstants.State.AVAIL,stnId, tmLine,stnInfo); - newList.add(newSndPropElem); - stnTimeTable.add(newList); - curSndProfileProp=newSndPropElem; - return; - } - } - findCurrentElementIndexesAfterConfig(); - setCurSndProfileProp(); - } - private void updateStnTimeTableAndList(){ - List removeIntLst = new ArrayList(); - if(stnTimeTable.size() > 0 && stnTimeTable.get(0).size()>0){ - - int timeLinePerStn = stnTimeTable.get(0).size(); - for(int i=0; i< timeLinePerStn; i++){ - boolean found =false; - for(List stnList: stnTimeTable){ - NsharpSoundingElementStateProperty elm= stnList.get(i); - if(elm.getElementState() !=NsharpConstants.State.NOTAVAIL){ - found = true; - break; - } - } - if(!found){ - //remove this time line from all stns' time list - removeIntLst.add(i); - } - } - //remove timeline backward from list - for(int i = removeIntLst.size()-1; i >=0; i--){ - for(List stnTimeList: stnTimeTable){ - stnTimeList.remove(stnTimeList.get(removeIntLst.get(i))); - - } - //update timeLineStateList as well - timeLineStateList.remove(timeLineStateList.get(removeIntLst.get(i))); - } - } - removeIntLst.clear(); - //List> removeLst = new ArrayList> (); - for(List stnList: stnTimeTable){ - if(stnList.size() <=0 ){ - //after remove time line above, it is possible that stn does not have any time line - //removeLst.add(stnList); - removeIntLst.add(stnTimeTable.indexOf(stnList)); - continue; - } - boolean found =false; - for(NsharpSoundingElementStateProperty elm: stnList){ - if(elm.getElementState() !=NsharpConstants.State.NOTAVAIL){ - found = true; - break; - } - } - if(!found){ - //all stns time lines are unloaded, remove this stn - //removeLst.add(stnList); - removeIntLst.add(stnTimeTable.indexOf(stnList)); - } - } - for(int i = removeIntLst.size()-1; i >=0; i--){ - stnTimeTable.remove(stnTimeTable.get(removeIntLst.get(i))); - //update stnStateList as well - stnStateList.remove(stnStateList.get(removeIntLst.get(i))); - - } - } - - private void setCurSndProfileProp() { - if(currentTimeLineStateListIndex <0 || currentTimeLineStateListIndex >= timeLineStateList.size()|| - currentStnStateListIndex < 0 || currentStnStateListIndex >= stnStateList.size()){ - curSndProfileProp = null; - preSndProfileProp = null; - } - else { - preSndProfileProp = curSndProfileProp; - curSndProfileProp = stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex); - } - } - /* - * Note: each deletingTimeList's element (a String) is used to mapped to elementDescription (a String) - * of dataTimelineList's elements, which has same value as key (a String) of dataTimelineSndLysListMap - */ - public boolean deleteRsc(List deletingDataTimeList){ - boolean curSndDeleted = false; - for(String dataTmLine: deletingDataTimeList){ - if(curSndProfileProp.elementDescription.equals(dataTmLine)){ - curSndDeleted = true; - } - dataTimelineSndLysListMap.remove(dataTmLine); - //set state to NOTAVAIL from stnTimeTable - boolean setdone = false; - for(List stnList: stnTimeTable){ - for(NsharpSoundingElementStateProperty elm: stnList){ - if(dataTmLine.equals(elm.elementDescription)){ - elm.setElementState(NsharpConstants.State.NOTAVAIL); - updateStnTimeTableAndList(); - setdone = true; - break; - } - } - if(setdone) - break; - } - } - if(curSndDeleted){ - //this is the case that we are deleting current snd, so, a new current snd should be selected - curSndProfileProp = null; - findCurrentElementIndexesAfterDelete(); - setCurSndProfileProp(); - } - else{ - // currentTimeLineStateListIndex and currentStnStateListIndex may be not point to right element - //after some elements are deleted. - // re-find them - currentStnStateListIndex = -1; - currentTimeLineStateListIndex = -1; - if(curSndProfileProp!= null){ - for(List stnList: stnTimeTable){ - for(NsharpSoundingElementStateProperty elm: stnList){ - if(curSndProfileProp.elementDescription.equals(elm.elementDescription)){ - currentTimeLineStateListIndex = stnList.indexOf(elm); - currentStnStateListIndex = stnTimeTable.indexOf(stnList); - break; - } - } - } - } - } - - setCurrentSoundingLayerInfo(); - return curSndDeleted; - // anything more to do? - } - public void deleteRscAll(){ - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource(); - nsharpMapResource.setPoints(null); - cleanUpRsc(); - //System.out.println("NsharpSkewTResource deleteRscAll() called"); - } - - private void setCurrentSoundingLayerInfo() { - if(currentTimeLineStateListIndex >=0 && currentStnStateListIndex>=0 ){ - pickedStnInfoStr = stnTimeTable.get( currentStnStateListIndex).get( currentTimeLineStateListIndex).getElementDescription(); - pickedStnInfo = stnTimeTable.get( currentStnStateListIndex).get( currentTimeLineStateListIndex).getStnInfo(); - - if(stnTimeTable.get( currentStnStateListIndex).get( currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - - if(overlayIsOn){ - previousSoundingLys = soundingLys; - } - else { - previousSoundingLys = null; - } - - if(interpolateIsOn == true){ - //we dont want to change original raw data, so use a new copy - NcSoundingLayer newLayer; - List mySndLst = new ArrayList(); - for(NcSoundingLayer layer: dataTimelineSndLysListMap.get(pickedStnInfoStr)){ - newLayer = new NcSoundingLayer(); - try { - newLayer = (NcSoundingLayer) layer.clone(); - - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } //here a shallowCopy is enough - mySndLst.add(newLayer); - } - // interpolation - mySndLst = performInterpolation(mySndLst); - - soundingLys = mySndLst; - } - else { - soundingLys = dataTimelineSndLysListMap.get(pickedStnInfoStr); - - } - - } - else{ - previousSoundingLys = null; - soundingLys = null; - } - } - else{ - pickedStnInfoStr= null; - previousSoundingLys = null; - soundingLys = null; - pickedStnInfo= null; - } - } - public void addRsc(Map> soundMap, NsharpStationInfo stnInfo){ - //make sure not adding duplicated sounding data - System.out.println("NsharpSkewTResource addRsc called"); - Set duplicateKeys = new HashSet(); - for(String key: soundMap.keySet()) { - if(dataTimelineSndLysListMap.containsKey(key)==true) - duplicateKeys.add(key); - } - for(String key: duplicateKeys) { - soundMap.remove(key); - } - if(soundMap.size() <=0){ - return; - } - //add new data - dataTimelineSndLysListMap.putAll(soundMap); - Set dataTimelineSet = soundMap.keySet(); - String[] tempTimeLineArr = dataTimelineSet.toArray(new String[dataTimelineSet.size()]); - Arrays.sort(tempTimeLineArr); - // ADD new time line(s) to dataTimelineList, stationIdList,curAggregateTimeLineList - for (int i=0; i< tempTimeLineArr.length; i++){ - //System.out.println(newElm.elementDescription); - String elmDesc = tempTimeLineArr[i].toString(); - String stnId = elmDesc.substring(0,elmDesc.indexOf(" ")); - String timeLine= elmDesc.substring(elmDesc.indexOf(" ")+1); - //add time line to stnTimeTable and set its index - addElementToTableAndLists(elmDesc,stnId,timeLine,stnInfo); - } - //Set default parcel trace data - parcelList.clear(); - ParcelData defParcel = new ParcelData(); - defParcel.setParcelType(NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE ); - defParcel.setParcelLayerPressure(NsharpNativeConstants.MU_LAYER); - parcelList.add(defParcel); - setCurrentSoundingLayerInfo(); - resetData(); - - //set total time line group and stn id list page number - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - - totalTimeLinePage = timeLineStateList.size()/numTimeLinePerPage + 1; //NEW CODE - curTimeLinePage = currentTimeLineStateListIndex/numTimeLinePerPage + 1; //NEW CODE - totalStnIdPage = stnStateList.size()/numTimeLinePerPage + 1; //NEW CODE - curStnIdPage= currentStnStateListIndex/numTimeLinePerPage + 1; //NEW CODE - - //System.out.println("totalTimeGroupPage ="+totalTimeGroupPage+ " curTimeGroupPage:"+ this.curTimeGroupPage); - NsharpSkewTDisplay renderableDisplay = (NsharpSkewTDisplay) descriptor.getRenderableDisplay(); - if(renderableDisplay != null) { - IDisplayPaneContainer editor = renderableDisplay.getContainer(); - if(editor instanceof NsharpSkewTEditor) { - int editorNum = ((NsharpSkewTEditor) editor).getEditorNum(); - renderableDisplay.setEditorNum(editorNum); - } - } - //set data time to descriptor - //this is necessary for looping - if ((descriptor.getFramesInfo().getFrameCount() == 0)&& !getTimeMatcher) { - //DataTime[] dataTimes = new DataTime[dataTimelineList.size()]; - //Chin Note: we just have to do this once and set dataTimes size bigger than 1. - //Nsharp handles changing frame itself. It just need system to send change frame notice. - //That is happened at NsharpSkewTDescriptor.checkDrawTime(). - DataTime[] dataTimes = new DataTime[2/*stnTimeTable.size()*/]; - Date now = new Date(); - for(int k =0; k < 2/*stnTimeTable.size()*/ ; k++){ - dataTimes[k]= new DataTime(now, k); - } - //no need to get a descriptor from a renderableDispaly since we have a descriptor - descriptor.setDataTimes(dataTimes); - getTimeMatcher=true; - } - - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - currentGraphMode=NsharpPaletteWindow.getCurrentGraphMode(); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc!=null) - bkRsc.setCurrentGraphMode(currentGraphMode); - deepCopyDataMap(this.dataTimelineSndLysListMap,this.originalDataTimelineSndLysListMap); - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - - } - - public String getPickedStnInfoStr() { - return pickedStnInfoStr; - } - - - public void handleUserClickOnStationId(Coordinate c) { - int numStnIdPerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - //first to find if it is for change to next page, or change sorting - //System.out.println("numTimeLinePerPage="+numTimeLinePerPage+"gap="+(NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)); - int index =((int)(c.y - NsharpConstants.DATA_TIMELINE_REC_Y_ORIG))/ NsharpConstants.CHAR_HEIGHT; - if(index == 0 ){ - if( totalStnIdPage == 1) - return; - - curStnIdPage++; - if(curStnIdPage>totalStnIdPage) - curStnIdPage=1; - - return; - } - // recalculate index for time line - index =((int)(c.y - NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END))/ NsharpConstants.CHAR_HEIGHT + - (curStnIdPage-1)* numStnIdPerPage ; - - if( index < this.stnStateList.size() ){ - switch(stnStateList.get(index).stnState){ - - case INACTIVE: - stnStateList.get(index).stnState = NsharpConstants.State.ACTIVE; - break; - case ACTIVE: - stnStateList.get(index).stnState = NsharpConstants.State.INACTIVE; - - break; - default: - return; - } - findCurrentElementIndexesAfterConfig(); - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - - } - } - - public void handleUserClickOnTimeLine(Coordinate c) { - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - //first to find if it is for change to next page, or change sorting - //System.out.println("numTimeLinePerPage="+numTimeLinePerPage+"gap="+(NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)); - int index =((int)(c.y - NsharpConstants.DATA_TIMELINE_REC_Y_ORIG))/ NsharpConstants.CHAR_HEIGHT; - if(index == 0 ){ - if( totalTimeLinePage == 1) // - return; - - curTimeLinePage++; - if(curTimeLinePage>totalTimeLinePage) - curTimeLinePage=1; - return; - } - // recalculate index for time line - index =((int)(c.y - NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END))/ NsharpConstants.CHAR_HEIGHT + - (curTimeLinePage-1)* numTimeLinePerPage ; - - if( index < timeLineStateList.size() ){ - switch(timeLineStateList.get(index).timeState){ - case INACTIVE: - timeLineStateList.get(index).timeState = NsharpConstants.State.ACTIVE; - break; - case ACTIVE: - timeLineStateList.get(index).timeState = NsharpConstants.State.INACTIVE; - break; - default: - return; - - } - } - // - findCurrentElementIndexesAfterConfig(); - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - - if(compareStnIsOn){ - createRscHodoWindShapeAll(); - createRscPressTempCurveShapeAll(); - } - } - - - private void moveTimeLineIndexBackward(){ - previousTimeLineStateListIndex = currentTimeLineStateListIndex; - int counter=0; - while(true){ - currentTimeLineStateListIndex++; - currentTimeLineStateListIndex = currentTimeLineStateListIndex % this.timeLineStateList.size(); - counter++; - if(counter > timeLineStateList.size()) - break; - if(timeLineStateList.get(currentTimeLineStateListIndex).getTimeState() == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - break;//out of while loop - } - - } - } - private void moveTimeLineIndexForward (){ - previousTimeLineStateListIndex = currentTimeLineStateListIndex; - int counter=0; - while(true){ - currentTimeLineStateListIndex= currentTimeLineStateListIndex + this.timeLineStateList.size();// so, we wont get a negative number - currentTimeLineStateListIndex--; - currentTimeLineStateListIndex = currentTimeLineStateListIndex % this.timeLineStateList.size(); - counter++; - if(counter > timeLineStateList.size()) - break; - if(timeLineStateList.get(currentTimeLineStateListIndex).getTimeState() == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - break;//out of while loop - } - } - //System.out.println("timeline="+timeLineStateList.get(pickedTimeGroupIndex).getElementDescription()); - } - private void moveTimeLineIndexCycle (){ - previousTimeLineStateListIndex = currentTimeLineStateListIndex; - //Note: direction should only be NEXT or PREVIOUS - int counter=0; - while(true){ - counter++; - if(counter > timeLineStateList.size()){ - currentTimeLineStateListIndex = previousTimeLineStateListIndex; - break; - } - if(currentOpDirection == FrameChangeOperation.NEXT ){ - currentTimeLineStateListIndex--; - if(currentTimeLineStateListIndex <= 0){ - //the end of forward direction, change direction to backward - currentOpDirection = FrameChangeOperation.PREVIOUS; - currentTimeLineStateListIndex=0; - } - - } - else{ // direction is FrameChangeOperation.PREVIOUS - currentTimeLineStateListIndex++; - if(currentTimeLineStateListIndex >= timeLineStateList.size()-1){ - //the end of backward direction, change direction to forward - currentOpDirection = FrameChangeOperation.NEXT; - currentTimeLineStateListIndex = timeLineStateList.size()-1; - } - } - if(timeLineStateList.get(currentTimeLineStateListIndex).getTimeState() == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - break;//out of while loop - } - } - - } - /* - * Note: looping only apply to curAggregateTimeLineList NOT stationIdList - */ - public void setLoopingDataTimeLine(LoopProperties loopProperties) { - //System.out.println("setLoopingDataTimeLine loopmode ="+loopProperties.getMode().toString()); - if( this.timeLineStateList.size()>0) { - switch(loopProperties.getMode()){ - case Forward: - moveTimeLineIndexForward(); - break; - case Backward: - moveTimeLineIndexBackward(); - break; - case Cycle: - moveTimeLineIndexCycle(); - - break; - } - - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - curTimeLinePage = currentTimeLineStateListIndex/numTimeLinePerPage + 1; - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - issueRefresh(); - //NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - //if (editor != null) { - // editor.refresh(); - //} - } - - } - public enum LoopMode { - Forward, Backward, Cycle - }; - - private int getActiveTimeLineNumber(){ - int n=0; - for (NsharpTimeLineStateProperty tm:timeLineStateList){ - if(tm.timeState == NsharpConstants.State.ACTIVE){ - n++; - } - } - return n; - } - private int getActiveStnNumber(){ - int n=0; - for (NsharpStationStateProperty stn:stnStateList){ - if(stn.stnState == NsharpConstants.State.ACTIVE){ - n++; - } - } - return n; - } - public void setSteppingTimeLine(FrameChangeOperation operation, FrameChangeMode mode) { - if( this.timeLineStateList.size() > 0 && getActiveTimeLineNumber()>1/* && getAvailTimeLineNumber(currentStnStateListIndex)>1*/) { - int targetIndex = currentTimeLineStateListIndex; - //previousTimeLineStateListIndex = currentTimeLineStateListIndex; - //preset index for LAST and FIRST operation - switch(operation){ - case LAST: //the future-est time, at top of time line shown. set to -1, so in while loop, it starts from 0 - targetIndex=-1;// - break; - case FIRST: //the oldest time, set to dataTimelineList.length, so in while loop, it starts from dataTimelineList.length-1 - targetIndex = timeLineStateList.size(); - break; - } - - int counter=0; - while(true){ - switch(operation){ - case LAST: //the future-est time, at top of time line shown - targetIndex++; - break; - case FIRST: //the oldest time - targetIndex--; - break; - case PREVIOUS: - targetIndex++; - targetIndex = targetIndex % this.timeLineStateList.size(); - break; - case NEXT: - // so, we wont get a negative number - targetIndex= targetIndex + this.timeLineStateList.size(); - targetIndex--; - targetIndex = targetIndex % this.timeLineStateList.size(); - break; - } - counter++; - if(counter >= timeLineStateList.size()) - return; // looped through whole list already, and index back to original - if(timeLineStateList.get(targetIndex).getTimeState() == NsharpConstants.State.ACTIVE) { - if(compareTmIsOn - && stnTimeTable.get(currentStnStateListIndex).get(targetIndex).elementState == NsharpConstants.State.NOTAVAIL){ - continue; - } - else if(compareStnIsOn){ - boolean found = false; - //find an active and available stn for this timeline and set is as current - for (int i=0; i < stnStateList.size(); i++){ - if(stnStateList.get(i).stnState==NsharpConstants.State.ACTIVE && - stnTimeTable.get(i).get(targetIndex).elementState == NsharpConstants.State.AVAIL){ - currentStnStateListIndex = i; - found = true; - break; - } - } - if(!found){ - currentStnStateListIndex = -1; - } - //no matter we find current stn or not - //we should get out of here - break; - } - else{ - break; - } - } - } - previousTimeLineStateListIndex = currentTimeLineStateListIndex; - currentTimeLineStateListIndex = targetIndex; - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - curTimeLinePage = currentTimeLineStateListIndex/numTimeLinePerPage + 1; - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - } - } - - /* - * Stn index stepping is only controlled by up/down arrow keys, down key = NEXT operation, up key = PREVIOUS operation - */ - public void setSteppingStnIdList(FrameChangeOperation operation) { - if( this.stnStateList.size() > 0 && getActiveStnNumber()>1/* && getAvailStnNumber(currentTimeLineStateListIndex) > 1*/){ - - int counter=0; - while(true){ - switch(operation){ - case PREVIOUS: - currentStnStateListIndex= currentStnStateListIndex + this.stnStateList.size(); - currentStnStateListIndex--; - currentStnStateListIndex = currentStnStateListIndex % this.stnStateList.size(); - break; - case NEXT: - // so, we wont get a negative number - currentStnStateListIndex++; - currentStnStateListIndex = currentStnStateListIndex % this.stnStateList.size(); - break; - } - counter++; - //System.out.println("counter = "+ counter); - if(counter >= stnStateList.size()) - return; // looped through whole list already, and index back to original - if(stnStateList.get(currentStnStateListIndex).stnState == NsharpConstants.State.ACTIVE){ - if (compareStnIsOn - && stnTimeTable.get(currentStnStateListIndex).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.NOTAVAIL){ - continue; - } - else if(compareTmIsOn){ - boolean found = false; - //find an active and available timeline for this stn and set is as current - for (int i=0; i < timeLineStateList.size(); i++){ - if(timeLineStateList.get(i).timeState==NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(i).elementState == NsharpConstants.State.AVAIL){ - currentTimeLineStateListIndex = i; - found = true; - break; - } - } - if(!found){ - currentTimeLineStateListIndex = -1; - } - //no matter we find current time line for this stn or not - //we should get out of here - break; - } - else - break; - } - } - int numTimeLinePerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - curStnIdPage = currentStnStateListIndex/numTimeLinePerPage + 1; - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - - NsharpSkewTEditor editor = NsharpSkewTEditor.getActiveNsharpEditor(); - if (editor != null) { - editor.refresh(); - } - } - - } - //used for sorting - public class tempPoint implements Comparable{ - double diff; - double temp; - double pressure; - int type; //1= temp, 2 = dewpoint - tempPoint(double diff,double temp,double pressure, int type){ - this.diff = diff; - this.temp = temp; - this.pressure = pressure; - this.type = type; - } - - @Override - public int compareTo(tempPoint o) { - if(this.diff >= o.diff) - return 1; - else - return 0; - } - } - /* - * Return the closest point to the input point on Hodo graph - */ - public Coordinate getClosestHodoPoint(Coordinate inputC){ - //System.out.println("picked pt CX "+ inputC.x + " CY "+ inputC.y); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - Coordinate closeptC = new Coordinate(); - double curSmallestDist=10000; // picked a impossible big number to start with - double distance; - boolean ptFound = false; - NcSoundingLayer layer; - /* - * Note: soundingLys list sorted with highest pressure as first element - */ - for (int i=0; i< this.soundingLys.size(); i++) { - layer = this.soundingLys.get(i); - double curS, curD; - curS = layer.getWindSpeed(); - curD = layer.getWindDirection(); - closeptC = WxMath.uvComp((float)curS, (float)curD); - closeptC = bkRsc.getHodoBackground().getWorld().map(closeptC); - //System.out.println("closeptCx " + closeptC.x+ " closeptCy "+ closeptC.y); - distance = inputC.distance(closeptC); - //System.out.println("closeptCx " + closeptC.x+ " closeptCy "+ closeptC.y+" distance "+ distance + " curSmallestDist " +curSmallestDist); - if(distance < curSmallestDist){ - curSmallestDist = distance; - hodoEditingSoundingLayerIndex = i; - ptFound = true; - } - } - if(ptFound == false){ - closeptC.x=closeptC.y=0; - } else{ - layer = this.soundingLys.get(hodoEditingSoundingLayerIndex); - closeptC = WxMath.uvComp((float)layer.getWindSpeed(), (float)layer.getWindDirection()); - closeptC = bkRsc.getHodoBackground().getWorld().map(closeptC); - } - - //System.out.println("picked closeptCx " + closeptC.x+ " closeptCy "+ closeptC.y); - return closeptC; - } - - /* - * Return the closest point to the input point on either Temp or Dewpoint trace line - * Also set currentSoundingLayerIndex for plotting later - */ - public Coordinate getPickedTempPoint(Coordinate c){ - - //System.out.println("picked pt X "+ x + " Y "+ y); - //System.out.println("picked pt CX "+ c.x + " CY "+ c.y); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - Coordinate inC = NsharpWxMath.reverseSkewTXY(WGc.unMap(c)); - double inPressure = inC.y; - double inTemp = inC.x; - //System.out.println("user inout pt pressure "+ inPressure+ " temp "+inTemp ); - double prevPressure=1000; - double prevT=0, prevD=0; - Coordinate closeptC = new Coordinate(1,1,0); - boolean firstPrevPicked= false; - - /* - * Note: soundingLys list sorted with highest pressure as first element - */ - for (NcSoundingLayer layer : this.soundingLys) { - double t, d; - t = layer.getTemperature(); - d = layer.getDewpoint(); - double pressure = layer.getPressure(); - if(firstPrevPicked==false){ - // this is to handle the case, if picked point has same pressure (largest pressure) as first layer - firstPrevPicked = true; - prevPressure = pressure; - prevT = t; - prevD = d; - } - //System.out.println(" pressure "+ pressure ); - if( pressure >= 100 && pressure <= inPressure){ - // decide which pressure (layer) should be used. current one or previous one - double disCurrentP = Math.abs(pressure -inPressure ); - double disPreviousP = Math.abs(prevPressure -inPressure ); - double pickedPressure, pickedTemp, pickedDewpoint; - if(disPreviousP <= disCurrentP){ - pickedPressure = prevPressure; - pickedTemp = prevT; - pickedDewpoint = prevD; - if(this.soundingLys.indexOf(layer) == 0) - currentSoundingLayerIndex = this.soundingLys.indexOf(layer); - else - currentSoundingLayerIndex = this.soundingLys.indexOf(layer)-1; - } - else { - pickedPressure = pressure; - pickedTemp = t; - pickedDewpoint = d; - currentSoundingLayerIndex = this.soundingLys.indexOf(layer); - } - //decide which line, temp or dewpoint, closer to user picked point - double disTemp = Math.abs(pickedTemp- inTemp); - double disDew = Math.abs(pickedDewpoint- inTemp); - if(disTemp <= disDew){ - closeptC = NsharpWxMath.getSkewTXY(pickedPressure, pickedTemp); - closeptC = WGc.map(closeptC); - currentTempCurveType = TEMP_TYPE; - //System.out.println("picked pressure "+ pickedPressure + " temp " +pickedTemp); - } - else { - closeptC = NsharpWxMath.getSkewTXY(pickedPressure, pickedDewpoint); - closeptC = WGc.map(closeptC); - currentTempCurveType = DEWPOINT_TYPE; - //System.out.println("picked pressure "+ pickedPressure + " dewpoint " +pickedDewpoint); - } - - //System.out.println("currentSoundingLayerIndex P = "+ this.soundingLys.get(currentSoundingLayerIndex).getPressure()); - break; - } - prevPressure = pressure; - prevT = t; - prevD = d; - } - - return closeptC; - } - private void plotNsharpInteractiveTemp(IGraphicsTarget target, double zoomLevel, - WGraphics world, RGB color) throws VizException { - if(soundingLys.size() < 4) - return; - //double inPressure = soundingLys.get(currentSoundingLayerIndex).getPressure(); - double aboveLayerPressure, belowLayerPressure; - double aboveLayerT=0, aboveLayerD=0, belowLayerT=0, belowLayerD=0; - int aboveLayerIndex, belowLayerIndex; - double plotAboveT, plotBelowT; - if(currentSoundingLayerIndex ==0){ - aboveLayerIndex = currentSoundingLayerIndex; - belowLayerIndex = currentSoundingLayerIndex+1; - } - else if(currentSoundingLayerIndex == soundingLys.size()-1 ){ - belowLayerIndex = currentSoundingLayerIndex; - aboveLayerIndex = currentSoundingLayerIndex-1; - } - else{ - belowLayerIndex = currentSoundingLayerIndex + 1; - aboveLayerIndex = currentSoundingLayerIndex - 1; - } - aboveLayerPressure = soundingLys.get(aboveLayerIndex).getPressure(); - aboveLayerT = soundingLys.get(aboveLayerIndex).getTemperature(); - aboveLayerD = soundingLys.get(aboveLayerIndex).getDewpoint(); - belowLayerPressure = soundingLys.get(belowLayerIndex).getPressure(); - belowLayerT = soundingLys.get(belowLayerIndex).getTemperature(); - belowLayerD = soundingLys.get(belowLayerIndex).getDewpoint(); - - if(currentTempCurveType == TEMP_TYPE){ - plotAboveT = aboveLayerT; - plotBelowT = belowLayerT; - - } - else{ - plotAboveT = aboveLayerD; - plotBelowT = belowLayerD; - - } - Coordinate c1 = NsharpWxMath.getSkewTXY(aboveLayerPressure, plotAboveT); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - target.drawLine(c1.x, c1.y, 0.0, interactiveTempPointCoordinate.x, interactiveTempPointCoordinate.y, 0.0, color, - commonLinewidth, LineStyle.DASHED); - c1 = NsharpWxMath.getSkewTXY(belowLayerPressure,plotBelowT); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - target.drawLine(c1.x, c1.y, 0.0, interactiveTempPointCoordinate.x, interactiveTempPointCoordinate.y, 0.0, color, - commonLinewidth, LineStyle.DASHED); - //System.out.println("In pressure="+ inPressure+ " above P="+aboveLayerPressure+ " below P="+belowLayerPressure); - } - public List getSoundingLys() { - return soundingLys; - } - - /* - * This interpolation is to smooth data out with a pressure gap of 25 mb per layer and also keep - * original lowest and highest layers. - */ - private List performInterpolation(List rawSndLysLst){ - NcSoundingLayer newLayer= new NcSoundingLayer(); - //System.out.println(" performInterpolation"); - nsharpNative.populateSndgData(rawSndLysLst); - - List mySndLst = new ArrayList(); - // add top layer - try { - //here a shallowCopy is enough - newLayer = (NcSoundingLayer) rawSndLysLst.get(0).clone(); - mySndLst.add(newLayer); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - // The first layer has highest pressure - // get a pressure value below first layer and can be divided by 25 exactly - int p =(int) (rawSndLysLst.get(0).getPressure()/25) * 25; - float interpolatedValue; - if ( p == (int)rawSndLysLst.get(0).getPressure()) - { // if p is same as first layer, then this layer is added already, start from 2nd layer - p = p-25; - } - for (; p >= 50 ; p = p-25){ - newLayer= new NcSoundingLayer(); - newLayer.setPressure(p); - interpolatedValue = nsharpNative.nsharpLib.itemp(p); - if(interpolatedValue ==NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - //this is not good layer data, usually happened when lowest layer pressure is - // more than 50, then when interpolate layer for pressure 50, will return unvalid value - continue; - newLayer.setTemperature(interpolatedValue); - interpolatedValue = nsharpNative.nsharpLib.idwpt(p); - newLayer.setDewpoint(interpolatedValue); - interpolatedValue = nsharpNative.nsharpLib.iwdir(p); - newLayer.setWindDirection(interpolatedValue); - interpolatedValue = nsharpNative.nsharpLib.iwspd(p); - newLayer.setWindSpeed(interpolatedValue); - interpolatedValue = nsharpNative.nsharpLib.ihght(p); - newLayer.setGeoHeight(interpolatedValue); - interpolatedValue = nsharpNative.nsharpLib.iomeg(p); - newLayer.setOmega(interpolatedValue); - - mySndLst.add(newLayer); - } - return mySndLst; - } - - - private void setSoundingInfo(List sndLys) { - if(overlayIsOn){ - previousSoundingLys = soundingLys; - } - else { - previousSoundingLys = null; - } - - if(interpolateIsOn == true){ - //we dont want to change original raw data, so use a new copy - NcSoundingLayer newLayer; - List mySndLst = new ArrayList(); - for(NcSoundingLayer layer: dataTimelineSndLysListMap.get(pickedStnInfoStr)){ - newLayer = new NcSoundingLayer(); - try { - newLayer = (NcSoundingLayer) layer.clone(); - - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } //here a shallowCopy is enough - mySndLst.add(newLayer); - } - // interpolation - mySndLst = performInterpolation(mySndLst); - - soundingLys = mySndLst; - } - else { - soundingLys = sndLys; - - } - } - /** - * @param resourceData - * @param properties - */ - public NsharpSkewTResource(AbstractResourceData resourceData, - LoadProperties loadProperties) { - super(resourceData, loadProperties); - System.out.println("NsharpSkewTResource constructed"); - this.dataTimes = new ArrayList(); - this.soundingMap = new HashMap(); - elementColorMap.put(NsharpConstants.State.CURRENT,NsharpConstants.color_green); //green - elementColorMap.put(NsharpConstants.State.ACTIVE,NsharpConstants.color_yellow);//cyan - elementColorMap.put(NsharpConstants.State.INACTIVE,NsharpConstants.color_white);//white - elementColorMap.put(NsharpConstants.State.NOTAVAIL,NsharpConstants.color_red);//white - elementColorMap.put(NsharpConstants.State.OVERLAY,NsharpConstants.color_red);//red - elementColorMap.put(NsharpConstants.State.AVAIL,NsharpConstants.color_yellow);//white - nsharpNative = new NsharpNative(); - //based on BigNsharp storm slinky color used and gempak color definition - stormSlinkyColorMap.put(new Integer(3),NsharpConstants.color_green); //green - stormSlinkyColorMap.put(new Integer(7),NsharpConstants.color_magenta); - stormSlinkyColorMap.put(new Integer(6),NsharpConstants.color_cyan); - stormSlinkyColorMap.put(new Integer(13),NsharpConstants.color_violet_md); - stormSlinkyColorMap.put(new Integer(20),NsharpConstants.color_yellow_DK); - stormSlinkyColorMap.put(new Integer(27),NsharpConstants.color_cyan_md); - currentGraphMode=NsharpPaletteWindow.getCurrentGraphMode(); - - // new for configMgr - configMgr = NsharpConfigManager.getInstance(); - configStore = configMgr.retrieveNsharpConfigStoreFromFs(); - graphConfigProperty = configStore.getGraphProperty(); - int tempOffset = graphConfigProperty.getTempOffset(); - NsharpWxMath.setTempOffset(tempOffset); - linePropertyMap = configStore.getLinePropertyMap(); - } - public void cleanUpRsc(){ - if(dataTimelineSndLysListMap!= null) - dataTimelineSndLysListMap.clear(); - if(originalDataTimelineSndLysListMap!=null) - originalDataTimelineSndLysListMap.clear(); - if(soundingLysList!=null) - soundingLysList.clear(); - if(soundingLys!=null) - soundingLys.clear(); - if(previousSoundingLys!=null) - previousSoundingLys.clear(); - if(intpSndLst!= null) - intpSndLst.clear(); - if(stnTimeTable != null){ - for(List stnList: stnTimeTable){ - stnList.clear(); - } - stnTimeTable.clear(); - } - if(timeLineStateList != null) - timeLineStateList.clear(); - if(stnStateList != null) - stnStateList.clear(); - curSndProfileProp = null; - preSndProfileProp = null; - currentTextPage = 1; - currentInsetPage = 1; - currentParcel = NsharpNativeConstants.PARCELTYPE_MOST_UNSTABLE; - currentParcelLayerPressure = NsharpNativeConstants.MU_LAYER; - } - @Override - protected void disposeInternal() { - System.out.println("NsharpSkewTResource disposeInternal called"); - if(NsharpMapMouseHandler.getAccess() != null) - NsharpMapMouseHandler.getAccess().setSkewRsc(null); - - if(font9!=null){ - font9.dispose(); - font9=null; - } - if(font10!=null){ - font10.dispose(); - font10=null; - } - if(font11!=null){ - font11.dispose(); - font11=null; - } - if(font12!=null){ - font12.dispose(); - font12=null; - } - soundingMap= null; - parcelList= null; - listenerList=null; - soundingLysList=null; - soundingLys = null; - previousSoundingLys = null; - dataTimelineSndLysListMap = null; - originalDataTimelineSndLysListMap= null; - intpSndLst = null; - stormSlinkyColorMap = null; - elementColorMap= null; - disposeAllWireFrameShapes(); - windBoxWindRscShapeList=null; - pressureTempRscShapeList=null; - hodoWindRscShapeList=null; - parcelTraceRscShapeList = null; - if(NsharpParcelDialog.getAccess()!= null){ - NsharpParcelDialog.getAccess().reset(); - } - this.target.dispose(); - nsharpNative = null; - drawPanel = null; - } - - @Override - protected synchronized void initInternal(IGraphicsTarget target) throws VizException { - System.out.println("NsharpSkewTResource initInternal called"); - this.font9 = target.initializeFont("Monospace", 9, null); - this.font10 = target.initializeFont("Monospace", 10, null); - this.font11 = target.initializeFont("Monospace", 11, null); - IFont.Style[] style = {IFont.Style.BOLD}; - this.font12 = target.initializeFont("Monospace", 12, style); - commonLinewidth = getCapability(OutlineCapability.class).getOutlineWidth(); - commonLineStyle = getCapability(OutlineCapability.class) - .getLineStyle(); - this.target = target; - drawPanel = new NsharpDrawPanels(descriptor.getSkewTBkGResource(), this.font10); - createAllWireFrameShapes(); - } - private void adjustFontSize(int canvasW, int canvasH ) { - float font9Size,font10Size,font11Size,font12Size; - - float fontAdjusted=0; - float fontBaseH=70f; //Chin: why 70 & 100? After many "try and error" experiments... - float fontBaseW=100f; - if(canvasH < NsharpConstants.DEFAULT_CANVAS_HEIGHT && canvasW< NsharpConstants.DEFAULT_CANVAS_WIDTH){ - //both width and height are smaller than default - float wAdjust = (float)(NsharpConstants.DEFAULT_CANVAS_WIDTH-canvasW)/fontBaseW; - float hAdjust = (float)(NsharpConstants.DEFAULT_CANVAS_HEIGHT-canvasH)/fontBaseH; - fontAdjusted = Math.max(wAdjust,hAdjust); - } - else if(canvasW< NsharpConstants.DEFAULT_CANVAS_WIDTH){ - // only width smaller than default - fontAdjusted = (float)(NsharpConstants.DEFAULT_CANVAS_WIDTH-canvasW)/fontBaseW; - } - else if(canvasH < NsharpConstants.DEFAULT_CANVAS_HEIGHT ){ - // only height smaller than default - fontAdjusted = (float)(NsharpConstants.DEFAULT_CANVAS_HEIGHT-canvasH)/fontBaseH; - } - //Chin: Can not bigger than 9, otherwise, fint9 size willbe negative. - //Why 8.8 ? After many "try and error" experiments... - if(fontAdjusted > 8.8) - fontAdjusted=8.8f; - font9Size = 9-fontAdjusted; - font10Size = 10-fontAdjusted; - font11Size =11-fontAdjusted; - font12Size = 12-fontAdjusted; - - if(font9!=null){ - font9.dispose(); - } - font9 = target.initializeFont("Monospace", font9Size, null); - - if(font10!=null){ - font10.dispose(); - } - font10 = target.initializeFont("Monospace", font10Size, null); - if(font11!=null){ - font11.dispose(); - } - font11 = target.initializeFont("Monospace", font11Size, null); - if(font12!=null){ - font12.dispose(); - } - IFont.Style[] style = {IFont.Style.BOLD}; - font12 = target.initializeFont("Monospace", font12Size, style); - currentFont10Size = font10Size; - //System.out.println("font10 size ="+currentFont10Size); - } - private void magnifyFont(double zoomLevel) { - float magFactor = 1.0f / (float)zoomLevel; - - font10.setMagnification(magFactor); - font9.setMagnification(magFactor); - font11.setMagnification(magFactor); - font12.setMagnification(magFactor); - } - private void paintIcing(double zoomLevel,IGraphicsTarget target) throws VizException{ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc!= null) - { - NsharpIcingBackground icingBk = bkRsc.getIcingBackground(); - - WGraphics plotWorld = icingBk.getWorld(); - target.setupClippingPlane(icingBk.getPe()); - try { - - if((graphConfigProperty!=null && graphConfigProperty.isWindBarb() == true) || graphConfigProperty== null) { - plotWorld.setWorldCoordinates(NsharpConstants.ICING_RELATIVE_HUMIDITY_LEFT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM), - NsharpConstants.ICING_RELATIVE_HUMIDITY_RIGHT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP)); - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WIND_BARB]); - - drawNsharpWindBarb(target, zoomLevel, plotWorld,lp.getLineColor() /*NsharpConstants.color_yellow*/, this.soundingLys, 90, NsharpConstants.ICING_PRESSURE_LEVEL_TOP); - } - } catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - //Chin NOTE: icining wireframeshapes are created dynamically ONLY when icing display is to be shown - //However, Skewt wireframeshapes are created when new sounding is loaded. - if(icingRHShape==null){ - // current WorldCoordinates for RH already loaded - plotWorld.setWorldCoordinates(NsharpConstants.ICING_RELATIVE_HUMIDITY_LEFT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP), - NsharpConstants.ICING_RELATIVE_HUMIDITY_RIGHT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM)); - - createIcingRHShape(plotWorld); - } - if(icingRHShape != null){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_RH]); - target.drawWireframeShape(icingRHShape,lp.getLineColor(), lp.getLineWidth(),lp.getLineStyle(),font10); - } - if(icingTempShape==null){ - plotWorld.setWorldCoordinates(NsharpConstants.ICING_TEMPERATURE_LEFT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP), - NsharpConstants.ICING_TEMPERATURE_RIGHT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM)); - createIcingTempShape(plotWorld); - } - if(icingTempShape != null){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_TEMP]); - target.drawWireframeShape(icingTempShape,lp.getLineColor(), lp.getLineWidth(),lp.getLineStyle(),font10); - } - if(icingEPIShape==null){ - plotWorld.setWorldCoordinates(NsharpConstants.ICING_TEMPERATURE_LEFT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_TOP), - NsharpConstants.ICING_TEMPERATURE_RIGHT, icingBk.toLogScale(NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM)); - createIcingEPIShape(plotWorld); - } - if(icingEPIShape != null){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_ICING_EPI]); - target.drawWireframeShape(icingEPIShape,lp.getLineColor(), lp.getLineWidth(),lp.getLineStyle(),font10); - } - - target.clearClippingPlane(); - } - } - private void paintTurbulence(double zoomLevel,IGraphicsTarget target) throws VizException{ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc!= null) - { - NsharpTurbulenceBackground turbBk = bkRsc.getTurbBackground(); - - WGraphics plotWorld = turbBk.getWorld(); - target.setupClippingPlane(turbBk.getPe()); - //Chin NOTE: turbulence wireframeshapes are created dynamically ONLY when turbulence display is to be shown - //However, Skewt wireframeshapes are created when new sounding is loaded. - try { - //Chin:NOTE: LN Richardson number is plotted with positive number increase to left and netagive number decrease to its roght side. - // Therefore, we have to set its world X coordintion in a reverse way as plotting Icing wind barb. - if((graphConfigProperty!=null && graphConfigProperty.isWindBarb() == true) || graphConfigProperty== null) { - plotWorld.setWorldCoordinates(NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_RIGHT, turbBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM), - NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_LEFT, turbBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP)); - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WIND_BARB]); - drawNsharpWindBarb(target, zoomLevel, plotWorld, lp.getLineColor(), this.soundingLys, 7, NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP); - } - }catch (VizException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - if(turbLnShape==null || turbWindShearShape==null){ - createTurbulenceShapes(plotWorld); - } - if(turbLnShape != null){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_TURBULENCE_LN]); - target.drawWireframeShape(turbLnShape, lp.getLineColor(), lp.getLineWidth(),lp.getLineStyle(),font10); - - } - if(turbWindShearShape != null){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_TURBULENCE_WS]); - target.drawWireframeShape(turbWindShearShape, lp.getLineColor(), lp.getLineWidth(),lp.getLineStyle(),font10); - } - - target.clearClippingPlane(); - } - } - /* - * (non-Javadoc) - * - * @see - * com.raytheon.uf.viz.core.rsc.AbstractVizResource#paintInternal(com.raytheon - * .uf.viz.core.IGraphicsTarget, - * com.raytheon.uf.viz.core.drawables.PaintProperties) - */ - @Override - protected void paintInternal(IGraphicsTarget target, - PaintProperties paintProps) throws VizException { - //System.out.println("paintInternal called"); - //Chin: place holder for build option using AWIPS product system configuration file, config.ini - //To use this, add nsharp.build = xxxx at config.ini - //if ("xxxx".equals(System.getProperty("nsharp.build"))) { - - //} - // - //Chin: place holder for build option using NSHARP plugin's build.properties file to set nsharp.build - //run time variable. - //To use this, add nsharp.build = xxxx at build.properties - //if ("standard".equals(Activator.getDefault().getMyProperties().getString("nsharp.build"))){ - // System.out.println("nsharp.build ="+Activator.getDefault().getMyProperties().getString("nsharp.build")); - //} - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - double zoomLevel = paintProps.getZoomLevel(); - - if( currentCanvasBoundWidth!= paintProps.getCanvasBounds().width || currentCanvasBoundHeight!=paintProps.getCanvasBounds().height){ - - currentCanvasBoundWidth= paintProps.getCanvasBounds().width; - currentCanvasBoundHeight=paintProps.getCanvasBounds().height; - adjustFontSize(currentCanvasBoundWidth,currentCanvasBoundHeight); - drawPanel.setMyFont(font10); - bkRsc.getSkewTBackground().setCurrentFont(currentFont10Size); - bkRsc.getHodoBackground().setCurrentFont(currentFont10Size); - bkRsc.getIcingBackground().setCurrentFont(currentFont10Size); - } - if(zoomLevel != currentZoomLevel) - { - currentZoomLevel = zoomLevel; - magnifyFont(zoomLevel); - bkRsc.getSkewTBackground().magnifyFont(zoomLevel); - bkRsc.getHodoBackground().magnifyFont(zoomLevel); - bkRsc.getIcingBackground().magnifyFont(zoomLevel); - } - WGraphics plotWorld; - PixelExtent extent; - //configD = NsharpParametersSelectionConfigDialog.getAccess(); - if((soundingLys != null) && (soundingLys.size()>= 4)) - { - if(currentGraphMode== NsharpConstants.GRAPH_SKEWT){ - plotWorld = bkRsc.getSkewTBackground().getWorld(); - - - extent = new PixelExtent(bkRsc.getSkewTBackground() - .getRectangle()); - target.setupClippingPlane(extent); - //plot temp curve, when constructing pressureTempRscShapeList, it already considered - // comparison, overlay, etc..so, just draw it. - for(ShapeAndLineProperty shapeNColor: pressureTempRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.lp.getLineColor(), shapeNColor.lp.getLineWidth(), shapeNColor.lp.getLineStyle(),font10);//commonLinewidth*2,commonLineStyle,font10); - } - if(graphConfigProperty != null ){ - if(graphConfigProperty.isTemp() == true && !compareStnIsOn){ - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_red, TEMP_TYPE, this.soundingLys); - } - // dew point curve - if(graphConfigProperty.isDewp() == true && !compareStnIsOn){ - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_green, DEWPOINT_TYPE, this.soundingLys); - } - //plot wetbulb trace - if(graphConfigProperty.isWetBulb() == true && !compareStnIsOn){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]); - target.drawWireframeShape(wetBulbTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_cyan, commonLinewidth,commonLineStyle,font10); - } - //plot virtual temp trace - if(graphConfigProperty.isVTemp() == true && !compareStnIsOn){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]); - target.drawWireframeShape(vtempTraceCurveRscShape,lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_red, commonLinewidth*2, LineStyle.DASHED,font10); - } - // parcel trace curve - if(graphConfigProperty.isParcel() == true && !compareStnIsOn){ - if(soundingLys.size() > 0){ - for (IWireframeShape shape: parcelTraceRscShapeList){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]); - target.drawWireframeShape(shape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_white, commonLinewidth,LineStyle.DASHED,font10); - } - } - } - if(graphConfigProperty.isEffLayer() == true && !compareStnIsOn) - //draw effective layer lines - drawEffectiveLayerLines(target); - - //cloud - if(graphConfigProperty.isCloud() == true && !compareStnIsOn){ - if(cloudFMShape!= null) - target.drawShadedShape(cloudFMShape, 1f); - if(cloudFMLabelShape!= null) - target.drawWireframeShape(cloudFMLabelShape, NsharpConstants.color_chocolate, commonLinewidth*3, - commonLineStyle,font9); - if(cloudCEShape!= null) - target.drawShadedShape(cloudCEShape, 1f); - } - - if(graphConfigProperty.isOmega() == true){ - if(NsharpLoadDialog.getAccess()!= null && - (NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.MODEL_SND || - NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.PFC_SND )){ - //plot omega - target.clearClippingPlane(); - target.drawWireframeShape(omegaBkgShape, NsharpConstants.color_violet_red, commonLinewidth, - LineStyle.DASHED,font10); - target.drawWireframeShape(omegaRscShape, NsharpConstants.color_cyan, commonLinewidth, - commonLineStyle,font10); - } - } - } - else{ - //by default, draw everything - if(!compareStnIsOn){ - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_red, TEMP_TYPE, this.soundingLys); - // dew point curve - if(editGraphOn) - plotPressureTempEditPoints(target, plotWorld, NsharpConstants.color_green, DEWPOINT_TYPE, this.soundingLys); - //plot wetbulb trace - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WETBULB]); - target.drawWireframeShape(wetBulbTraceRscShape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_cyan, commonLinewidth,commonLineStyle,font10); - //plot virtual temp trace - lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_VIRTUAL_TEMP]); - target.drawWireframeShape(vtempTraceCurveRscShape,lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_red, commonLinewidth*2, LineStyle.DASHED,font10); - - // parcel trace curve - if(soundingLys.size() > 0){ - for (IWireframeShape shape: parcelTraceRscShapeList){ - lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_PARCEL]); - target.drawWireframeShape(shape, lp.getLineColor(),lp.getLineWidth(),lp.getLineStyle(),font10);//NsharpConstants.color_white, commonLinewidth,LineStyle.DASHED,font10); - } - } - //draw effective layer lines - drawEffectiveLayerLines(target); - } - if(NsharpLoadDialog.getAccess()!= null && - (NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.MODEL_SND || - NsharpLoadDialog.getAccess().getActiveLoadSoundingType()== NsharpLoadDialog.PFC_SND )){ - //plot omega - target.clearClippingPlane(); - target.drawWireframeShape(omegaBkgShape, NsharpConstants.color_violet_red, commonLinewidth, - LineStyle.DASHED,font10); - target.drawWireframeShape(omegaRscShape, NsharpConstants.color_cyan, commonLinewidth, - commonLineStyle,font10); - } - } - if(plotInteractiveTemp == true ){ - plotNsharpInteractiveTemp( target, zoomLevel, - plotWorld, NsharpConstants.color_white); - } - target.clearClippingPlane(); - - - // Wind Barb - if((graphConfigProperty!=null && graphConfigProperty.isWindBarb() == true) || graphConfigProperty== null) { - - if(overlayIsOn == true && this.previousSoundingLys!=null){ - drawNsharpWindBarb(target, zoomLevel, plotWorld, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor(), this.soundingLys, NsharpConstants.right - BARB_LENGTH,100); - if(!previousSoundingLys.equals(soundingLys)) - drawNsharpWindBarb(target, zoomLevel, plotWorld, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(), this.previousSoundingLys, NsharpConstants.right - BARB_LENGTH * 2.5,100); - } - else{ - if(!compareStnIsOn ){ - NsharpLineProperty lp =linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_WIND_BARB]); - drawNsharpWindBarb(target, zoomLevel, plotWorld, lp.getLineColor()/*NsharpConstants.color_yellow*/, this.soundingLys, NsharpConstants.right - BARB_LENGTH,100); - } - } - - } - //drawHeightMark(target); - target.drawWireframeShape(heightMarkRscShape, NsharpConstants.color_red, 1, LineStyle.SOLID, font10); - - - //if(!compareStnIsOn){ - //draw EL, LFC, LCL, FZL, -20C, -30C lines - drawLclLine(target); - - // draw cursor data - if(cursorInSkewT== true){ - if(curseToggledFontLevel < CURSER_STRING_OFF) - drawNsharpSkewtCursorData(target); - //draw dynamic temp, theta, height - drawNsharpSkewtDynamicData(target, zoomLevel, plotWorld); - - } - //} - - }// end of currentGraphMode= NsharpConstants.GRAPH_SKEWT - else if(currentGraphMode == NsharpConstants.GRAPH_ICING){ - paintIcing( zoomLevel, target); - } - else if(currentGraphMode == NsharpConstants.GRAPH_TURB){ - paintTurbulence( zoomLevel, target); - } - - //wind box background and wind - target.drawWireframeShape(windBoxBkgShape, NsharpConstants.color_white, - 0.5F, LineStyle.DOTS, font10); - for(ShapeAndLineProperty shapeNColor: windBoxWindRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.lp.getLineColor(), commonLinewidth,commonLineStyle,font10); - } - - //plot vertical wind profile (advection layer) - extent = new PixelExtent(bkRsc.getVerticalWindBackground() - .getRectangle()); - target.setupClippingPlane(extent); - float x1 = NsharpConstants.VERTICAL_WIND_X_ORIG+ (NsharpConstants.VERTICAL_WIND_WIDTH/2); - target.drawLine(x1, NsharpConstants.VERTICAL_WIND_Y_ORIG, 0, x1, NsharpConstants.VERTICAL_WIND_Y_ORIG+NsharpConstants.VERTICAL_WIND_HEIGHT, 0, - NsharpConstants.color_white, 1, LineStyle.DASHED); - target.drawWireframeShape(verticalWindLabelShape, NsharpConstants.color_white, - 0.3F, commonLineStyle,font10); - target.drawWireframeShape(verticalWindRShape, NsharpConstants.color_red, - 0.3F, commonLineStyle,font10); - target.drawWireframeShape(verticalWindSbShape, NsharpConstants.color_skyblue, - 0.3F, commonLineStyle,font10); - target.clearClippingPlane(); - //data time title - drawNsharpTimelineTitle(target); - drawNsharpStationIdTitle(target); - drawNsharpDataFilelabel(target, zoomLevel); - - //plot HODO - plotWorld = bkRsc.getHodoBackground().getWorld(); - extent = new PixelExtent(bkRsc.getHodoBackground() - .getRectangle()); - target.setupClippingPlane(extent); - if(((graphConfigProperty != null )&& graphConfigProperty.isHodo())|| (graphConfigProperty == null)){ - for(ShapeAndLineProperty shapeNColor: hodoWindRscShapeList){ - target.drawWireframeShape(shapeNColor.shape, shapeNColor.lp.getLineColor(), commonLinewidth*2,commonLineStyle,font10); - } - } - if(editGraphOn && !compareStnIsOn) - plotHodoEditPoints( target,plotWorld, NsharpConstants.color_white); - if(!compareStnIsOn){ - plotNsharpHodoVectors(target, zoomLevel, plotWorld, null, false); - } - if(cursorInHodo){ - target.clearClippingPlane(); - drawHodoDynamicData(target, zoomLevel, plotWorld); - } - - //plot wind motion on top of HODO left upper corner - //TBD drawHodoWindMotionBox(target, bkRsc.getWindMotionBackground().getRectangle()); - - //plot inset graphs - //plot SRWinds- currently always on page 1 and page 2 - extent = new PixelExtent(bkRsc.getSrWindsBackground().getRectangle()); - target.setupClippingPlane(extent); - target.drawWireframeShape(srWindBRscShape, NsharpConstants.color_cyan, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(srWindWRscShape, NsharpConstants.color_white, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(srWindRRscShape, NsharpConstants.color_red, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(srWindGRscShape, NsharpConstants.color_green, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(srWindMRscShape, NsharpConstants.color_magenta, commonLinewidth, LineStyle.SOLID,font10); - target.clearClippingPlane(); - //plot storm slinky - currently always on page 1 and page 2 - plotWorld = bkRsc.getStormSlinkyBackground().getWorld(); - plotNsharpStormSlinky(target, zoomLevel, plotWorld, bkRsc.getStormSlinkyBackground().getRectangle()); - - if(currentInsetPage == 1){ - //plot ThetaE-Pressure - extent = new PixelExtent(bkRsc.getThetaEPresureBackground().getRectangle()); - target.setupClippingPlane(extent); - target.drawWireframeShape(thetaEPressureYRscShape, NsharpConstants.color_yellow, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(thetaEPressureWRscShape, NsharpConstants.color_white, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(thetaEPressureRRscShape, NsharpConstants.color_red, commonLinewidth, LineStyle.SOLID,font10); - target.clearClippingPlane(); - //plot possibleWatchType - if(psblWatchTypeBkgShape==null){ - WGraphics WGc = bkRsc.getPsblWatchTypeBackground().getWorld(); - createBkgPsblWatchShape(WGc); - } - - extent = new PixelExtent(bkRsc.getPsblWatchTypeBackground().getRectangle()); - target.setupClippingPlane(extent); - target.drawWireframeShape(psblWatchTypeBkgShape, wwTypeColor, commonLinewidth, LineStyle.SOLID,font10); - target.clearClippingPlane(); - - } - else if(currentInsetPage == 2){ - //plot ThetaE-Height - extent = new PixelExtent(bkRsc.getThetaEHeightBackground().getRectangle()); - target.setupClippingPlane(extent); - target.drawWireframeShape(thetaEHeightYRscShape, NsharpConstants.color_yellow, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(thetaEHeightWRscShape, NsharpConstants.color_white, commonLinewidth, LineStyle.SOLID,font10); - target.drawWireframeShape(thetaEHeightRRscShape, NsharpConstants.color_red, commonLinewidth, LineStyle.SOLID,font10); - target.clearClippingPlane(); - //plot SR Wind Vectors - plotWorld = bkRsc.getSrWindVectorBackground().getWorld(); - plotNsharpSRWindVectors(target, zoomLevel, plotWorld, bkRsc.getSrWindVectorBackground().getRectangle()); - } - - //plot data time line - plotWorld = bkRsc.getDataTimelineBackground().getWorld(); - //drawNsharpDataTimelines(target, plotWorld, bkRsc.getDataTimelineBackground().getRectangle()); - - drawNsharpTimelinBox(target, plotWorld, bkRsc.getDataTimelineBackground().getRectangle()); - - //plot station id - plotWorld = bkRsc.getStationIdBackground().getWorld(); - drawNsharpStationIdBox(target, plotWorld, bkRsc.getStationIdBackground().getRectangle()); - - //plot color notations - plotWorld = bkRsc.getColorNotationsBackground().getWorld(); - drawNsharpColorNotation(target, plotWorld, bkRsc.getColorNotationsBackground().getRectangle()); - - - // write to panels - //Chin: Note: - // Current display algorithm is: One page = 2 panels. show 1 page each with 2 panels at one time. - // i.e. show current page and its next page with 2 panels in total. - // currently, we have total of 10 "virtual panels" to display on 2 "physical - // display panels per design. - boolean virtualPanel1Visible= false; - for (int i = currentTextPage*2 -1, physicalPanelNum = 1; i < currentTextPage*2 + (NsharpConstants.dsiplayPanelSize-1); i++, physicalPanelNum++){ - int virtuslPanelNum = i%10; - if (virtuslPanelNum==0) virtuslPanelNum=10; - drawPanel.drawPanel(target,virtuslPanelNum,physicalPanelNum); - //System.out.println("vPanel="+virtuslPanelNum+ " disPanel="+physicalPanelNum); - //Chin: parcel lines is designed in virtual panel number 1. And by current page shifting mechanism, - // It will only shown in either physical panel 1 or 3. - if(virtuslPanelNum ==1) { - parcelLinesInPhysicalPanelNumber = physicalPanelNum; - virtualPanel1Visible=true; - } - } - if(virtualPanel1Visible== false){ - parcelLinesInPhysicalPanelNumber =0; - } - } - else { - //draw side lines between skewt and hodo to make graph reasonable to view - target.drawLine(NsharpConstants.SKEWT_REC_X_ORIG + NsharpConstants.SKEWT_REC_WIDTH, NsharpConstants.SKEWT_REC_Y_ORIG, 0.0, - NsharpConstants.HODO_REC_X_ORIG, NsharpConstants.SKEWT_REC_Y_ORIG, - 0.0, NsharpConstants.pressureColor, 1); - target.drawLine(NsharpConstants.SKEWT_REC_X_ORIG + NsharpConstants.SKEWT_REC_WIDTH, NsharpConstants.SKEWT_REC_Y_ORIG+NsharpConstants.SKEWT_REC_HEIGHT, 0.0, - NsharpConstants.HODO_REC_X_ORIG, NsharpConstants.SKEWT_REC_Y_ORIG+NsharpConstants.SKEWT_REC_HEIGHT, - 0.0, NsharpConstants.pressureColor, 1); - //bottom line between hodo and timeline - target.drawLine(NsharpConstants.SRWINDS_REC_X_ORIG, NsharpConstants.SKEWT_REC_Y_ORIG+NsharpConstants.SKEWT_REC_HEIGHT, 0.0, - NsharpConstants.DATA_TIMELINE_REC_X_ORIG, NsharpConstants.SKEWT_REC_Y_ORIG+NsharpConstants.SKEWT_REC_HEIGHT, - 0.0, NsharpConstants.pressureColor, 1); - - //data time title - drawNsharpDataUnavailMessage(target); - drawNsharpTimelineTitle(target); - drawNsharpStationIdTitle(target); - drawNsharpDataFilelabel(target, zoomLevel); - //plot data time line - plotWorld = bkRsc.getDataTimelineBackground().getWorld(); - //drawNsharpDataTimelines(target, plotWorld, bkRsc.getDataTimelineBackground().getRectangle()); - - drawNsharpTimelinBox(target, plotWorld, bkRsc.getDataTimelineBackground().getRectangle()); - - //plot station id - plotWorld = bkRsc.getStationIdBackground().getWorld(); - drawNsharpStationIdBox(target, plotWorld, bkRsc.getStationIdBackground().getRectangle()); - - //plot color notations - plotWorld = bkRsc.getColorNotationsBackground().getWorld(); - drawNsharpColorNotation(target, plotWorld, bkRsc.getColorNotationsBackground().getRectangle()); - } - } - public static BufferedImage crop(BufferedImage src, int width, int height) {//throws IOException { - int x = src.getWidth()/2 - width/2; - int y = src.getHeight()/2 - height/2; - - System.out.println("---" + src.getWidth() + " - " + src.getHeight() + " - " + x + " - " + y); - - BufferedImage clipping = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//src.getType()); - Graphics2D area = (Graphics2D) clipping.getGraphics().create(); - //area.drawImage(src, 0, 0, clipping.getWidth(), clipping.getHeight(), x, y, x + clipping.getWidth(), - // y + clipping.getHeight(), null); - area.drawImage(src, 0, 0, clipping.getWidth(), clipping.getHeight(), 0, 0, x + clipping.getWidth(), - y + clipping.getHeight(), null); - area.dispose(); - - return clipping; - } - - private void drawHodoDynamicData(IGraphicsTarget target, double zoomLevel, - WGraphics world) throws VizException { - // draw running temp, theta, height etc data at window palette bottom - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - double dispX = world.getViewXmin(); - double dispY = world.getViewYmin()-20; - //display wind direction, speed in m/s and knots - - //Line 1 - wind direction, speed - target.drawString(font9, bkRsc.getSWindDirection(), dispX+100, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font9, bkRsc.getSWindSpeed(), dispX + 200, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - - private void drawNsharpSkewtDynamicData(IGraphicsTarget target, double zoomLevel, - WGraphics world) throws VizException { - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - double dispX = world.getViewXmin() + 450; - double dispY = world.getViewYmin()-100; - - //Column 1: pressure, C and F - target.drawString(font9, bkRsc.getSPressure(), dispX, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - target.drawString(font9, bkRsc.getSTemperatureC(), dispX, dispY+25, 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font9, bkRsc.getSTemperatureF(), dispX, dispY+50, 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - //column 2: m, ft, mixing ratio - float heightM = nsharpNative.nsharpLib.ihght((float)bkRsc.getDPressure()); - String sHeightM = String.format("%.0fm",heightM); - target.drawString(font9, sHeightM, dispX+150, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - String sHeightFt = String.format("%.0fft",NsharpConstants.metersToFeet.convert(heightM)); - target.drawString(font9, sHeightFt, dispX+150, dispY+25, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font9, bkRsc.getSMixingRatio(), dispX+150, dispY+50, 0.0, - TextStyle.NORMAL, NsharpConstants.color_green, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - //column 3: Theta, ThetaW, ThetaE - target.drawString(font9, bkRsc.getSThetaInK(), dispX+300, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font9, bkRsc.getSWThetaInK(), dispX+300, dispY+25, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font9, bkRsc.getSEThetaInK(), dispX+300, dispY+50, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - } - private void drawNsharpDataUnavailMessage(IGraphicsTarget target) throws VizException{ - double X = NsharpConstants.WIND_BOX_X_ORIG; - double Y = 80; - target.drawString(font12, "Sounding Data is NOT loaded for Current Station and Current Time Line", X, Y, 0.0, - TextStyle.BOXED, NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - private void drawNsharpDataFilelabel(IGraphicsTarget target, double zoomLevel) - throws VizException { - double X; - double Y = 15;; - RGB pickedStnColor = NsharpConstants.color_green; - if(overlayIsOn){ - if(preSndProfileProp!= null){ - X = NsharpConstants.SKEWT_VIEW_X_END; - pickedStnColor = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(); - String stnInfoStr = preSndProfileProp.elementDescription; - String latlonStr = Math.rint(preSndProfileProp.stnInfo.getLatitude()*100)/100 + "," + Math.rint(preSndProfileProp.stnInfo.getLongitude()*100)/100; - target.drawString(font10, stnInfoStr, X, Y, 0.0, - TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - target.drawString(font10, latlonStr, X, 3*Y, 0.0, - TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - pickedStnColor = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor(); - } - X = NsharpConstants.SKEWT_REC_X_ORIG+20; - if(pickedStnInfoStr!= null) - target.drawString(font10, pickedStnInfoStr, X, Y, 0.0, - TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - //Also draw stn lat/lon info string and sounding type string - if(pickedStnInfo != null){ - String latlonStr = Math.rint(pickedStnInfo.getLatitude()*100)/100 + "," + Math.rint(pickedStnInfo.getLongitude()*100)/100; - target.drawString(font10, latlonStr, X, 3*Y, 0.0, - TextStyle.NORMAL, pickedStnColor, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - - /*target.drawString(font10, "Sounding Type", NsharpConstants.OMEGA_X_TOP, Y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - String sndTypeStr = pickedStnInfo.getSndType(); - int len = Math.min(12, sndTypeStr.length()); - sndTypeStr = sndTypeStr.substring(0, len); - target.drawString(font10, sndTypeStr, NsharpConstants.OMEGA_X_TOP,3* Y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null);*/ - } - - - } - public void drawNsharpSkewtCursorData(IGraphicsTarget target) throws VizException{ - IFont myFont; - myFont = target.initializeFont("Monospace", curseToggledFontLevel, null); - myFont.setSmoothing(false); - myFont.setScaleFont(false); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - Coordinate c = NsharpWxMath.reverseSkewTXY(WGc.unMap(cursorCor.x, cursorCor.y)); - //System.out.println("Cusrso.x="+cursorCor.x+" Cusrso.y="+cursorCor.y); - //System.out.println("Skewt.x="+c.x+" Skewt.y="+c.y); - double p_mb = c.y; - double temp = c.x; - float htFt, htM, relh=-1; - String curStrFormat, curStrFormat1; - String curStr3,curStr, curStr1, curStr2; - VerticalAlignment vAli; - HorizontalAlignment hAli; - - curStr3 = pickedStnInfoStr+"\n"; - - htM = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght((float)p_mb)); - htFt= nsharpNative.nsharpLib.mtof(htM); - if (nsharpNative.nsharpLib.itemp((float)p_mb) > -9998.0 && nsharpNative.nsharpLib.idwpt((float)p_mb) > -9998.0){ - FloatByReference parm= new FloatByReference(0); - relh= nsharpNative.nsharpLib.relh((float)p_mb, parm); - curStrFormat= "%4.0f/%.0fkt %4.0fmb %5.0fft/%.0fm agl %2.0f%%\n"; - curStr = String.format(curStrFormat, nsharpNative.nsharpLib.iwdir((float)p_mb), - nsharpNative.nsharpLib.iwspd((float)p_mb),p_mb,htFt,htM,relh); - } - else{ - curStrFormat= "%4.0f/%.0fkt %4.0fmb %5.0fft/%.0fm agl\n"; - curStr = String.format(curStrFormat,nsharpNative.nsharpLib.iwdir((float)p_mb), - nsharpNative.nsharpLib.iwspd((float)p_mb), p_mb,htFt,htM); - } - /*curStrFormat1 = "%4.1f %4.1f/%4.1f%cC %4.0f/%.0f kt\n"; - curStr1 = String.format(curStrFormat1,temp, nsharpNative.nsharpLib.itemp((float)p_mb), - nsharpNative.nsharpLib.idwpt((float)p_mb),NsharpConstants.DEGREE_SYMBOL, nsharpNative.nsharpLib.iwdir((float)p_mb), - nsharpNative.nsharpLib.iwspd((float)p_mb));*/ - - curStrFormat1 = "%s(%s) %4.1f/%4.1f%cF(%4.1f/%4.1f%cC)\n"; - temp = nsharpNative.nsharpLib.itemp((float)p_mb); - UnitConverter celciusToFahrenheit = SI.CELSIUS.getConverterTo(NonSI.FAHRENHEIT); - double tempF= celciusToFahrenheit.convert(temp); - double dp = nsharpNative.nsharpLib.idwpt((float)p_mb); - double dpF= celciusToFahrenheit.convert(dp); - curStr1 = String.format(curStrFormat1,bkRsc.getSTemperatureF(),bkRsc.getSTemperatureC(), tempF,dpF, NsharpConstants.DEGREE_SYMBOL,temp, - dp,NsharpConstants.DEGREE_SYMBOL); - - //String tempS= String.format("%5.1f%cC ",temp,NsharpConstants.DEGREE_SYMBOL); - //curStr2 =bkRsc.getSThetaInK()+" "+bkRsc.getSWThetaInK()+" "+bkRsc.getSEThetaInK()+"\n"; - - //Adjust string plotting position - if(cursorCor.x < NsharpConstants.SKEWT_REC_X_ORIG + 200){ - hAli = HorizontalAlignment.LEFT; - } - //else if(cursorCor.x > NsharpConstants.SKEWT_VIEW_X_END - 200){ - // hAli = HorizontalAlignment.RIGHT; - //} - else { - hAli = HorizontalAlignment.RIGHT; - } - vAli = VerticalAlignment.BOTTOM; - target.drawString(myFont,curStr+curStr1+curStr3, cursorCor.x, - cursorCor.y, 0.0, TextStyle.NORMAL, - NsharpConstants.color_yellow, hAli, - vAli, null); - myFont.dispose(); - } - - /* - * This function mostly follow display_effective_layer() of xwvid1.c */ - private void drawEffectiveLayerLines(IGraphicsTarget target) throws VizException{ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - FloatByReference topPF= new FloatByReference(0); - FloatByReference botPF= new FloatByReference(0); - nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); - if(botPF.getValue() < 1 ) return; - String botStr, topStr; - float aglTop, aglBot; - aglTop = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(topPF.getValue())); - aglBot = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(botPF.getValue())); - // Draw effective sfc level - if (aglBot < 1) - { - botStr = "SFC"; - } - else - { - botStr = String.format( "%.0fm", aglBot); - } - double y = WGc.mapY(NsharpWxMath.getSkewTXY(botPF.getValue(), 10).y); - target.drawLine( WGc.mapX(NsharpConstants.left) +200, y, 0.0, WGc.mapX(NsharpConstants.left) +280, y, 0.0, - NsharpConstants.color_cyan_md, 2); - target.drawString(font10,botStr, WGc.mapX(NsharpConstants.left)+300, - y, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan_md, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - // Draw effective top level - topStr = String.format( "%.0fm", aglTop); - double y1 = WGc.mapY(NsharpWxMath.getSkewTXY(topPF.getValue(), 10).y); - target.drawLine( WGc.mapX(NsharpConstants.left) +200, y1, 0.0, WGc.mapX(NsharpConstants.left) +280, y1, 0.0, - NsharpConstants.color_cyan_md, 2); - if(aglTop > aglBot){ - target.drawString(font10,topStr, WGc.mapX(NsharpConstants.left)+300, - y1, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan_md, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - //System.out.println("aglbot="+aglBot+" agltop="+aglTop); - } - - // Draw connecting line - target.drawLine( WGc.mapX(NsharpConstants.left) +240, y, 0.0, WGc.mapX(NsharpConstants.left) +240, y1, 0.0, - NsharpConstants.color_cyan_md, 2); - // Compute and display effective helicity - topPF.setValue(0); // just a placeholder - botPF.setValue(0); - float helicity = nsharpNative.nsharpLib.helicity(aglBot,aglTop, smWindDir,smWindSpd, topPF, botPF); - String helicityStr = String.format("%4.0f m%cs%c", helicity,NsharpConstants.SQUARE_SYMBOL, NsharpConstants.SQUARE_SYMBOL); - - //draw kelicity - target.drawString(font10,helicityStr, WGc.mapX(NsharpConstants.left)+190, - y1-20, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan_md, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - - private void drawLclLine(IGraphicsTarget target) throws VizException{ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - //System.out.println("drawLclLine called define_parcel pType="+currentParcel+" pre="+ currentParcelLayerPressure); - - nsharpNative.nsharpLib.define_parcel(currentParcel, currentParcelLayerPressure); - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - _parcel pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - //draw LCL line - float lcl = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lclpres )); - if(lcl != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double pressure = nsharpNative.nsharpLib.ipres(lcl+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("lcl= " + lcl + " lclpres ="+pcl.lclpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, 10).y); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_green, 2); - target.drawString(font10, "LCL", WGc.mapX(NsharpConstants.right)-220, - y+15, 0.0, TextStyle.NORMAL, - NsharpConstants.color_green, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - //draw LFC line - if(pcl.lclpres!=pcl.lfcpres){ - float lfc = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.lfcpres )); - if(lfc != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double pressure = nsharpNative.nsharpLib.ipres(lfc+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("lfcpres ="+pcl.lfcpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, 10).y); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_yellow, 2); - target.drawString(font10, "LFC", WGc.mapX(NsharpConstants.right)-220, - y, 0.0, TextStyle.NORMAL, - NsharpConstants.color_yellow, HorizontalAlignment.RIGHT, - VerticalAlignment.MIDDLE, null); - } - } - // draw EL line - if(pcl.lclpres!=pcl.elpres && pcl.elpres!=pcl.lfcpres){ - float el = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pcl.elpres )); - if(el != NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA){ - double pressure = nsharpNative.nsharpLib.ipres(el+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("elpres ="+pcl.elpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, 10).y); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_red, 2); - target.drawString(font10, "EL", WGc.mapX(NsharpConstants.right)-220, - y-22, 0.0, TextStyle.NORMAL, - NsharpConstants.color_red, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - } - // draw FZL line - FloatByReference fValue= new FloatByReference(0); - float fgzm = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( 0, fValue ))); - float fgzft = nsharpNative.nsharpLib.mtof(fgzm); - if(nsharpNative.nsharpLib.qc(fgzft)==1) { - double pressure = nsharpNative.nsharpLib.ipres(fgzm+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("elpres ="+pcl.elpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, 10).y); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_cyan, 2); - String textStr = "FGZ= %.0f'"; - textStr = String.format(textStr,fgzft); - target.drawString(font10, textStr, WGc.mapX(NsharpConstants.right)-220, - y-22, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - // draw -20Cline - float h20m = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( -20, fValue ))); - float h20ft = nsharpNative.nsharpLib.mtof(h20m); - if(nsharpNative.nsharpLib.qc(h20ft)==1) { - double pressure = nsharpNative.nsharpLib.ipres(h20m+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("elpres ="+pcl.elpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, -20).y); - //double x = WGc.mapX(NsharpWxMath.getSkewTXY(pressure, -20).x); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_cyan, 2); - String textStr = "-20C= %.0f'"; - textStr = String.format(textStr,h20ft); - target.drawString(font10, textStr, WGc.mapX(NsharpConstants.right)-220, - y-22, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - // draw -30Cline - float h30m = nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(nsharpNative.nsharpLib.temp_lvl( -30, fValue ))); - float h30ft = nsharpNative.nsharpLib.mtof(h30m); - if(nsharpNative.nsharpLib.qc(h30ft)==1) { - double pressure = nsharpNative.nsharpLib.ipres(h30m+(int)(soundingLys.get(0).getGeoHeight())); - //System.out.println("elpres ="+pcl.elpres +" pressure="+ pressure); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, 10).y); - target.drawLine( WGc.mapX(NsharpConstants.right) - 220, y, 0.0, WGc.mapX(NsharpConstants.right) -180, y, 0.0, - NsharpConstants.color_cyan, 2); - String textStr = "-30C= %.0f'"; - textStr = String.format(textStr,h30ft); - target.drawString(font10, textStr, WGc.mapX(NsharpConstants.right)-220, - y-22, 0.0, TextStyle.NORMAL, - NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - } - public void printHeightMark(WGraphics world, GC gc) throws VizException{ - //print feet scales... - double vyMax = world.getViewYmax(); - double vyMin = world.getViewYmin(); - double vxMax = world.getViewXmax(); - for (int j = 0; j < NsharpConstants.HEIGHT_LEVEL_FEET.length; j++) { - float meters = (float)NsharpConstants.feetToMeters.convert(NsharpConstants.HEIGHT_LEVEL_FEET[j]); - - double pressure = nsharpNative.nsharpLib.ipres(meters); - double y = world.mapY(NsharpWxMath.getSkewTXY(pressure, -50).y); - - gc.drawString( Integer.toString(NsharpConstants.HEIGHT_LEVEL_FEET[j]/1000), (int)vxMax + 40, - (int)y,false); - - - gc.drawLine( (int)vxMax + 50,(int) y, (int) vxMax + 45,(int) y); - } - //print meter scales... - for (int j = 0; j < NsharpConstants.HEIGHT_LEVEL_METERS.length; j++) { - int meters = NsharpConstants.HEIGHT_LEVEL_METERS[j]; - - double pressure = nsharpNative.nsharpLib.ipres(meters); - double y = world.mapY(NsharpWxMath.getSkewTXY(pressure, -50).y); - - gc.drawString( Integer.toString(meters/1000), (int)vxMax + 52, - (int)y,false); - - - gc.drawLine( (int)vxMax + 50,(int) y, (int) vxMax + 55,(int) y); - } - // print surface level mark - double y = world.mapY(NsharpWxMath.getSkewTXY(soundingLys.get(0).getPressure(), -50).y); - gc.drawString("SFC("+Integer.toString((int)(soundingLys.get(0).getGeoHeight()))+"m)", (int)vxMax+ 50, - (int)y, false); - gc.drawLine((int) vxMax+ 50, (int)y, (int) vxMax + 55,(int) y); - // top level mark at 100 mbar - y = world.mapY(NsharpWxMath.getSkewTXY(100, -50).y); - float hgt = nsharpNative.nsharpLib.ihght(100); - gc.drawString(Float.toString(hgt/1000F), (int)vxMax+ 50,(int)y, false); - gc.drawString("Kft Km", (int) vxMax+35, (int)y -8); - gc.drawString("MSL", (int) vxMax+45, (int)y -15); - gc.drawLine((int) vxMax+40, (int)y, (int) vxMax + 60,(int) y); - - gc.drawLine((int) vxMax+50, (int)vyMin, (int) vxMax + 50,(int)vyMax); - - } - - /** - * Prints the pressure lines number at left side out of skewT bkgd for printing job - * - * @throws VizException - */ - public void printNsharpPressureLinesNumber(WGraphics world, GC gc) throws VizException { - String s = null; - double vxMax = world.getViewXmax(); - double vxMin = world.getViewXmin(); - for (int i = 0; i < NsharpConstants.PRESSURE_MAIN_LEVELS.length; i++) { - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MAIN_LEVELS[i],0); - - gc.drawLine((int)vxMin, (int)world.mapY(coor.y), - (int)vxMax, - (int)world.mapY(coor.y)); - - } - for (int i = 0; i < NsharpConstants.PRESSURE_MARK_LEVELS.length; i++) { - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_MARK_LEVELS[i],0); - - gc.drawLine((int)vxMin, (int)world.mapY(coor.y), - (int)vxMin+10, - (int)world.mapY(coor.y)); - - } - for (int i = 0; i < NsharpConstants.PRESSURE_NUMBERING_LEVELS.length; i++) { - s = NsharpConstants.pressFormat.format(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i]); - //we only care about pressure for this case, temp is no important when calling getSkewTXY - Coordinate coor = NsharpWxMath.getSkewTXY(NsharpConstants.PRESSURE_NUMBERING_LEVELS[i],0); - - gc.drawString( s, (int)vxMin-20, - (int)world.mapY(coor.y), false); - } - } - - /** - * Print the temp number at bottom out of skewT bkgd for printing job - * - * @throws VizException - */ - public void printNsharpTempNumber(WGraphics world, GC gc) throws VizException { - for (int i = 40; i > -50; i -= 10) { - Coordinate coorStart = NsharpWxMath.getSkewTXY(1050, i); - double startX = world.mapX(coorStart.x); - double startY = world.mapY(coorStart.y); - - gc.drawString( Integer.toString(i), (int)startX,(int)startY+5,false); - } - for (int i = -60; i > -120; i -= 10) { - Coordinate coorEnd = NsharpWxMath.getSkewTXY(100, i); - - //System.out.println("X = "+ startX + " Y = "+ startY); - double endX = world.mapX(coorEnd.x); - double endY = world.mapY(coorEnd.y); - - - gc.drawString( Integer.toString(i),(int) endX,(int)endY-10,false); - } - } - /** - * Draws station id out of skewT bkgd. - * - * @throws VizException - */ - - private void drawNsharpStationIdBox(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { - PixelExtent extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - double x= NsharpConstants.STATION_ID_REC_X_ORIG + 5; - double nextPageY = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END; - RGB color = NsharpConstants.color_yellow; - String s = "nextPage"; - target.drawString(font10, s, x, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawLine(NsharpConstants.STATION_ID_REC_X_ORIG, NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.STATION_ID_VIEW_X_END , NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.color_white,1, LineStyle.SOLID); - - - int numStnToShow = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - int startIndex = (curStnIdPage-1) * numStnToShow; - int i = 1; - int compIndex= 1; - int colorIndex; - for (int j = startIndex; j< stnStateList.size(); j++) - { - boolean avail=false; - NsharpStationStateProperty elm = stnStateList.get(j); - NsharpConstants.State sta ; - if(elm.stnState == NsharpConstants.State.ACTIVE && j == currentStnStateListIndex) - sta = NsharpConstants.State.CURRENT; - else - sta = elm.stnState; // set its state based on stn state - - double ly = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END + NsharpConstants.CHAR_HEIGHT * i; - if (currentTimeLineStateListIndex>=0){ - if(stnTimeTable.get(j).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL ){ - avail =true; - } - if(avail){ - color = NsharpConstants.color_red; - s = "*"; - } - else { - color = NsharpConstants.color_cyan; - s = "*"; - } - //System.out.println("selectedTimeList: "+ s); - - target.drawString(font10, s, x, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - - String stnId = elm.stnDescription; - - color = elementColorMap.get(sta); - target.drawString(font10, stnId, x+10, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - if(compareStnIsOn && elm.stnState == NsharpConstants.State.ACTIVE && avail){ - colorIndex = (compIndex-1)%(NsharpConstants.LINE_COMP10-NsharpConstants.LINE_COMP1+1)+ NsharpConstants.LINE_COMP1; - s ="Cp "+ compIndex; - target.drawString(font10,s, x+230, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]).getLineColor(), - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - compIndex++; - - }//else if(compareTmIsOn){ - //anything to do? - //} - - - i++; - if (ly >= NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.CHAR_HEIGHT) - //we dont show stn id that extends below box - break; - } - } - - /** - * Draws the stn id title out of skewT bkgd. - * - * @throws VizException - */ - private void drawNsharpStationIdTitle(IGraphicsTarget target) throws VizException { - //darw title first - String s; - s = stnStateList.size() + " stations"; - double x = NsharpConstants.STATION_ID_REC_X_ORIG; - double y = NsharpConstants.STATION_ID_REC_Y_ORIG - 60; - - target.drawString(font10, s, x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - NsharpConstants.color_white, - HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - y = y+NsharpConstants.CHAR_HEIGHT; - s = "page " + curStnIdPage+"/"+totalStnIdPage; - target.drawString(font10, s, x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - NsharpConstants.color_green, - HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - - } - //To be used later... - @SuppressWarnings("unused") - private void drawHodoWindMotionBox(IGraphicsTarget target, Rectangle rect) throws VizException { - target.drawShadedRect(new PixelExtent(rect.x, rect.x+rect.width, rect.y, rect.y+rect.height), NsharpConstants.color_black, 1.0, null); - target.drawWireframeShape(hodoWindMotionBoxShape, NsharpConstants.color_cyan, commonLinewidth,commonLineStyle,font10); - RGB colorN, colorS, colorM; - switch(currentHodoWindMode){ - case HODO_NORMAL: - colorN = NsharpConstants.color_white; - colorS = NsharpConstants.color_cyan; - colorM = NsharpConstants.color_cyan; - break; - case HODO_STORMRELATIVE: - colorN = NsharpConstants.color_cyan; - colorS = NsharpConstants.color_white; - colorM = NsharpConstants.color_cyan; - break; - case HODO_BNDRY: - colorN = NsharpConstants.color_cyan; - colorS = NsharpConstants.color_cyan; - colorM = NsharpConstants.color_cyan; - break; - case HODO_MEANWIND: - default: - colorN = NsharpConstants.color_cyan; - colorS = NsharpConstants.color_cyan; - colorM = NsharpConstants.color_white; - break; - } - double xOri = NsharpConstants.WIND_MOTION_REC_X_ORIG; - double yOri = NsharpConstants.WIND_MOTION_REC_Y_ORIG; - target.drawString(font10, "NORMAL ", xOri+ NsharpConstants.WIND_MOTION_REC_WIDTH/2, - yOri+NsharpConstants.WIND_MOTION_REC_HEIGHT/3, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - colorN, - HorizontalAlignment.CENTER, - VerticalAlignment.BOTTOM, null); - target.drawString(font10, "STORMREL ", xOri+ NsharpConstants.WIND_MOTION_REC_WIDTH/2, - yOri+ 2* NsharpConstants.WIND_MOTION_REC_HEIGHT/3, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - colorS, - HorizontalAlignment.CENTER, - VerticalAlignment.BOTTOM, null); - target.drawString(font10, "MEAN WIND", xOri+ NsharpConstants.WIND_MOTION_REC_WIDTH/2, - yOri+ NsharpConstants.WIND_MOTION_REC_HEIGHT, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - colorM, - HorizontalAlignment.CENTER, - VerticalAlignment.BOTTOM, null); - } - /** - * Draws datatime box out of skewT bkgd. - * - * @throws VizException - */ - private void drawNsharpTimelinBox(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { - PixelExtent extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //System.out.println("drawNsharpDataTimelines picked stn info: "+ pickedStnInfoStr); - double x = NsharpConstants.DATA_TIMELINE_REC_X_ORIG + 5;//, x1 ; - double nextPageY = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END;//DATA_TIMELINE_REC_Y_ORIG + NsharpConstants.CHAR_HEIGHT; - RGB color = NsharpConstants.color_yellow; - String s = "nextPage"; - target.drawString(font10, s, x, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawLine(NsharpConstants.DATA_TIMELINE_REC_X_ORIG, NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.DATA_TIMELINE_VIEW_X_END , NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.color_white,1, LineStyle.SOLID); - - - int numTimeLineToShowPerPage = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - int startIndex = (curTimeLinePage-1) * numTimeLineToShowPerPage; - int i = 1; - //List curStnTimeList = getStnTimeLineListByTimeLine(curSndProfileProp); - if(timeLineStateList!= null){ - int compIndex= 1; - int colorIndex; - //List stnTmList = stnTimeLineListMap.get(stationIdList.get(curStnIndex).elementDescription); - for (int j = startIndex; j< timeLineStateList.size(); j++) - { - boolean avail=false; - NsharpTimeLineStateProperty elm = timeLineStateList.get(j); - NsharpConstants.State sta = elm.timeState; - double ly = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END + NsharpConstants.CHAR_HEIGHT * i; - if(elm.timeState == NsharpConstants.State.ACTIVE && j == currentTimeLineStateListIndex ) - sta = NsharpConstants.State.CURRENT; - if(currentStnStateListIndex>=0){ - - - if ( stnTimeTable.get(currentStnStateListIndex).get(j).elementState == NsharpConstants.State.AVAIL ){ - avail = true; - } - if(avail){ - color = NsharpConstants.color_red; - s = "*"; - } - else { - color = NsharpConstants.color_cyan; - s = "*"; - } - //System.out.println("selectedTimeList: "+ s); - - target.drawString(font10, s, x, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - - color = elementColorMap.get(sta); - s = elm.timeDescription; - target.drawString(font10, s, x+10, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - i++; - if(compareTmIsOn && elm.timeState == NsharpConstants.State.ACTIVE && avail){ - colorIndex = (compIndex-1)%(NsharpConstants.LINE_COMP10-NsharpConstants.LINE_COMP1+1)+ NsharpConstants.LINE_COMP1; - s ="Cp "+ compIndex; - target.drawString(font10,s, x+270, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]).getLineColor(), - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - compIndex++; - } - /*else if(overlayIsOn){ - if(j == currentTimeLineStateListIndex) - { - target.drawString(font10,"Ol 1" , x+270, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor(), - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - if(j == previousTimeLineStateListIndex && previousTimeLineStateListIndex != currentTimeLineStateListIndex) - { - target.drawString(font10, "Ol 2", x+270, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(), - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - } */ - if (ly >= NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.CHAR_HEIGHT) - //we dont show time line that extends below time line box - break; - } - } - - - } - /* - * - * Chin NOte: - * drawNsharpDataTimelines() draws dataTimelineList. But since this list is not shown in GUI now, - * so, it is not used for now.But keep it for possibly used again in the future. - * - * - private void drawNsharpDataTimelines(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { - PixelExtent extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - //System.out.println("drawNsharpDataTimelines picked stn info: "+ pickedStnInfoStr); - double x = NsharpConstants.DATA_TIMELINE_REC_X_ORIG + 5;//, x1 ; - double nextPageY = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END;//DATA_TIMELINE_REC_Y_ORIG + NsharpConstants.CHAR_HEIGHT; - RGB color = NsharpConstants.color_yellow; - String s = "nextPage"; - String s1="", s2=""; - target.drawString(font10, s, x, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - target.drawLine(NsharpConstants.DATA_TIMELINE_REC_X_ORIG, NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.DATA_TIMELINE_VIEW_X_END , NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.color_white,1, LineStyle.SOLID); - - int numTimeLineToShow = (NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END)/NsharpConstants.CHAR_HEIGHT; - int startIndex = (curTimeLinePage-1) * numTimeLineToShow; - int i = 1, colorIndex=NsharpConstants.LINE_COMP1;//1; - for (int j = startIndex; j< dataTimelineList.size(); j++) - { - ElementStateProperty elm = dataTimelineList.get(j); - s = elm.elementDescription; - - //System.out.println("selectedTimeList: "+ s); - double ly = NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END + NsharpConstants.CHAR_HEIGHT * i; - - if(!compareIsOn){ - if(overlayIsOn == true && this.previousSoundingLys!=null){ - if(elm.elementState == NsharpConstants.State.PICKED ){ - color = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor(); - - } - else if(elm.elementState == NsharpConstants.State.OVERLAY) - color = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor(); - - else - color = elementColorMap.get(elm.elementColor); - - } - else { - color = elementColorMap.get(elm.elementColor); - } - } - else { - if(elm.elementState == NsharpConstants.State.PICKED || elm.elementState == NsharpConstants.State.GROUPED) { - color = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]).getLineColor(); - - } - else - { - color = elementColorMap.get(elm.elementColor); - } - - colorIndex++; //always increase index, no matter ploting this elm or not - if(colorIndex > NsharpConstants.LINE_COMP10)//COLOR_ARRAY.length-1) - colorIndex =NsharpConstants.LINE_COMP1;//1; - } - if(elm.elementState == NsharpConstants.State.PICKED){ - pickedStnColor = color; - } - - StringTokenizer stoken = new StringTokenizer(s); - if(sortByStn){ - s1 = stoken.nextToken(); //stn name, display upto 4 char - s2 = s.substring(s1.length()); - int nameLen= Math.min(4, s1.length()); - s1 = s1.substring(0,nameLen); - - }else{ - s2 = stoken.nextToken(); //stn name - s1 = s.substring(s2.length()+1)+ " "; - int nameLen= Math.min(4, s2.length()); - s2 = s2.substring(0,nameLen); - } - //System.out.println("drawNsharpDataTimelines color " + color); - s= s1+ s2; - target.drawString(font10, s, x, - ly, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - i++; - if (ly >= NsharpConstants.DATA_TIMELINE_NOTATION_Y_START-NsharpConstants.CHAR_HEIGHT) - //we dont show time line that extends below time line box - break; - - } - - //plot sorting area - x = NsharpConstants.DATA_TIMELINE_SORT_X_START; - target.drawLine(x, NsharpConstants.DATA_TIMELINE_REC_Y_ORIG, 0.0, - x, NsharpConstants.DATA_TIMELINE_NEXT_PAGE_END, 0.0, - NsharpConstants.color_white,1, LineStyle.SOLID); - color = NsharpConstants.color_yellow; - s = "list by:"; - target.drawString(font10, s, x+2, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - x = NsharpConstants.DATA_TIMELINE_SORT_X_START + (NsharpConstants.DATA_TIMELINE_VIEW_X_END - NsharpConstants.DATA_TIMELINE_SORT_X_START)/3; - s = "Stn"; - s1 = "Time"; - RGB color1; - if(sortByStn){ - - color = NsharpConstants.color_green; - color1 = NsharpConstants.color_white; - } - else{ - color = NsharpConstants.color_white; - color1 = NsharpConstants.color_green; - } - target.drawString(font10, s, x+10, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - target.drawString(font10, s1, x+60, - nextPageY, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color1, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - }*/ - /** - * Draws the temp number at bottom out of skewT bkgd. - * - * @throws VizException - */ - private void drawNsharpTimelineTitle(IGraphicsTarget target) throws VizException { - String s = timeLineStateList.size() + " time lines"; - double x = NsharpConstants.DATA_TIMELINE_REC_X_ORIG; - double y = NsharpConstants.DATA_TIMELINE_REC_Y_ORIG - 60; - - target.drawString(font10, s, x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - NsharpConstants.color_white, - HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - y = y+NsharpConstants.CHAR_HEIGHT; - s = "page " + curTimeLinePage+"/"+totalTimeLinePage; - target.drawString(font10, s, x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - NsharpConstants.color_green, - HorizontalAlignment.LEFT, - VerticalAlignment.MIDDLE, null); - } - - /** - * Draws color notations - * - * @throws VizException - */ - private void drawNsharpColorNotation(IGraphicsTarget target, WGraphics world, Rectangle rect) throws VizException { - PixelExtent extent = new PixelExtent(rect); - RGB color; - target.setupClippingPlane(extent); - //plot notations: - - double x = NsharpConstants.COLOR_NOTATION_REC_X_ORIG+5; - double y = NsharpConstants.COLOR_NOTATION_REC_Y_ORIG+25; - color = NsharpConstants.color_white; - target.drawString(font10, "TimeLine/Station State Color Notations:", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - y=y+25; - color = NsharpConstants.color_green; - target.drawString(font10, "Current:green", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - x = x+180; - color = NsharpConstants.color_yellow; - target.drawString(font10, "Active:yellow", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - - x = x+180; - color = NsharpConstants.color_white; - target.drawString(font10, "InActive:white", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - x = NsharpConstants.COLOR_NOTATION_REC_X_ORIG+5; - y=y+25; - - color = NsharpConstants.color_white; - target.drawString(font10, "Current TimeLine/Station Data Loading Status:", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - x = NsharpConstants.COLOR_NOTATION_REC_X_ORIG+5; - y=y+25; - color = NsharpConstants.color_red; - target.drawString(font10, "* :Data Loaded", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - x = x+180; - color = NsharpConstants.color_cyan; - target.drawString(font10, "* :Data Not Loaded", x, - y, 0.0, - IGraphicsTarget.TextStyle.NORMAL, - color, - HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - - target.clearClippingPlane(); - - } - /** - * - * Draws Wind barb and wind speed vs height into box - * This function followed algorithm in plot_barbs (void) at xwvid1.c - * to choose wind bulb for drawing around every 400m - * - */ - private void drawNsharpWindBarb(IGraphicsTarget target, double zoomLevel, - WGraphics world, RGB icolor, List sndLys, double xPosition, double botPress)throws VizException { - ArrayList> windList = new ArrayList>(); - - double windX = xPosition; - float lastHeight = -999; - double windY=0; - double barbScaleFactorx, barbScaleFactory; - barbScaleFactorx = zoomLevel; - barbScaleFactory = zoomLevel; - //System.out.println("zoom="+zoomLevel +"world viewYmin="+world.getViewYmin()+" viewYmax="+world.getViewYmax()+" wolrdYmin="+ world.getWorldYmin()+" wolrdYmax="+ world.getWorldYmax() - // +"world viewXmin="+world.getViewXmin()+" viewXmax="+world.getViewXmax()+" wolrdXmin="+ world.getWorldXmin()+" wolrdXmax="+ world.getWorldXmax()); - for (NcSoundingLayer layer : sndLys) { - float pressure = layer.getPressure(); - float spd = layer.getWindSpeed(); - float dir = layer.getWindDirection(); - if ( pressure < botPress || spd < 0 ) { - continue; - } - if(spd > 140) - spd = 140; - if ((layer.getGeoHeight() - lastHeight) < graphConfigProperty.getWindBarbDistance()*zoomLevel){ - - continue; - } - - // Get the vertical ordinate. - if(currentGraphMode== NsharpConstants.GRAPH_SKEWT) - windY = NsharpWxMath.getSkewTXY(pressure, 0).y; - else if(currentGraphMode== NsharpConstants.GRAPH_ICING ){ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - //Chin:Y axis (pressure) is scaled using log scale and increaing downward - //WorldYmin= at pressure 1000,its value actually is 1000 (max), wolrdYmax = at pressure 300, its value is 825 (min) - windY = world.getWorldYmax() + (world.getWorldYmin()-bkRsc.getIcingBackground().toLogScale(pressure)); - barbScaleFactorx = 2.5*zoomLevel; - barbScaleFactory= 3.5*zoomLevel;//experimental value: depends on the world coordinate size set - }else if( currentGraphMode== NsharpConstants.GRAPH_TURB){ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - //Chin:Y axis (pressure) is scaled using log scale and increaing downward - //WorldYmin= at pressure 1000,its value actually is 1000 (max), wolrdYmax = at pressure 300, its value is 825 (min) - windY = world.getWorldYmax() + (world.getWorldYmin()-bkRsc.getTurbBackground().toLogScale(pressure)); - barbScaleFactorx = .23*zoomLevel;//experimental value: depends on the world coordinate size set - barbScaleFactory=5.5*zoomLevel; - } - else - continue; - - List barb = WindBarbFactory.getWindGraphics((double) (spd), (double) dir); - if (barb != null) { - // WindBarbFactory.scaleBarb(barb, zoomLevel*barbScaleFactor); - for (LineStroke stroke : barb) { - stroke.scale(barbScaleFactorx, barbScaleFactory); - } - //System.out.println("pressure="+pressure+" windX="+windX+" windY="+windY); - WindBarbFactory.translateBarb(barb, windX, windY); - windList.add(barb); - } - lastHeight = layer.getGeoHeight(); - } - - for (List barb : windList) { - //System.out.println("barb"); - for (LineStroke stroke : barb) { - //System.out.println("p1x="+(int)stroke.getPoint().x+" p1y="+(int)stroke.getPoint().y); - stroke.render(target, world, icolor); - } - } - } - - /** - * - * Print Wind barb for printing job - * This function followed algorithm in plot_barbs (void) at xwvid1.c - * to choose wind bulb for drawing around every 400m - * - */ - public void printNsharpWind(WGraphics world, GC gc)throws VizException { - ArrayList> windList = new ArrayList>(); - - double windX = world.getViewXmax() + 6*BARB_LENGTH; - //System.out.println("windX="+windX); - float lastHeight = -999; - double windY; - for (NcSoundingLayer layer : soundingLys) { - float pressure = layer.getPressure(); - float spd = layer.getWindSpeed(); - float dir = layer.getWindDirection(); - - - if ( pressure < 100) { - continue; - } - - if ((layer.getGeoHeight() - lastHeight) < 400){ - - continue; - } - - // Get the vertical ordinate. - windY = world.mapY(NsharpWxMath.getSkewTXY(pressure, 0).y); - - List barb = WindBarbFactory.getWindGraphics( - /*metersPerSecondToKnots.convert*/(double) (spd), (double) dir); - if (barb != null) { - WindBarbFactory.scaleBarb(barb, -7); - WindBarbFactory.translateBarb(barb, windX, windY); - windList.add(barb); - } - - lastHeight = layer.getGeoHeight(); - } - Coordinate pt1=new Coordinate(0,0), pt2; - for (List barb : windList) { - for (LineStroke stroke : barb) { - //stroke render: rewrite stroke.render() for our printing purpose - if(stroke.getType()=="M") { - pt1 = stroke.getPoint(); - //change X coordinate by mirroring x coordinate at windX axis. AS we scaleBarb with -5 time. - // It is easier to mirror at x-axis for this case. - pt1.x = windX - (pt1.x-windX); - //System.out.print("Myp1x="+(int)pt1.x+" p1y="+(int)pt1.y); - - } - else if(stroke.getType()=="D"){ - pt2 = stroke.getPoint(); - pt2.x = windX - (pt2.x-windX); - //System.out.println( " p2x="+(int)pt2.x+" p2y="+ (int)pt2.y); - gc.drawLine((int)pt1.x, (int)pt1.y, (int)pt2.x, (int)pt2.y); - } - } - } - gc.drawLine((int)windX,(int)world.mapY(NsharpWxMath.getSkewTXY(100, 0).y), - (int)windX,(int)world.mapY(NsharpWxMath.getSkewTXY(1000, 0).y)); - } - - /** - * - * Print the wetbulb trace curve - * - * @throws VizException - */ - public void printNsharpWetbulbTraceCurve( - WGraphics world, GC gc) throws VizException { - if((soundingLys == null) || (soundingLys.size()==0)) - return; - float t1; - - Coordinate c2 = null; - Coordinate c1; - // print trace - for (NcSoundingLayer layer : this.soundingLys) { - if (layer.getDewpoint() > -200){ - t1 = nsharpNative.nsharpLib.wetbulb(layer.getPressure(), layer.getTemperature(), - layer.getDewpoint()); - - c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - if(c2!= null){ - gc.drawLine((int)c1.x, (int)c1.y, (int)c2.x, (int)c2.y); - } - c2 = c1; - } - } - - } - - public void printNsharpParcelTraceCurve(WGraphics world, GC gc) throws VizException{ - if(soundingLys.size() > 0){ - for (ParcelData parData: parcelList){ - //plotNsharpParcelTraceCurve(null, 0, world, NsharpConstants.color_white,parData.parcelType, parData.userPressure, gc, true); - nsharpNative.nsharpLib.define_parcel(parData.parcelType, parData.parcelLayerPressure); - - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - - float vtemp = nsharpNative.nsharpLib.virtemp (sfcpres, sfctemp, sfcdwpt); - Coordinate c1 = NsharpWxMath.getSkewTXY(sfcpres, vtemp); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - FloatByReference p2 = new FloatByReference(0), t2 = new FloatByReference(0);; - nsharpNative.nsharpLib.drylift (sfcpres, sfctemp, sfcdwpt, p2, t2); - vtemp = nsharpNative.nsharpLib.virtemp (p2.getValue(), t2.getValue(), t2.getValue()); - Coordinate c2 = NsharpWxMath.getSkewTXY(p2.getValue(), vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - gc.drawLine((int)c1.x, (int)c1.y, (int)c2.x, (int)c2.y); - c1 = c2; - - - float t3; - for (float i = p2.getValue() - 50; i >= 100; i = i - 50) - { - t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), i); - vtemp = nsharpNative.nsharpLib.virtemp (i, t3, t3); - c2 = NsharpWxMath.getSkewTXY(i, vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - gc.drawLine((int)c1.x, (int)c1.y, (int)c2.x, (int)c2.y); - c1 = c2; - } - - t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), 100); - vtemp = nsharpNative.nsharpLib.virtemp (100, t3, t3); - c2 = NsharpWxMath.getSkewTXY(100, vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - gc.drawLine((int)c1.x, (int)c1.y, (int)c2.x, (int)c2.y); - } - } - } - private void plotHodoEditPoints(IGraphicsTarget target, - WGraphics world, RGB color) throws VizException { - - Coordinate c1; - for (NcSoundingLayer layer : this.soundingLys){ - if(layer.getPressure() < 100 || layer.getWindSpeed() <0) - continue; - float wspd = layer.getWindSpeed(); - float wdir = layer.getWindDirection(); - c1 = WxMath.uvComp(wspd, wdir); - target.drawPoint(world - .mapX(c1.x), world.mapY(c1.y), 0.0, color, PointStyle.CIRCLE); - - - } - } - private void plotPressureTempEditPoints(IGraphicsTarget target, - WGraphics world, RGB color, int type, List soundingLys) throws VizException { - double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world - .getWorldYmax())).y; - double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world - .getWorldYmin())).y; - PointStyle ps = PointStyle.CIRCLE; - for (NcSoundingLayer layer : soundingLys) { - double t; - if(type == TEMP_TYPE) - t = layer.getTemperature(); - else if (type == DEWPOINT_TYPE) - t = layer.getDewpoint(); - else - break; - double pressure = layer.getPressure(); - if (t != INVALID_DATA && pressure >= minPressure - && pressure <= maxPressure) { - - Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); - - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - - target.drawPoint(c1.x, c1.y, 0.0, color, ps); - - } - } - } - /** - * - * Print the temperature curve when during overlap or compare mode - * - * @throws VizException - */ - - public void printNsharpPressureTempCurve(WGraphics world, int type, GC gc,List soundingLys) throws VizException { - if((soundingLys == null) || (soundingLys.size()==0)) - return; - - double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world - .getWorldYmax())).y; - double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, world - .getWorldYmin())).y; - Coordinate c0 = null; - for (NcSoundingLayer layer : soundingLys) { - double t; - if(type == TEMP_TYPE) - t = layer.getTemperature(); - else if (type == DEWPOINT_TYPE) - t = layer.getDewpoint(); - else - break; - double pressure = layer.getPressure(); - if (t != INVALID_DATA && pressure >= minPressure - && pressure <= maxPressure) { - - Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); - - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - //System.out.println("C.x "+ c1.x + " C.y "+ c1.y); - if (c0 != null) { - gc.drawLine((int)c0.x, (int)c0.y, (int)c1.x, (int)c1.y); - } - c0 = c1; - } - } - - } - - - /** - * - * Print the HODO - * - * - * @throws VizException - */ - - public void printNsharpHodoWind(WGraphics world, GC gc, List soundingLays) throws VizException { - Coordinate c0 = null; - Coordinate c1; - for (NcSoundingLayer layer : soundingLays){ - if(layer.getPressure() < 100 || layer.getWindSpeed() <0) - continue; - float wspd = layer.getWindSpeed(); - float wdir = layer.getWindDirection(); - c1 = WxMath.uvComp(wspd, wdir); - if (c0 != null) { - gc.setLineWidth(1); - gc.drawLine((int)world.mapX(c0.x),(int) world.mapY(c0.y),(int) world - .mapX(c1.x),(int) world.mapY(c1.y)); - } - c0 = c1; - } - - - } - - /* - * smvtype: 1: small circle, 2 large circle, 3: square - */ - public void plotNsharpHodoVectors(IGraphicsTarget target, double zoomLevel, - WGraphics world, GC gc, boolean printEvent) throws VizException { - double radiusUnit = 10; - //NsharpParametersSelectionConfigDialog configD = NsharpParametersSelectionConfigDialog.getAccess(); - Coordinate c; - FloatByReference value1= new FloatByReference(-999); - FloatByReference value2= new FloatByReference(-999); - FloatByReference wdir= new FloatByReference(-999); - FloatByReference wspd= new FloatByReference(-999); - FloatByReference Surfpressure = new FloatByReference(-999); - String textStr; - - //plot Mean Wind Vector, yellow square, by default plot it - if(((graphConfigProperty != null ) && (graphConfigProperty.isMeanWind()))||(graphConfigProperty == null)){ - nsharpNative.nsharpLib.mean_wind( -1, -1, value1, value2, wdir, wspd); - if( nsharpNative.nsharpLib.qc(wdir.getValue())==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - c = WxMath.uvComp(wspd.getValue(),wdir.getValue()); - c= world.map(c); - if(printEvent== true){ - gc.setLineWidth(1); - gc.drawRectangle((int) (c.x-radiusUnit), (int)( c.y-radiusUnit), (int)(2*radiusUnit), (int)(2*radiusUnit)); - } - else { - PixelExtent pe = new PixelExtent( c.x-radiusUnit, c.x+radiusUnit, c.y-radiusUnit, c.y+radiusUnit ); - target.drawRect(pe, NsharpConstants.color_yellow, markerWidth*2, 1.0f); - textStr= String.format("%.0f/%.0f MW",wdir.getValue(),wspd.getValue()); - target.drawString(font9, textStr, c.x-radiusUnit, c.y+radiusUnit+5, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.TOP, null); - } - } - } - //plot 15/85 and/or 30/75 SMV, by default dont plot it - if((graphConfigProperty != null ) && (graphConfigProperty.isSmv1585() || graphConfigProperty.isSmv3075())){ - nsharpNative.nsharpLib.get_surface(Surfpressure, value1, value2); - if(nsharpNative.nsharpLib.qc(Surfpressure.getValue()) == 1) { - nsharpNative.nsharpLib.mean_wind(Surfpressure.getValue(), nsharpNative.nsharpLib.ipres (nsharpNative.nsharpLib.msl (6000.0F)),value1, value2, wdir, wspd); - if( nsharpNative.nsharpLib.qc(wdir.getValue())==1 && nsharpNative.nsharpLib.qc(wspd.getValue())==1) { - // ----- Plot 30/75 Storm Motion Vector -----small red circle - if(graphConfigProperty.isSmv3075()){ - //System.out.println("Plot 30/75 Storm Motion Vector 2"); - float dir = (wdir.getValue() + 30.0f)%360; - float spd = wspd.getValue() * 0.75f; - //System.out.println(spd + " "+ wspd.getValue()); - c = WxMath.uvComp(spd,dir); - c= world.map(c); - if(printEvent== true){ - gc.drawOval((int) (c.x-radiusUnit), (int)( c.y-radiusUnit), (int)(2*radiusUnit), (int)(2*radiusUnit)); - gc.drawLine((int) (c.x - radiusUnit/2), (int)c.y,(int) ( c.x + radiusUnit/2),(int) c.y); - gc.drawLine((int) (c.x), (int)(c.y - radiusUnit/2),(int) ( c.x ),(int) (c.y + radiusUnit/2)); - } - else { - RGB color = NsharpConstants.color_red; - target.drawCircle(c.x, c.y, 0, radiusUnit,color, markerWidth*2); - target.drawLine(c.x - radiusUnit/2, c.y, 0.0,c.x + radiusUnit/2, c.y, 0.0, color, - markerWidth); - target.drawLine(c.x, c.y- radiusUnit/2, 0.0,c.x, c.y + radiusUnit/2, 0.0, color, - markerWidth); - } - } - //----- Plot 15/85 Storm Motion Vector ----- small green color circle - if(graphConfigProperty.isSmv1585()){ - float dir = (wdir.getValue() + 15.0f)%360; - float spd = wspd.getValue() * 0.85f; - //System.out.println(spd + " "+ wspd.getValue()); - c = WxMath.uvComp(spd,dir); - c= world.map(c); - if(printEvent== true){ - gc.drawOval((int) (c.x-radiusUnit), (int)( c.y-radiusUnit), (int)(2*radiusUnit), (int)(2*radiusUnit)); - gc.drawLine((int) (c.x - radiusUnit/2), (int)c.y,(int) ( c.x + radiusUnit/2),(int) c.y); - gc.drawLine((int) (c.x), (int)(c.y - radiusUnit/2),(int) ( c.x ),(int) (c.y + radiusUnit/2)); - } - else { - RGB color = NsharpConstants.color_green; - target.drawCircle(c.x, c.y, 0, radiusUnit,color, markerWidth*2); - target.drawLine(c.x - radiusUnit/2, c.y, 0.0,c.x + radiusUnit/2, c.y, 0.0, color, - markerWidth); - target.drawLine(c.x, c.y- radiusUnit/2, 0.0,c.x, c.y + radiusUnit/2, 0.0, color, - markerWidth); - } - } - } - } - } - //plot Corfidi Vectors, color_stellblue small circles, by default Not plot it - if((graphConfigProperty != null ) && graphConfigProperty.isCorfidiV()){ - //Upwind-Propagating MCS motion vector - FloatByReference upwdir= new FloatByReference(-999); - FloatByReference upwspd= new FloatByReference(-999); - //Downwind-Propagating MCS motion vector - FloatByReference dpwdir= new FloatByReference(-999); - FloatByReference dpwspd= new FloatByReference(-999); - FloatByReference value5= new FloatByReference(-999); - FloatByReference value6= new FloatByReference(-999); - - nsharpNative.nsharpLib.corfidi_MCS_motion(value1, value2, dpwdir, dpwspd, value5, value6, upwdir, upwspd); - c = WxMath.uvComp(dpwspd.getValue(),dpwdir.getValue()); - c= world.map(c); - RGB color = NsharpConstants.color_lightblue; - target.drawCircle(c.x, c.y, 0, radiusUnit/2,color, markerWidth); - //target.drawLine(c.x - radiusUnit/2, c.y, 0.0,c.x + radiusUnit/2, c.y, 0.0, color, - // markerWidth); - //target.drawLine(c.x, c.y- radiusUnit/2, 0.0,c.x, c.y + radiusUnit/2, 0.0, color, - // markerWidth); - textStr = String.format("DP= %.0f/%.0f",dpwdir.getValue(), dpwspd.getValue()); - target.drawString(font9, textStr, c.x, c.y+10, 0.0, - TextStyle.NORMAL, color, HorizontalAlignment.RIGHT, - VerticalAlignment.TOP, null); - - c = WxMath.uvComp(upwspd.getValue(),upwdir.getValue()); - c= world.map(c); - target.drawCircle(c.x, c.y, 0, radiusUnit/2,color, markerWidth); - //target.drawLine(c.x - radiusUnit/2, c.y, 0.0,c.x + radiusUnit/2, c.y, 0.0, color, - // markerWidth); - //target.drawLine(c.x, c.y- radiusUnit/2, 0.0,c.x, c.y + radiusUnit/2, 0.0, color, - // markerWidth); - textStr = String.format("UP= %.0f/%.0f",upwdir.getValue(), upwspd.getValue()); - target.drawString(font9, textStr, c.x, c.y+10, 0.0, - TextStyle.NORMAL, color, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - //plot Bunkers Vector,by default plot them - if(((graphConfigProperty != null ) && graphConfigProperty.isSmvBunkersR())||(graphConfigProperty == null)){ - FloatByReference bwdir= new FloatByReference(-999); - FloatByReference bwspd= new FloatByReference(-999); - nsharpNative.nsharpLib.bunkers_storm_motion(value1, value2, bwdir, bwspd); - c = WxMath.uvComp(bwspd.getValue(),bwdir.getValue()); - c= world.map(c); - RGB color = NsharpConstants.color_firebrick; - target.drawCircle(c.x, c.y, 0, radiusUnit,color, markerWidth); - target.drawLine(c.x - radiusUnit, c.y, 0.0,c.x + radiusUnit, c.y, 0.0, color, - markerWidth); - target.drawLine(c.x, c.y- radiusUnit, 0.0,c.x, c.y + radiusUnit, 0.0, color, - markerWidth); - textStr = String.format("%.0f/%.0f RM",bwdir.getValue(), bwspd.getValue()); - target.drawString(font9, textStr, c.x, c.y+10, 0.0, - TextStyle.NORMAL, color, HorizontalAlignment.RIGHT, - VerticalAlignment.TOP, null); - } - if(((graphConfigProperty != null ) && graphConfigProperty.isSmvBunkersL())||(graphConfigProperty == null)){ - FloatByReference bwdir= new FloatByReference(-999); - FloatByReference bwspd= new FloatByReference(-999); - nsharpNative.nsharpLib.bunkers_left_motion(value1, value2, bwdir, bwspd); - c = WxMath.uvComp(bwspd.getValue(),bwdir.getValue()); - c= world.map(c); - RGB color = NsharpConstants.color_skyblue; - target.drawCircle(c.x, c.y, 0, radiusUnit,color, markerWidth); - target.drawLine(c.x - radiusUnit, c.y, 0.0,c.x + radiusUnit, c.y, 0.0, color, - markerWidth); - target.drawLine(c.x, c.y- radiusUnit, 0.0,c.x, c.y + radiusUnit, 0.0, color, - markerWidth); - textStr = String.format("%.0f/%.0f LM",bwdir.getValue(), bwspd.getValue()); - target.drawString(font9, textStr, c.x, c.y-10, 0.0, - TextStyle.NORMAL, color, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - - //plot current storm motion vector (mouse click) marker - target.drawCircle(hodoHouseC.x, hodoHouseC.y, 0, 15, - NsharpConstants.color_white, markerWidth); - target.drawLine(hodoHouseC.x - 7.5, hodoHouseC.y, 0.0,hodoHouseC.x + 7.5, hodoHouseC.y, 0.0, NsharpConstants.color_white, - markerWidth); - target.drawLine(hodoHouseC.x, hodoHouseC.y- 7.5, 0.0,hodoHouseC.x, hodoHouseC.y + 7.5, 0.0, NsharpConstants.color_white, - markerWidth); - textStr = String.format("%.0f/%.0f",smWindDir, smWindSpd); - target.drawString(font9, textStr, hodoHouseC.x,hodoHouseC.y+15, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.CENTER, - VerticalAlignment.TOP, null); - - //plot critical angel - float ca = nsharpNative.nsharpLib.cave_criticalAngel(); - if(ca != -9999){ - c = WxMath.uvComp(90,45); //90/45 is location picked visually from hodo grapg to draw crtical angel - c= world.map(c); - textStr = String.format("Critical Angel = %.0f",ca); - target.drawString(font9, textStr, c.x, c.y, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - //draw lines from storm motion to top and bottom of effective layer - FloatByReference topPF= new FloatByReference(0); - FloatByReference botPF= new FloatByReference(0); - nsharpNative.nsharpLib.get_effectLayertopBotPres(topPF, botPF); - if(botPF.getValue() >=1 ){ - // interpolate wind direction and speed at top and bottom of effective layer - float bot_spd = nsharpNative.nsharpLib.iwspd(botPF.getValue()); - float bot_dir = nsharpNative.nsharpLib.iwdir(botPF.getValue()); - float top_spd = nsharpNative.nsharpLib.iwspd(topPF.getValue()); - float top_dir = nsharpNative.nsharpLib.iwdir(topPF.getValue()); - c = WxMath.uvComp(bot_spd,bot_dir); - c= world.map(c); - target.drawLine(hodoHouseC.x, hodoHouseC.y, 0.0,c.x, c.y, 0.0, NsharpConstants.color_skyblue, - markerWidth); - c = WxMath.uvComp(top_spd,top_dir); - c= world.map(c); - target.drawLine(hodoHouseC.x, hodoHouseC.y, 0.0,c.x, c.y, 0.0, NsharpConstants.color_skyblue, - markerWidth); - } - } - - - private void plotNsharpSRWindVectors(IGraphicsTarget target, double zoomLevel, - WGraphics world, Rectangle rect) throws VizException { - /* - * Chin:: NOTE::: - * - * This plotting function is based on the algorithm of plot_storminflow() - * at xwvid5.c of legacy nsharp source code - * - * This function is dynamically chnaged when user change "storm relative" - * (by click on Hodo graph). Also it uses target.drawArc. - * With these 2 reasons, wire frame shape is not used. - */ - double dispX, dispY; - double vyMax = world.getViewYmax(); - double vyMin = world.getViewYmin(); - double vxMax = world.getViewXmax(); - double vxMin = world.getViewXmin(); - int width = getCapability(OutlineCapability.class).getOutlineWidth(); - - PixelExtent extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - /* ----- Plot Label ----- */ - dispX = vxMin + 30; - dispY = vyMin + 30; - target.drawString(font9, "SR Wind Vectors", dispX, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - //plot X axis - //xScaleAdjustRatio = (world.getViewXmax()-vxMin)/50; - dispY = vyMin + (vyMax - vyMin )/2; - target.drawLine(vxMin , dispY, 0.0, vxMax,dispY, 0.0, NsharpConstants.color_white, - width/3F); - //plot Y axis - dispX = vxMin + (vxMax - vxMin )/2; - target.drawLine(dispX, vyMax, 0.0, dispX,vyMin, 0.0, NsharpConstants.color_white, - width/3F); - - //plot speed rings - - for(int i=40; i<=NsharpConstants.INSET_REC_WIDTH/2; i+=40) { - target.drawArc(dispX,dispY, 0, i,NsharpConstants.color_stellblue, markerWidth, 0, 360, LineStyle.DASH_DOTTED, true); - } - - FloatByReference smdir= new FloatByReference(0); - FloatByReference smspd= new FloatByReference(0); - FloatByReference wdir= new FloatByReference(0); - FloatByReference wspd= new FloatByReference(0); - FloatByReference mnu= new FloatByReference(0); - FloatByReference mnv= new FloatByReference(0); - nsharpNative.nsharpLib.get_storm(smspd, smdir); - int scaleFactor = 2; - int gap = 10; - /* ----- Plot 0-2km Inflow Vector ----- */ - nsharpNative.nsharpLib.sr_wind( -1, - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(2000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - target.drawLine(dispX , dispY, 0.0, dispX + mnu.getValue() * scaleFactor,dispY- mnv.getValue()* scaleFactor, 0.0, NsharpConstants.color_red, - width*2); - - target.drawString(font12, "L", dispX+ mnu.getValue()* scaleFactor, dispY- mnv.getValue()* scaleFactor+2*gap, 0.0, - TextStyle.NORMAL, NsharpConstants.color_red, HorizontalAlignment.CENTER, - VerticalAlignment.MIDDLE, null); - /* ----- Plot 4-6km Inflow Vector ----- */ - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(4000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(6000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - target.drawLine(dispX , dispY, 0.0, dispX + mnu.getValue()* scaleFactor,dispY- mnv.getValue()* scaleFactor, 0.0, NsharpConstants.color_cyan, - width*2); - - target.drawString(font12, "M", dispX+ mnu.getValue()* scaleFactor, dispY- mnv.getValue()* scaleFactor+2*gap, 0.0, - TextStyle.NORMAL, NsharpConstants.color_cyan, HorizontalAlignment.CENTER, - VerticalAlignment.MIDDLE, null); - /* ----- Plot 9-11km Inflow Vector ----- */ - nsharpNative.nsharpLib.sr_wind( nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(9000)), - nsharpNative.nsharpLib.ipres(nsharpNative.nsharpLib.msl(11000)), smdir.getValue(), smspd.getValue(), - mnu, mnv, wdir, wspd); - target.drawLine(dispX , dispY, 0.0, dispX + mnu.getValue()* scaleFactor,dispY- mnv.getValue()* scaleFactor, 0.0, NsharpConstants.color_hotpink, - width*2); - - target.drawString(font12, "H", dispX+ mnu.getValue()* scaleFactor, dispY- mnv.getValue()* scaleFactor+ 2*gap, 0.0, - TextStyle.NORMAL, NsharpConstants.color_hotpink, HorizontalAlignment.CENTER, - VerticalAlignment.MIDDLE, null); - - } - private void plotNsharpStormSlinky(IGraphicsTarget target, double zoomLevel, - WGraphics world, Rectangle rect) throws VizException { - /* - * Chin:: NOTE::: - * - * This plotting function is based on the algorithm of plot_vis(),visual1(), vis_xy() - * at xwvid5.c of legacy nsharp source code - * - * This function is dynamically chnaged when user change "storm relative" - * (by click on Hodo graph). Also it uses target.drawCircle. - * With these 2 reasons, wire frame shape is not used. - */ - double dispX, dispY, dispX1, dispY1; - double vyMax = world.getViewYmax(); - double vyMin = world.getViewYmin(); - double vxMax = world.getViewXmax(); - double vxMin = world.getViewXmin(); - - PixelExtent extent = new PixelExtent(rect); - target.setupClippingPlane(extent); - /* ----- Plot Label ----- */ - dispX = vxMin + 15; - dispY = vyMax -20; - target.drawString(font9, "Storm Slinky", dispX, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_yellow, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - //plot X axis - //xScaleAdjustRatio = (world.getViewXmax()-vxMin)/50; - dispY = vyMin + (vyMax - vyMin )/2; - target.drawLine(vxMin , dispY, 0.0, vxMax,dispY, 0.0, NsharpConstants.color_stellblue, - commonLinewidth/4F); - //plot Y axis - dispX = vxMin + (vxMax - vxMin )/2; - target.drawLine(dispX, vyMax, 0.0, dispX,vyMin, 0.0, NsharpConstants.color_stellblue, - commonLinewidth/4F); - - - // ----- Plot storm motion - white line ----- - dispX = vxMin + (vxMax - vxMin )/2; - dispY = vyMin + (vyMax - vyMin )/2; - FloatByReference smdir=new FloatByReference(0), smspd = new FloatByReference(0); - nsharpNative.nsharpLib.get_storm(smspd, smdir); - dispX1 = dispX + nsharpNative.nsharpLib.ucomp( smdir.getValue(), 30.0F) * 2; - dispY1 = dispY - nsharpNative.nsharpLib.vcomp( smdir.getValue(), 30.0F) * 2; - target.drawLine(dispX, dispY, 0.0, dispX1,dispY1, 0.0, NsharpConstants.color_white, - commonLinewidth*2); - - /// ----- Calculate Parcel Data ----- - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - // get parcel data by calling native nsharp parcel() API. value is returned in pcl - _parcel pcl = new _parcel(); - nsharpNative.nsharpLib.parcel( -1.0F, -1.0F, sfcpres, sfctemp, sfcdwpt, pcl); - /* ----- Run Visualization Routine to plot storm ----- */ - NsharpNative.NsharpLibrary.StormSlinkyStr stmSky = new NsharpNative.NsharpLibrary.StormSlinkyStr(); - //call cave_visual1 to get all points that to be plotted - nsharpNative.nsharpLib.cave_visual1( pcl.lfcpres, pcl.elpres, sfcpres, sfctemp, sfcdwpt,stmSky); - //System.out.println(" size = "+ stmSky.getSize()+ " tim ="+ stmSky.getTottim()+ " ang = "+ stmSky.getAngl()); - float tsuv[] = stmSky.getTsuv(); - int colors[] = stmSky.getColor(); - for(int i=0; i < stmSky.getSize(); i++){ - float xfactor, xs, ys; - - xfactor=.015F;// was .01F at legacy code - - xs = (float)dispX + (-tsuv[i*2] * xfactor); - ys = (float)dispY + (-tsuv[i*2+1] * xfactor); - RGB color = stormSlinkyColorMap.get(colors[i]); - - target.drawCircle(xs, ys, 0, 12, - color, markerWidth); - } - //write ang and tottim - dispX = vxMin + 15; - dispY = vyMin + 30; - String s = (int)stmSky.getTottim()+ " s " + (int)stmSky.getAngl() + " deg"; - target.drawString(font11, s, dispX, dispY, 0.0, - TextStyle.NORMAL, NsharpConstants.color_white, HorizontalAlignment.LEFT, - VerticalAlignment.BOTTOM, null); - } - - - - public void addSounding(DataTime dataTime, VerticalSounding sounding) { - - this.dataTimes.add(dataTime); - soundingMap.put(dataTime.getValidTime().getTime(), new SoundingParams( - sounding)); - Collections.sort(this.dataTimes); - } - - public void setSoundingMap(Map map) { - this.soundingMap = new HashMap(); - for (DataTime dt : map.keySet()) { - soundingMap.put(dt.getValidTime().getTime(), map.get(dt)); - } - this.dataTimes.clear(); - this.dataTimes.addAll(map.keySet()); - Collections.sort(this.dataTimes); - - if (this.soundingMap == null) { - this.soundingMap = new HashMap(); - } - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.rsc.capabilities.ITimeSeqResource#setDisplayedDate - * (java.util.Date) - */ - public DataTime getDisplayedDate() { - return displayedSounding; - } - - protected SoundingParams retrieveVerticalSounding(DataTime time) { - if (time == null) { - return null; - } - return soundingMap.get(time.getValidTime().getTime()); - } - - @Override - public String getName() { - String name = "NO DATA"; - SoundingParams sp = this.getSoundingParameters(); - - if (sp != null) { - VerticalSounding vs = sp.getInterleavedData(); - name = vs.getName() + " Skewt"; - if (vs.getDataTime().getLegendString() != null) { - name += " " + vs.getDataTime().getLegendString(); - } - } - - return name; - } - - @Override - public void setDescriptor(NsharpSkewTDescriptor descriptor) { - super.setDescriptor(descriptor); - RGB rgb = ColorUtil.getNewColor(descriptor); - getCapability(ColorableCapability.class).setColor(rgb); - //System.out.println("screwT Rsc setDescriptor called"); - } - - public void setSoundingDate(DataTime dt) { - if (dt == null && this.displayedSounding == null) { - return; - } - if (dt != null && dt.equals(this.displayedSounding)) { - return; - } - this.displayedSounding = dt; - fireListeners(); - } - - public SoundingParams getSoundingParameters() { - SoundingParams sp = this - .retrieveVerticalSounding(this.displayedSounding); - return sp; - } - - /** - * Allows you to grab a sounding from a different time - * - * @param dt - * @return - */ - public SoundingParams getSoundingByDataTime(DataTime dt) { - // find a close time to 24 hours, give 4 hour lee way - SoundingParams sp = this.retrieveVerticalSounding(dt); - return sp; - } - - - @Override - public String inspect(ReferencedCoordinate rCoord) throws VizException { - String s = ""; - try { - } catch (Exception e) { - UFStatus.getHandler().handle(Priority.PROBLEM, "Exception translating coordinate", e); - } - - return s; - } - - /** - * Draw an edit handle - * - * @param target - * @param world - * @param zoomLevel - * @param x - * @param y - * @param color - * @throws VizException - - private void drawEditHandle(IGraphicsTarget target, WGraphics world, - double zoomLevel, double x, double y, RGB color) - throws VizException { - double radius = NsharpConstants.endpointRadius * zoomLevel; - - target.drawShadedRect(new PixelExtent(x - radius, x + radius, y - - radius, y + radius), color, 1.0, null); - }*/ - - public void addListener(ISkewTDataChangedListener listener) { - listenerList.add(listener); - } - - public void removeListener(ISkewTDataChangedListener listener) { - listenerList.remove(listener); - } - - private void fireListeners() { - for (Object listener : listenerList.getListeners()) { - ((ISkewTDataChangedListener) listener).skewTResourceChanged(this); - } - } - - public static interface ISkewTDataChangedListener { - public abstract void skewTResourceChanged(NsharpSkewTResource rsc); - } - - public boolean isPlotInteractiveTemp() { - return plotInteractiveTemp; - } - - - public void setPlotInteractiveTemp(boolean plotInteractiveTemp) { - this.plotInteractiveTemp = plotInteractiveTemp; - } - public void setInteractiveTempPointCoordinate( - Coordinate interactiveTempPointCoordinate) { - //System.out.println("setInteractiveTempPointCoordinate called"); - this.interactiveTempPointCoordinate = interactiveTempPointCoordinate; - plotInteractiveTemp = true; - } - public void setInteractiveHodoPointCoordinate(Coordinate c){ - try { - NcSoundingLayer hodoLayer = soundingLys.get(hodoEditingSoundingLayerIndex); - if(hodoLayer != null){ - //TTR575 - this.dataTimelineSndLysListMap.put(pickedStnInfoStr, this.soundingLys); - nsharpNative.populateSndgData(soundingLys); - //end TTR575 - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - Coordinate c1 = bkRsc.getHodoBackground().getWorld().unMap(c.x, c.y); - //System.out.println("picked pt after unmap CX "+ c1.x + " CY "+ c1.y); - c1 = WxMath.speedDir((float) c1.x, (float) c1.y); - hodoLayer.setWindSpeed((float)c1.x); - hodoLayer.setWindDirection((float)c1.y); - createRscHodoWindShapeAll(); - //createTurbulenceShapes(bkRsc.getTurbBackground().getWorld()); - } - } - catch(Exception e) { - - } - } - public void applyInteractiveTempPoint(){ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - Coordinate inC = NsharpWxMath.reverseSkewTXY(bkRsc.getSkewTBackground().getWorld().unMap(interactiveTempPointCoordinate)); - double inTemp = inC.x; - //System.out.println("applyInteractiveTempPoint called pressure " + inC.y + " temp "+ inTemp + - // " currentTempCurveType " + currentTempCurveType + " currentSoundingLayer index="+currentSoundingLayer); - NcSoundingLayer layer = this.soundingLys.get(currentSoundingLayerIndex); - if(currentTempCurveType == TEMP_TYPE){ - if(inTemp < layer.getDewpoint()) - // temp can not be lower than dew point - layer.setTemperature(layer.getDewpoint()); - else - layer.setTemperature((float)inTemp); - } - else{ - if(inTemp > layer.getTemperature()) - // dew point can not be higher than temp - layer.setDewpoint(layer.getTemperature()); - else - layer.setDewpoint((float)inTemp); - } - - - this.dataTimelineSndLysListMap.put(pickedStnInfoStr, this.soundingLys); - //re-populate snd data to nsharp native code lib for later calculating - nsharpNative.populateSndgData(soundingLys); - //get storm motion wind data after populate sounding from NsharpLib - createRscPressTempCurveShapeAll(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - createRscwetBulbTraceShape(WGc); - createRscVTempTraceShape(WGc); - if(parcelTraceRscShapeList.size()>0){ - for(IWireframeShape shape: parcelTraceRscShapeList){ - shape.dispose(); - } - parcelTraceRscShapeList.clear(); - - } - for (ParcelData parData: parcelList){ - createRscParcelTraceShape( WGc, parData.parcelType,parData.parcelLayerPressure); - } - } - - public void applySfcEditing(float tp, float dp, float ws, float wd, float pressure){ - //NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - currentSoundingLayerIndex =nsharpNative.nsharpLib.sfc(); - NcSoundingLayer layer = this.soundingLys.get(currentSoundingLayerIndex); - layer.setTemperature(tp); - layer.setDewpoint(dp); - layer.setWindDirection(wd); - layer.setWindSpeed(ws); - layer.setPressure(pressure); - this.dataTimelineSndLysListMap.put(pickedStnInfoStr, this.soundingLys); - //re-populate snd data to nsharp native code lib for later calculating - nsharpNative.populateSndgData(soundingLys); - } - public void updateLayer(int layerIndex, float tp, float dp, float ws, float wd, float pressure){ - if(layerIndex <0 || layerIndex >= soundingLys.size()) - return; - //NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - - currentSoundingLayerIndex =layerIndex; - NcSoundingLayer layer = soundingLys.get(currentSoundingLayerIndex); - layer.setGeoHeight(nsharpNative.nsharpLib.ihght(pressure)); - layer.setTemperature(tp); - layer.setDewpoint(dp); - layer.setWindDirection(wd); - layer.setWindSpeed(ws); - layer.setPressure(pressure); - this.dataTimelineSndLysListMap.put(pickedStnInfoStr, soundingLys); - //re-populate snd data to nsharp native code lib for later calculating - Collections.sort(soundingLys,NsharpDataHandling.reversePressureHeightWindComparator()); - nsharpNative.populateSndgData(soundingLys); - //get storm motion wind data after populate sounding from NsharpLib - //refresh test area if it is shown now - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - createRscWireFrameShapes(); - } - public void addNewLayer(float tp, float dp, float ws, float wd, float pressure){ - //NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - //currentSoundingLayer =layerIndex; - NcSoundingLayer layer = new NcSoundingLayer(); - layer.setGeoHeight(nsharpNative.nsharpLib.ihght(pressure)); - layer.setTemperature(tp); - layer.setDewpoint(dp); - layer.setWindDirection(wd); - layer.setWindSpeed(ws); - layer.setPressure(pressure); - soundingLys.add(layer); - this.dataTimelineSndLysListMap.put(pickedStnInfoStr, soundingLys); - //re-populate snd data to nsharp native code lib for later calculating - Collections.sort(soundingLys,NsharpDataHandling.reversePressureHeightWindComparator()); - nsharpNative.populateSndgData(soundingLys); - //get storm motion wind data after populate sounding from NsharpLib - //refresh text area if it is shown now - NsharpShowTextDialog textarea = NsharpShowTextDialog.getAccess(); - if(textarea != null){ - textarea.refreshTextData(); - } - createRscWireFrameShapes(); - } - - - private void disposeAllWireFrameShapes(){ - disposeRscWireFrameShapes(); - //also dispose static background shpae - if(omegaBkgShape!=null) - omegaBkgShape.dispose(); - - if(windBoxBkgShape!=null) - windBoxBkgShape.dispose(); - - if(hodoWindMotionBoxShape!=null) - hodoWindMotionBoxShape.dispose(); - } - private void disposeRscWireFrameShapes(){ - if(heightMarkRscShape!=null){ - heightMarkRscShape.dispose(); - heightMarkRscShape=null; - } - if(omegaRscShape!=null){ - omegaRscShape.dispose(); - omegaRscShape=null; - } - if(wetBulbTraceRscShape!=null){ - wetBulbTraceRscShape.dispose(); - wetBulbTraceRscShape=null; - } - if(vtempTraceCurveRscShape!=null){ - vtempTraceCurveRscShape.dispose(); - vtempTraceCurveRscShape=null; - } - if(thetaEPressureYRscShape!=null){ - thetaEPressureYRscShape.dispose(); - thetaEPressureYRscShape=null; - } - if(thetaEPressureRRscShape!=null){ - thetaEPressureRRscShape.dispose(); - thetaEPressureRRscShape=null; - } - if(thetaEPressureWRscShape!=null){ - thetaEPressureWRscShape.dispose(); - thetaEPressureWRscShape=null; - } - if(thetaEHeightYRscShape!=null){ - thetaEHeightYRscShape.dispose(); - thetaEHeightYRscShape=null; - } - if(thetaEHeightWRscShape!=null){ - thetaEHeightWRscShape.dispose(); - thetaEHeightWRscShape=null; - } - if(thetaEHeightRRscShape!=null){ - thetaEHeightRRscShape.dispose(); - thetaEHeightRRscShape=null; - } - if(srWindBRscShape!=null){ - srWindBRscShape.dispose(); - srWindBRscShape=null; - } - if(srWindWRscShape!=null){ - srWindWRscShape.dispose(); - srWindWRscShape=null; - } - if(srWindRRscShape!=null){ - srWindRRscShape.dispose(); - srWindRRscShape=null; - } - if(srWindGRscShape!=null){ - srWindGRscShape.dispose(); - srWindGRscShape=null; - } - if(srWindMRscShape!=null){ - srWindMRscShape.dispose(); - srWindMRscShape=null; - } - if(psblWatchTypeBkgShape!=null){ - psblWatchTypeBkgShape.dispose(); - psblWatchTypeBkgShape=null; - } - if(verticalWindSbShape!=null){ - verticalWindSbShape.dispose(); - verticalWindSbShape=null; - } - if(verticalWindLabelShape!=null){ - verticalWindLabelShape.dispose(); - verticalWindLabelShape=null; - } - if(verticalWindRShape!=null){ - verticalWindRShape.dispose(); - verticalWindRShape=null; - } - if(cloudFMShape!=null){ - cloudFMShape.dispose(); - cloudFMShape=null; - } - if(cloudCEShape!=null){ - cloudCEShape.dispose(); - cloudCEShape=null; - } - if(cloudFMLabelShape!=null){ - cloudFMLabelShape.dispose(); - cloudFMLabelShape=null; - } - if(icingTempShape!=null){ - icingTempShape.dispose(); - icingTempShape= null; - } - if(icingRHShape!=null){ - icingRHShape.dispose(); - icingRHShape=null; - } - if(icingEPIShape!=null){ - icingEPIShape.dispose(); - icingEPIShape=null; - } - if(turbWindShearShape!=null){ - turbWindShearShape.dispose(); - turbWindShearShape=null; - } - if(turbLnShape!=null){ - turbLnShape.dispose(); - turbLnShape=null; - } - if(parcelTraceRscShapeList.size()>0){ - for(IWireframeShape shape: parcelTraceRscShapeList){ - shape.dispose(); - } - parcelTraceRscShapeList.clear(); - - } - if(hodoWindRscShapeList.size()>0){ - for(ShapeAndLineProperty shapeColor: hodoWindRscShapeList){ - shapeColor.shape.dispose(); - } - hodoWindRscShapeList.clear(); - - } - if(pressureTempRscShapeList.size()>0){ - for(ShapeAndLineProperty shapeColor: pressureTempRscShapeList){ - shapeColor.shape.dispose(); - } - pressureTempRscShapeList.clear(); - - } - if(windBoxWindRscShapeList.size()>0){ - for(ShapeAndLineProperty shapeColor: windBoxWindRscShapeList){ - shapeColor.shape.dispose(); - } - windBoxWindRscShapeList.clear(); - - } - } - private void createRscVTempTraceShape(WGraphics world){ - if((soundingLys == null) || (soundingLys.size()==0)) - return; - float t1; - if(vtempTraceCurveRscShape!=null){ - vtempTraceCurveRscShape.dispose(); - vtempTraceCurveRscShape=null; - } - - Coordinate c2 = null; - Coordinate c1; - // draw trace - vtempTraceCurveRscShape = target.createWireframeShape(false,descriptor ); - vtempTraceCurveRscShape.allocate(this.soundingLys.size() * 2); - for (NcSoundingLayer layer : this.soundingLys) { - if ((layer.getTemperature() != INVALID_DATA) && (layer.getDewpoint() != INVALID_DATA) && layer.getPressure()>= 100){ - t1 = nsharpNative.nsharpLib.ivtmp(layer.getPressure()); - - c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - if(c2!= null){ - //target.drawLine(c1.x, c1.y, 0.0, c2.x, c2.y, 0.0, color, - // lineWidth, LineStyle.DASHED); - double [][] lines = {{c1.x, c1.y},{c2.x, c2.y}}; - vtempTraceCurveRscShape.addLineSegment(lines); - } - c2 = c1; - } - } - vtempTraceCurveRscShape.compile(); - } - - /* - * Chin:: NOTE::: - * This plotting function is based on the algorithm of draw_Clouds() at xwvid1.c of AWC Nsharp source code - * Using Fred Mosher's Algorithm & Chernykh and Eskridge Algorithm - * - */ - private void createCloudsShape(WGraphics world) { - NsharpNative.NsharpLibrary.CloudInfoStr cloudInfo = new NsharpNative.NsharpLibrary.CloudInfoStr(); - nsharpNative.nsharpLib.draw_Clouds(cloudInfo); - // draw FM model: Fred Mosher's Algorithm - if(cloudInfo.getSizeFM() > 0){ - cloudFMShape = target.createShadedShape(false, descriptor, false); - cloudFMLabelShape = target.createWireframeShape(false,descriptor ); - cloudFMLabelShape.allocate(2); - double [][] lines = {{0, 0},{0,0}}; - cloudFMLabelShape.addLineSegment(lines); - for (int i=0; i < cloudInfo.getSizeFM() ; i++){ - double lowY = world.mapY(NsharpWxMath.getSkewTXY(cloudInfo.getPreStartFM()[i], -50).y); - double highY = world.mapY(NsharpWxMath.getSkewTXY(cloudInfo.getPreEndFM()[i], -50).y); - Coordinate[] coords = new Coordinate[4]; - coords[0] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+150, lowY); - coords[1] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+200, lowY); - coords[2] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+200, highY); - coords[3] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+150, highY); - - /* - * Create LineString[] from Coordinates[] - */ - GeometryFactory gf = new GeometryFactory(); - LineString[] ls = new LineString[] { gf.createLineString(coords) }; - - cloudFMShape.addPolygonPixelSpace(ls, NsharpConstants.color_yellow); - double [] lblXy = { NsharpConstants.SKEWT_REC_X_ORIG+175, (lowY+highY)/2}; - cloudFMLabelShape.addLabel(NsharpNative.NsharpLibrary.CLOUD_TYPE[cloudInfo.cloudTypeFM[i]], lblXy); - } - cloudFMShape.compile(); - cloudFMLabelShape.compile(); - } - // draw CE model : Chernykh and Eskridge Algorithm - if(cloudInfo.getSizeCE() > 0){ - cloudCEShape = target.createShadedShape(false, descriptor, false); - - for (int i=0; i < cloudInfo.getSizeCE() ; i++){ - double lowY = world.mapY(NsharpWxMath.getSkewTXY(cloudInfo.getPreStartCE()[i], -50).y); - double highY = world.mapY(NsharpWxMath.getSkewTXY(cloudInfo.getPreEndCE()[i], -50).y); - Coordinate[] coords = new Coordinate[4]; - coords[0] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+100, lowY); - coords[1] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+150, lowY); - coords[2] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+150, highY); - coords[3] = new Coordinate(NsharpConstants.SKEWT_REC_X_ORIG+100, highY); - - /* - * Create LineString[] from Coordinates[] - */ - GeometryFactory gf = new GeometryFactory(); - LineString[] ls = new LineString[] { gf.createLineString(coords) }; - - cloudCEShape.addPolygonPixelSpace(ls, NsharpConstants.color_red); - - } - cloudCEShape.compile(); - - } - } - - /* - * Chin:: NOTE::: - * This plotting function is based on the algorithm of plot_advectionprofile() at xwvid5.c of Bignsharp source code - * - */ - private void createRscVerticalWindShape(WGraphics world){ - //double origX = NsharpConstants.VERTICAL_WIND_X_ORIG; - double y1, y2, x1,x2;//,origY; - //float xRatio = ((float)NsharpConstants.WIND_BOX_WIDTH) / 140.00F; - verticalWindLabelShape = target.createWireframeShape(false,descriptor ); - verticalWindLabelShape.allocate(2); - // add a virtual line to make wire frame shape worked when there is only strings in shape - double [][] lines = {{0, 0},{0,0}}; - verticalWindLabelShape.addLineSegment(lines); - double [] lblXy = { NsharpConstants.VERTICAL_WIND_X_ORIG+NsharpConstants.VERTICAL_WIND_WIDTH/2, NsharpConstants.VERTICAL_WIND_Y_ORIG+35}; - verticalWindLabelShape.addLabel("Inferred Temp", lblXy); - double [] lblXy1 = { NsharpConstants.VERTICAL_WIND_X_ORIG+NsharpConstants.VERTICAL_WIND_WIDTH/2, NsharpConstants.VERTICAL_WIND_Y_ORIG+65}; - verticalWindLabelShape.addLabel("Advection", lblXy1); - double [] lblXy2 = { NsharpConstants.VERTICAL_WIND_X_ORIG+NsharpConstants.VERTICAL_WIND_WIDTH/2, NsharpConstants.VERTICAL_WIND_Y_ORIG+95}; - verticalWindLabelShape.addLabel("(C/hr)", lblXy2); - - verticalWindSbShape = target.createWireframeShape(false,descriptor ); - verticalWindSbShape.allocate(72); - verticalWindRShape = target.createWireframeShape(false,descriptor ); - verticalWindRShape.allocate(72); - FloatByReference dummy1= new FloatByReference(-999); - FloatByReference dummy2= new FloatByReference(-999); - FloatByReference Surfpressure = new FloatByReference(-999); - nsharpNative.nsharpLib.get_surface(Surfpressure, dummy1, dummy2); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - if(nsharpNative.nsharpLib.qc(Surfpressure.getValue()) == 1) { - float advt; - x1 = NsharpConstants.VERTICAL_WIND_X_ORIG+ (NsharpConstants.VERTICAL_WIND_WIDTH/2); - for (float pressure=Surfpressure.getValue(); pressure>=200; pressure-=100) { - y1 = NsharpWxMath.getSkewTXY(pressure, 0).y; - y1=WGc.mapY(y1); - y2 = NsharpWxMath.getSkewTXY(pressure-100, 0).y; - y2=WGc.mapY(y2); - advt = nsharpNative.nsharpLib.advection_layer(dummy1, pressure, pressure - 100); - //System.out.println("advt="+advt); - if(advt <= NsharpNativeConstants.NSHARP_LEGACY_LIB_INVALID_DATA) - continue; - - x2 = x1+advt*15; - double [][] lines1 = {{x1,y1},{x1,y2}}; - double [][] lines2 = {{x1,y1},{x2,y1}}; - double [][] lines3 = {{x2,y2},{x1,y2}}; - double [][] lines4 = {{x2,y2},{x2,y1}}; - String advtStr = String.format( "%.1f", advt); - if(advt > 0.0f){ - verticalWindRShape.addLineSegment(lines1); - verticalWindRShape.addLineSegment(lines2); - verticalWindRShape.addLineSegment(lines3); - verticalWindRShape.addLineSegment(lines4); - double [] advtLblXy = { x1+40, y2+ (y1-y2)/2}; - verticalWindRShape.addLabel(advtStr, advtLblXy); - } - else { - verticalWindSbShape.addLineSegment(lines1); - verticalWindSbShape.addLineSegment(lines2); - verticalWindSbShape.addLineSegment(lines3); - verticalWindSbShape.addLineSegment(lines4); - double [] advtLblXy = { x1-40,y2+ (y1-y2)/2}; - verticalWindSbShape.addLabel(advtStr, advtLblXy); - } - - } - } - verticalWindSbShape.compile(); - verticalWindRShape.compile(); - verticalWindLabelShape.compile(); - } - private void createRscWindBoxWindShape(WGraphics world){ - double windBoxX = NsharpConstants.WIND_BOX_X_ORIG; - //float lastHeight = -999; - double windY, windBoxY; - float xRatio = ((float)NsharpConstants.WIND_BOX_WIDTH) / 140.00F; - ShapeAndLineProperty shNcolor = new ShapeAndLineProperty(); - IWireframeShape shapeR = shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeR.allocate(soundingLys.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_red); - windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - IWireframeShape shapeG= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeG.allocate(soundingLys.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_green); - windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - IWireframeShape shapeY= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeY.allocate(soundingLys.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_yellow); - windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - IWireframeShape shapeC= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeC.allocate(soundingLys.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_cyan); - windBoxWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - IWireframeShape shapeV = shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeV.allocate(soundingLys.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_violet); - windBoxWindRscShapeList.add(shNcolor); - for (NcSoundingLayer layer : soundingLys) { - float pressure = layer.getPressure(); - float spd = layer.getWindSpeed(); - if ( pressure < 100 || spd < 0 ) { - continue; - } - if(spd > 140) - spd = 140; - // Get the vertical ordinate. - windY = NsharpWxMath.getSkewTXY(pressure, 0).y; - - //plot wind speed vs height in the wind box - windBoxY = world.mapY(windY); - float geoHt = layer.getGeoHeight(); - double [][] lines = {{windBoxX, windBoxY},{windBoxX + (spd) * xRatio,windBoxY}}; - if(geoHt <3000) - shapeR.addLineSegment(lines); - else if(geoHt < 6000) - shapeG.addLineSegment(lines); - else if(geoHt < 9000) - shapeY.addLineSegment(lines); - else if(geoHt < 12000) - shapeC.addLineSegment(lines); - else - shapeV.addLineSegment(lines); - if(spd > 140) - spd = 140; - - //lastHeight = layer.getGeoHeight(); - } - shapeR.compile(); - shapeG.compile(); - shapeY.compile(); - shapeV.compile(); - shapeC.compile(); - } - private void createRscHodoWindShape(WGraphics world, List soundingLays, RGB incolor){ - - Coordinate c0 = null; - Coordinate c1; - ShapeAndLineProperty shNcolor; - IWireframeShape shapeR=null, shapeG=null, shapeY=null, shapeC=null, shapeV=null, shapeIn=null; - if(incolor == null){ - //creating regular Hodo shape with 5 colors - shNcolor = new ShapeAndLineProperty(); - shapeR = shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeR.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_red); - hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - shapeG= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeG.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_green); - hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - shapeY= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeY.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_yellow); - hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - shapeC= shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeC.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_cyan); - hodoWindRscShapeList.add(shNcolor); - shNcolor = new ShapeAndLineProperty(); - shapeV = shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeV.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(NsharpConstants.color_violet); - hodoWindRscShapeList.add(shNcolor); - } - else{ - shNcolor = new ShapeAndLineProperty(); - shapeIn = shNcolor.shape = target.createWireframeShape(false,descriptor ); - shapeIn.allocate(soundingLays.size()*2); - shNcolor.lp.setLineColor(incolor); - hodoWindRscShapeList.add(shNcolor); - } - - - for (NcSoundingLayer layer : soundingLays){ - if(layer.getPressure() < 100 || layer.getWindSpeed() <0) - continue; - float wspd = layer.getWindSpeed(); - float wdir = layer.getWindDirection(); - c1 = WxMath.uvComp(wspd, wdir); - if (c0 != null) { - double [][] lines = {{world.mapX(c0.x), world.mapY(c0.y)},{world - .mapX(c1.x), world.mapY(c1.y)}}; - if(incolor == null){ - if(layer.getGeoHeight() 0){ - for(ShapeAndLineProperty shapeColor: pressureTempRscShapeList){ - shapeColor.shape.dispose(); - } - pressureTempRscShapeList.clear(); - } - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc= bkRsc.getSkewTBackground().getWorld(); - - if(compareStnIsOn && currentTimeLineStateListIndex >=0){ - int colorIndex =NsharpConstants.LINE_COMP1; - for(NsharpStationStateProperty elm: stnStateList) { - if(elm.stnState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(stnStateList.indexOf(elm)).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - List soundingLayeys = dataTimelineSndLysListMap.get(stnTimeTable.get(stnStateList.indexOf(elm)).get(currentTimeLineStateListIndex).elementDescription); - NsharpLineProperty lp = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]); - colorIndex++; - if(colorIndex > NsharpConstants.LINE_COMP10) - colorIndex =NsharpConstants.LINE_COMP1; - createRscPressTempCurveShape(WGc, soundingLayeys, lp); - } - } - } - else if(compareTmIsOn && currentStnStateListIndex >=0 ){ - int colorIndex =NsharpConstants.LINE_COMP1; - for(NsharpTimeLineStateProperty elm: timeLineStateList) { - if(elm.timeState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(timeLineStateList.indexOf(elm)).elementState == NsharpConstants.State.AVAIL){ - List soundingLayeys = dataTimelineSndLysListMap.get(stnTimeTable.get(currentStnStateListIndex).get(timeLineStateList.indexOf(elm)).elementDescription); - NsharpLineProperty lp = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]); - colorIndex++; - if(colorIndex > NsharpConstants.LINE_COMP10) - colorIndex =NsharpConstants.LINE_COMP1; - createRscPressTempCurveShape(WGc, soundingLayeys, lp); - } - } - } - else if(overlayIsOn == true ){ - createRscPressTempCurveShape(WGc, this.soundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1])); - if(this.previousSoundingLys!=null && !previousSoundingLys.equals(soundingLys)){ - createRscPressTempCurveShape(WGc, this.previousSoundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2])); - } - - } - else { - createRscPressTempCurveShape(WGc, this.soundingLys, null); - } - } - - public void createRscHodoWindShapeAll(){ - if(hodoWindRscShapeList.size()>0){ - for(ShapeAndLineProperty shapeColor: hodoWindRscShapeList){ - shapeColor.shape.dispose(); - } - hodoWindRscShapeList.clear(); - } - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc= bkRsc.getHodoBackground().getWorld(); - if(compareStnIsOn && currentTimeLineStateListIndex >=0){ - int colorIndex =NsharpConstants.LINE_COMP1; - for(NsharpStationStateProperty elm: stnStateList) { - if(elm.stnState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(stnStateList.indexOf(elm)).get(currentTimeLineStateListIndex).elementState == NsharpConstants.State.AVAIL){ - List soundingLayeys = dataTimelineSndLysListMap.get(stnTimeTable.get(stnStateList.indexOf(elm)).get(currentTimeLineStateListIndex).elementDescription); - RGB color = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]).getLineColor(); - colorIndex++; - if(colorIndex > NsharpConstants.LINE_COMP10) - colorIndex =NsharpConstants.LINE_COMP1; - createRscHodoWindShape(WGc, soundingLayeys, color); - } - } - } - else if(compareTmIsOn && currentStnStateListIndex >=0 ){ - int colorIndex =NsharpConstants.LINE_COMP1; - for(NsharpTimeLineStateProperty elm: timeLineStateList) { - if(elm.timeState == NsharpConstants.State.ACTIVE && - stnTimeTable.get(currentStnStateListIndex).get(timeLineStateList.indexOf(elm)).elementState == NsharpConstants.State.AVAIL){ - List soundingLayeys = dataTimelineSndLysListMap.get(stnTimeTable.get(currentStnStateListIndex).get(timeLineStateList.indexOf(elm)).elementDescription); - RGB color = linePropertyMap.get(NsharpConstants.lineNameArray[colorIndex]).getLineColor(); - colorIndex++; - if(colorIndex > NsharpConstants.LINE_COMP10) - colorIndex =NsharpConstants.LINE_COMP1; - createRscHodoWindShape(WGc, soundingLayeys, color); - } - } - } - else if(overlayIsOn == true && this.previousSoundingLys!=null){ - createRscHodoWindShape(WGc, this.soundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY1]).getLineColor()); - if(!previousSoundingLys.equals(soundingLys)) - createRscHodoWindShape(WGc, this.previousSoundingLys, linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_OVERLAY2]).getLineColor()); - } - else { - createRscHodoWindShape(WGc, this.soundingLys, null); - } - - } - private void createRscParcelTraceShape(WGraphics world, short parcelType, float userPre){ - //System.out.println("createRscParcelTraceShape called defoine_parcel pType="+parcelType+" pre="+ userPre); - IWireframeShape shape = target.createWireframeShape(false,descriptor ); - shape.allocate(40); - //call native define_parcel() with parcel type and user defined pressure (if user defined it) - nsharpNative.nsharpLib.define_parcel(parcelType,userPre); - - _lplvalues lpvls = new _lplvalues(); - nsharpNative.nsharpLib.get_lpvaluesData(lpvls); - - float sfctemp, sfcdwpt, sfcpres; - sfctemp = lpvls.temp; - sfcdwpt = lpvls.dwpt; - sfcpres = lpvls.pres; - - float vtemp = nsharpNative.nsharpLib.virtemp (sfcpres, sfctemp, sfcdwpt); - Coordinate c1 = NsharpWxMath.getSkewTXY(sfcpres, vtemp); - c1.x = world.mapX(c1.x); - c1.y = world.mapY(c1.y); - FloatByReference p2 = new FloatByReference(0), t2 = new FloatByReference(0);; - nsharpNative.nsharpLib.drylift (sfcpres, sfctemp, sfcdwpt, p2, t2); - vtemp = nsharpNative.nsharpLib.virtemp (p2.getValue(), t2.getValue(), t2.getValue()); - Coordinate c2 = NsharpWxMath.getSkewTXY(p2.getValue(), vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - double [][] lines = {{c1.x, c1.y},{c2.x, c2.y}}; - shape.addLineSegment(lines); - - c1 = c2; - - - float t3; - for (float i = p2.getValue() - 50; i >= 100; i = i - 50) - { - t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), i); - vtemp = nsharpNative.nsharpLib.virtemp (i, t3, t3); - c2 = NsharpWxMath.getSkewTXY(i, vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - double [][] lines1 = {{c1.x, c1.y},{c2.x, c2.y}}; - shape.addLineSegment(lines1); - - c1 = c2; - } - - t3 = nsharpNative.nsharpLib.wetlift (p2.getValue(), t2.getValue(), 100); - vtemp = nsharpNative.nsharpLib.virtemp (100, t3, t3); - c2 = NsharpWxMath.getSkewTXY(100, vtemp); - c2.x = world.mapX(c2.x); - c2.y = world.mapY(c2.y); - - double [][] lines2 = {{c1.x, c1.y},{c2.x, c2.y}}; - shape.addLineSegment(lines2); - - shape.compile(); - - parcelTraceRscShapeList.add(shape); - - } - private void createBkgPsblWatchShape(WGraphics world){ - String wwtypeStr; - //System.out.println("createBkgPsblWatchShape called"); - - double dispX, dispY; - //int width = getCapability(OutlineCapability.class).getOutlineWidth(); - /* ----- Plot Label ----- */ - dispX = world.getViewXmin() + 130; - dispY = world.getViewYmin() + 30; - if(psblWatchTypeBkgShape!=null){ - psblWatchTypeBkgShape.dispose(); - psblWatchTypeBkgShape = null; - } - psblWatchTypeBkgShape = target.createWireframeShape(false,descriptor ); - psblWatchTypeBkgShape.allocate(4); - double [] lblXy = { dispX, dispY}; - psblWatchTypeBkgShape.addLabel("Psbl Watch Type", lblXy); - double [] lblXy1 = {dispX, dispY+150}; - if(soundingLys == null){ - wwtypeStr = "NONE"; - wwTypeColor = NsharpConstants.color_gold; - } - else { - int wwtype = nsharpNative.nsharpLib.cave_ww_type(); - - //System.out.println("ww type="+ wwtype); - //See nsharpNative.nsharpLib.cave_ww_type() for returned wwtype definitions - switch(wwtype){ - case 1: - wwtypeStr = "MRGL SVR"; - wwTypeColor = NsharpConstants.color_skyblue; - break; - case 2: - wwtypeStr = "SVR"; - wwTypeColor = NsharpConstants.color_cyan; - break; - case 3: - wwtypeStr = "MRGL TOR"; - wwTypeColor = NsharpConstants.color_red; - break; - case 4: - wwtypeStr = "TOR"; - wwTypeColor = NsharpConstants.color_red; - break; - case 5: - wwtypeStr = "PDS TOR"; - wwTypeColor = NsharpConstants.color_magenta; - break; - default: - wwtypeStr = "NONE"; - wwTypeColor = NsharpConstants.color_gold; - break; - } - } - psblWatchTypeBkgShape.addLabel(wwtypeStr, lblXy1); - double [][] lines = {{world.getViewXmin(), dispY+10},{world.getViewXmax(), dispY+10}}; - psblWatchTypeBkgShape.addLineSegment(lines); - psblWatchTypeBkgShape.compile(); - } - private void createHodoWindMotionBoxShape(/*WGraphics world*/){ - hodoWindMotionBoxShape = target.createWireframeShape(false,descriptor ); - hodoWindMotionBoxShape.allocate(12); - double xOri = NsharpConstants.WIND_MOTION_REC_X_ORIG; - double yOri = NsharpConstants.WIND_MOTION_REC_Y_ORIG; - double xEnd= NsharpConstants.WIND_MOTION_REC_X_ORIG + NsharpConstants.WIND_MOTION_REC_WIDTH; - double yEnd = NsharpConstants.WIND_MOTION_REC_Y_ORIG + NsharpConstants.WIND_MOTION_REC_HEIGHT; - double ygap = NsharpConstants.WIND_MOTION_REC_HEIGHT/3; - double [][] lines1 = {{xOri, yOri},{xEnd, yOri}}; - hodoWindMotionBoxShape.addLineSegment(lines1); - double [][] lines2 = {{xOri, yOri+ygap},{xEnd, yOri+ygap}}; - hodoWindMotionBoxShape.addLineSegment(lines2); - double [][] lines3 = {{xOri, yOri+2*ygap},{xEnd, yOri+2*ygap}}; - hodoWindMotionBoxShape.addLineSegment(lines3); - double [][] lines4 = {{xOri, yEnd},{xEnd, yEnd}}; - hodoWindMotionBoxShape.addLineSegment(lines4); - double [][] lines5 = {{xOri, yOri},{xOri, yEnd}}; - hodoWindMotionBoxShape.addLineSegment(lines5); - double [][] lines6 = {{xEnd, yOri},{xEnd, yEnd}}; - hodoWindMotionBoxShape.addLineSegment(lines6); - } - private void createBkgWindBoxShape(WGraphics world){ - windBoxBkgShape = target.createWireframeShape(false,descriptor ); - windBoxBkgShape.allocate(30); - double xOri = NsharpConstants.WIND_BOX_X_ORIG; - double yOri = NsharpConstants.WIND_BOX_Y_ORIG; - int tickLength = 5; - double [][] lines = {{xOri - tickLength, yOri},{xOri+NsharpConstants.WIND_BOX_WIDTH, yOri}}; - windBoxBkgShape.addLineSegment(lines); - double [][] lines1 = {{xOri - tickLength, yOri + NsharpConstants.WIND_BOX_HEIGHT},{xOri+NsharpConstants.WIND_BOX_WIDTH, yOri+ NsharpConstants.WIND_BOX_HEIGHT}}; - windBoxBkgShape.addLineSegment(lines1); - double [] lblXy = {NsharpConstants.WIND_BOX_X_ORIG+130, yOri+35}; - windBoxBkgShape.addLabel("wind(kt) ", lblXy); - double [] lblXy1 = {NsharpConstants.WIND_BOX_X_ORIG+130, yOri+65}; - windBoxBkgShape.addLabel("vs Ht ", lblXy1); - double y0 = 0; - - - //draw lowest layer's height in meter and feet, line - y0 = world.mapY(NsharpWxMath.getSkewTXY(1050, 0).y); - - - // draw wind speed vs height box - double xtemp; - for (int i = 0; i < 140 ; i= i+20){ - xtemp = xOri + (NsharpConstants.WIND_BOX_WIDTH/7) * (i /20); - double [][] lines2 = {{xtemp, yOri},{xtemp, yOri+NsharpConstants.WIND_BOX_HEIGHT}}; - windBoxBkgShape.addLineSegment(lines2); - if( (i==20) || (i==60) || (i==100)){ - double [] lblXy2 = {xtemp, y0+ 20}; - windBoxBkgShape.addLabel(String.format("%d",i), lblXy2); - } - - } - windBoxBkgShape.compile(); - } - private void createBkgOmegaShape(){ - double xAxisOrigin=NsharpConstants.OMEGA_X_TOP, yTop=NsharpConstants.OMEGA_Y_TOP, yBot=NsharpConstants.OMEGA_Y_BOT; - //draw label and vertical lines - omegaBkgShape = target.createWireframeShape(false,descriptor ); - omegaBkgShape.allocate(6); - //Note: at X-axis, 40 units on skewT map will equal to 10 units of Omega length - //we dont really care about temp, as we use pressure for Y axis. - // For X-axis, we will convert it propotionally. - //left dash line, +10 omega line - // double [][] lines = {{xAxisOrigin, yTop},{xAxisOrigin, yBot}}; - //omegaBkgShape.addLineSegment(lines); - //center line - double [][] lines1 = {{xAxisOrigin+40, yTop},{xAxisOrigin+40, yBot}}; - omegaBkgShape.addLineSegment(lines1); - //right dash line, -10 omega line - //double [][] lines2 = {{xAxisOrigin+80, yTop},{xAxisOrigin+80, yBot}}; - // omegaBkgShape.addLineSegment(lines2); - double [] lblXy = {xAxisOrigin+40, yTop-40}; - omegaBkgShape.addLabel("OMEGA", lblXy); - double [] lblXy1 = {xAxisOrigin, yTop-5}; - omegaBkgShape.addLabel("+10", lblXy1); - double [] lblXy2 = {xAxisOrigin+80, yTop-5}; - omegaBkgShape.addLabel("-10", lblXy2); - omegaBkgShape.compile(); - - } - private void createRscSrWindShape(WGraphics world){ - /* - * Chin:: NOTE::: - * - * This plotting function is based on the algorithm of plot_vertsrw() at xwvid5.c of native nsharp source code - * - */ - double dispX, dispY, dispX1, dispY1; - double xScaleAdjustRatio, yScaleAdjustRatio; - double bothgt,tophgt; - double vyMax = world.getViewYmax(); - double vyMin = world.getViewYmin(); - double vxMax = world.getViewXmax(); - double vxMin = world.getViewXmin(); - /* ----- Set Layer (AGL) ----- */ - bothgt = 0; - tophgt = 16000; - if(srWindBRscShape!=null) - srWindBRscShape.dispose(); - if(srWindWRscShape!=null) - srWindWRscShape.dispose(); - if(srWindRRscShape!=null) - srWindRRscShape.dispose(); - if(srWindGRscShape!=null) - srWindGRscShape.dispose(); - if(srWindMRscShape!=null) - srWindMRscShape.dispose(); - srWindBRscShape = target.createWireframeShape(false,descriptor ); - srWindBRscShape.allocate(2); - srWindRRscShape = target.createWireframeShape(false,descriptor ); - srWindRRscShape.allocate(250); - srWindWRscShape= target.createWireframeShape(false,descriptor ); - srWindWRscShape.allocate(250); - srWindGRscShape = target.createWireframeShape(false,descriptor ); - srWindGRscShape.allocate(2); - srWindMRscShape= target.createWireframeShape(false,descriptor ); - srWindMRscShape.allocate(250); - /* ----- Plot Label ----- */ - dispX = vxMin + 50; - dispY = vyMin+30; - double [] lblXy = { vxMin + (vxMax-vxMin)/2, dispY}; - srWindWRscShape.addLabel("SR Winds (kt) vs Height", lblXy); - - /* ----- Plot height legend ----- */ - // 2 = 2000 m - int yNum = 0; - for(double h=0; h<=vyMax-vyMin; h += (vyMax-vyMin)/8) - { - dispY = vyMax - h; - dispX = vxMin; - double [][] lines = {{dispX, dispY},{dispX+20,dispY}}; - srWindWRscShape.addLineSegment(lines); - if(h> 0 && h0 && h = 500) && (nsharpNative.nsharpLib.qc(lys.getDewpoint()) !=0 )){ - thetaE = nsharpNative.nsharpLib.thetae( lys.getPressure(), lys.getTemperature(),lys.getDewpoint())-cthe; - dispX = xAxisCenter + ( thetaE * xScaleAdjustRatio); - dispY = vyMax - (nsharpNative.nsharpLib.agl(lys.getGeoHeight()) * yScaleAdjustRatio) ; - - if(dispX1 == -999) { - dispX1 = dispX; - dispY1 = dispY; - } - double [][] lines1 = {{dispX, dispY},{dispX1,dispY1}}; - thetaEHeightRRscShape.addLineSegment(lines1); - dispX1 = dispX; - dispY1 = dispY; - - } - } - /* ----- Plot Vertical Legend ----- */ - dispX = vxMin; - for(float pres=1000; pres > 500; pres -= 100) - { - int iPres; - dispY = vyMax - (nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pres)) * yScaleAdjustRatio) ; - double [][] lines1 = {{dispX, dispY},{dispX+20,dispY}}; - thetaEHeightWRscShape.addLineSegment(lines1); - iPres = (((int)nsharpNative.nsharpLib.agl(nsharpNative.nsharpLib.ihght(pres)))/100)*100; - double [] lblXy1 = { dispX+40, dispY}; - thetaEHeightYRscShape.addLabel(String.valueOf(iPres), lblXy1); - } - thetaEHeightYRscShape.compile(); - thetaEHeightWRscShape.compile(); - thetaEHeightRRscShape.compile(); - - } - private void createRscThetaEPressureShape(WGraphics world){ - /* - * Chin:: NOTE::: - * This plotting function is based on the algorithm of plot_thetae() at xwvid5.c of native nsharp source code - * - */ - thetaEPressureYRscShape = target.createWireframeShape(false,descriptor ); - thetaEPressureYRscShape.allocate(2); - thetaEPressureRRscShape = target.createWireframeShape(false,descriptor ); - thetaEPressureRRscShape.allocate(soundingLys.size() * 2); - thetaEPressureWRscShape = target.createWireframeShape(false,descriptor ); - thetaEPressureWRscShape.allocate(100); - double dispX, dispY, dispX1, dispY1; - double xAxisCenter, xScaleAdjustRatio, thetaEDispWidth; - double yScaleAdjustRatio; - float t700, t850, d700, d850, ct1, ct2, ct3, cthe, nct; - double vyMax = world.getViewYmax(); - double vyMin = world.getViewYmin(); - double vxMax = world.getViewXmax(); - double vxMin = world.getViewXmin(); - - // add a virtual line to make wire fram shape worked when only strings are added to shape - double [][] lines = {{0, 0},{0,0}}; - thetaEPressureYRscShape.addLineSegment(lines); - /* ----- Set Layer (AGL) ----- */ - - //----- Plot Label ----- - dispX = vxMin + 20; - dispY = vyMin+30; - - double [] lblXy = { dispX+ 150, dispY}; - thetaEPressureYRscShape.addLabel("Theta-E vs Pressure", lblXy); - - //plot theta E difference - double [] lblXy2= {dispX+150,dispY+100}; - FloatByReference tempF= new FloatByReference(0); - float thetaEDiff= nsharpNative.nsharpLib.ThetaE_diff(tempF); - if(nsharpNative.nsharpLib.qc(thetaEDiff) == 1){ - String thetaDiffStr = String.format("TEI = %.0f", thetaEDiff); - thetaEPressureYRscShape.addLabel(thetaDiffStr, lblXy2); - } - // ----- Plot horizontal legend ----- - - FloatByReference surfpressure= new FloatByReference(0); - FloatByReference surfTemp= new FloatByReference(0); - FloatByReference surfDewpt= new FloatByReference(0); - t700 = nsharpNative.nsharpLib.itemp(700.0F); - if (nsharpNative.nsharpLib.qc(t700) == 0) - return; - t850 = nsharpNative.nsharpLib.itemp(850.0F); - if (nsharpNative.nsharpLib.qc(t850) == 0) - return; - d700 = nsharpNative.nsharpLib.idwpt(700.0F); - if (nsharpNative.nsharpLib.qc(d700) == 0) - return; - d850 = nsharpNative.nsharpLib.idwpt(850.0F); - if (nsharpNative.nsharpLib.qc(d850) == 0) - return; - ct1 = nsharpNative.nsharpLib.thetae( 850.0F, t850, d850); - ct2 = nsharpNative.nsharpLib.thetae( 700.0F, t700, d700); - nsharpNative.nsharpLib.get_surface(surfpressure, surfTemp, surfDewpt); - ct3 = nsharpNative.nsharpLib.thetae( surfpressure.getValue(), surfTemp.getValue(), surfDewpt.getValue() ); - cthe = 0.0F; nct = 0.0F; - if(nsharpNative.nsharpLib.qc(ct1) != 0) - { - cthe = cthe + ct1; - nct++; - } - if(nsharpNative.nsharpLib.qc(ct2) != 0) - { - cthe = cthe + ct2; - nct++; - } - if(nsharpNative.nsharpLib.qc(ct3)!= 0) - { - cthe = cthe + ct3; - nct++; - } - if(nct < 1.0F) return; - cthe = cthe / nct; - //Adjust Theta-E axis scale with real view X scale - thetaEDispWidth = 60; - xAxisCenter = ((vxMax-vxMin ) / 2 ) + vxMin; - xScaleAdjustRatio = (vxMax-vxMin)/thetaEDispWidth; - for(double h= -(thetaEDispWidth/2); h<=(thetaEDispWidth/2); h += 10.0F) - { - int iThetaE = (int)(h+cthe); //cthe sits in the middle of x-axis - dispX = xAxisCenter + (h* xScaleAdjustRatio); - dispY = vyMax; - //System.out.println("cthe = " + cthe+"xmax = " + vxMax + ", Ymax = " +vyMax + " x1 ="+ x1 + "y1 = " + y1 + " h = " + h ); - double [][] lines1 = {{dispX, dispY},{dispX,dispY-20}}; - thetaEPressureWRscShape.addLineSegment(lines1); - if((h != -(thetaEDispWidth/2))&&(h != (thetaEDispWidth/2)) ){ - //draw scale with kelvin degree - double [] lblXy1= { dispX+20, dispY-20}; - thetaEPressureYRscShape.addLabel(String.valueOf(iThetaE+273), lblXy1); - } - - } - - // ----- Plot vertical theta-e profile ----- - //use soundingLys directly - float thetaE, highPressure=1000; - dispX1 = dispY1 = -999; - //find highest pressure available on sounding data. But should be <= 1000 and > 500 - for( NcSoundingLayer lys:soundingLys) - { - if((lys.getPressure() >= 500) && (lys.getPressure() <= 1000)){ - highPressure = lys.getPressure(); - break; - } - } - yScaleAdjustRatio = (vyMax-vyMin)/(highPressure-500); - for( NcSoundingLayer lys:soundingLys) - { //plot only at pressure greater than or equal to 500 - if((lys.getPressure() >= 500) && (lys.getPressure() <= 1000) && (nsharpNative.nsharpLib.qc(lys.getDewpoint()) !=0 )){ - thetaE = nsharpNative.nsharpLib.thetae( lys.getPressure(), lys.getTemperature(),lys.getDewpoint())-cthe; - dispX = xAxisCenter + ( thetaE * xScaleAdjustRatio); - dispY = vyMin + (lys.getPressure()-500) * yScaleAdjustRatio ; - - if(dispX1 == -999) { - dispX1 = dispX; - dispY1 = dispY; - } - //System.out.println("dispX="+dispX+" dispY="+dispY+" geoH="+lys.getGeoHeight()); - double [][] lines1 = {{dispX, dispY},{dispX1,dispY1}}; - thetaEPressureRRscShape.addLineSegment(lines1); - dispX1 = dispX; - dispY1 = dispY; - - } - } - /* ----- Plot Vertical (pressure) Legend ----- */ - dispX = vxMin; - for(int pres=900; pres > 500; pres -= 100) - { - dispY = vyMin +(pres-500) * yScaleAdjustRatio ; - double [][] lines1 = {{dispX, dispY},{dispX+20,dispY}}; - thetaEPressureWRscShape.addLineSegment(lines1); - double [] lblXy1= { dispX+40, dispY}; - thetaEPressureYRscShape.addLabel(String.valueOf(pres), lblXy1); - } - thetaEPressureYRscShape.compile(); - thetaEPressureWRscShape.compile(); - thetaEPressureRRscShape.compile(); - } - /****************************************************************************************************************** - * createTurbulenceShapes() - * Chin:: NOTE::: - * This plotting function is based on the algorithm of draw_TURB() at xwvid1.c of AWC Nsharp source code - * by LARRY J. HINSON AWC/KCMO - * Original C code - g=9.8; - for (i=0;i=100;i++) { - s1=i; - s2=i+1; - if (sndg[s1][3] > -900 & sndg[s2][3]> -900.0) { - u1=-sndg[s1][6]*sin(sndg[s1][5]*PI/180); - v1=-sndg[s1][6]*cos(sndg[s1][5]*PI/180); - u2=-sndg[s2][6]*sin(sndg[s2][5]*PI/180); - v2=-sndg[s2][6]*cos(sndg[s2][5]*PI/180); - u=u2-u1;v=v2-v1; - windshear=sqrt(u*u+v*v)*.51479/(sndg[s2][2]-sndg[s1][2]); - midPres=(sndg[s1][1]+sndg[s2][1])/2; - theta1=theta(sndg[s1][1],sndg[s1][3],1000)+273.16; - theta2=theta(sndg[s2][1],sndg[s2][3],1000)+273.16; - meanTheta=(theta1+theta2)/2.0; - dz=sndg[s2][2]-sndg[s1][2]; - dthetadz=(theta2-theta1)/dz; - if (windshear != 0.0) { - windshearsqrd=(windshear*windshear); - Ri=(g/meanTheta)*(dthetadz/windshearsqrd); - if (! first) { - setcolor(7); - setwindow(X0,fnP(Y0),XM,fnP(YM)); - line_w(lastptx,lastpty,log(Ri),fnP(midPres)); - setcolor(11); - setwindow(nx1w,fnP(Y0),nx2w,fnP(YM)); - tke_windshear_prod=0.54*dz*windshearsqrd; - - line_w(lastpts,lastpty,tke_windshear_prod*100,fnP(midPres)); - } - lastptx=log(Ri); - lastpty=fnP(midPres); - lastpts=0.54*dz*windshearsqrd*100; - first=0; - } - } - } - **********************************************************************************************************************/ - private void createTurbulenceShapes(WGraphics world){ - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc==null){ - return; - } - if(turbLnShape!=null) - turbLnShape.dispose(); - NsharpTurbulenceBackground tBk= bkRsc.getTurbBackground(); - turbLnShape = target.createWireframeShape(false,descriptor ); - turbLnShape.allocate(this.soundingLys.size() * 2); - turbWindShearShape = target.createWireframeShape(false,descriptor ); - turbWindShearShape.allocate(this.soundingLys.size() * 2); - Coordinate pointALn = null; - Coordinate pointBLn=null; - Coordinate pointAWsh = null; - Coordinate pointBWsh=null; - double g= 9.8f, Ri; - double t0,t1,v0,v1, u0,u1, windshear0, windshearsqrd,tke_windshear_prod; - double pressure0=0, pressure1,midpressure0, p, high0=0,high1; - double theta1=0, theta0=0,dthetadz0,meanTheta; - boolean first=true; - NcSoundingLayer layer0, layer1; - for (int i=0; i< soundingLys.size()-1; i++) { - layer0 = soundingLys.get(i); - pressure0= layer0.getPressure(); - t0= layer0.getTemperature(); - high0= layer0.getGeoHeight(); - layer1 = soundingLys.get(i+1); - t1= layer1.getTemperature(); - high1= layer1.getGeoHeight(); - if( t0<= NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA || t1<= NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA|| - pressure0 <= NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP ) - continue; - pressure1= layer1.getPressure(); - v0=nsharpNative.nsharpLib.iwndv((float)pressure0); - v1=nsharpNative.nsharpLib.iwndv((float)pressure1); - u0=nsharpNative.nsharpLib.iwndu((float)pressure0); - u1=nsharpNative.nsharpLib.iwndu((float)pressure1); - windshear0=Math.sqrt((u1-u0)*(u1-u0)+(v1-v0)*(v1-v0))*.51479/(high1-high0); - midpressure0 = (pressure1+pressure0)/2; - theta0=WxMath.theta(pressure0,t0, 1000)+273.15; - theta1=WxMath.theta(pressure1,t1, 1000)+273.15; - meanTheta=(theta1+theta0)/2.0f; - dthetadz0=(theta1-theta0)/(high1-high0); - if (windshear0 != 0.0 ) { - windshearsqrd=(windshear0*windshear0); - Ri=(g/meanTheta)*(dthetadz0/windshearsqrd); - world.setWorldCoordinates(NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_LEFT, tBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP), - NsharpConstants.TURBULENCE_LN_RICHARDSON_NUMBER_RIGHT, tBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM)); - //System.out.println("world viewYmin="+world.getViewYmin()+" viewYmax="+world.getViewYmax()+" wolrdYmin="+ world.getWorldYmin()+" wolrdYmax="+ world.getWorldYmax() - // +" viewXmin="+world.getViewXmin()+" viewXmax="+world.getViewXmax()+" wolrdXmin="+ world.getWorldXmin()+" wolrdXmax="+ world.getWorldXmax()); - - pointALn = new Coordinate(); - p = tBk.toLogScale(midpressure0); - pointALn.x = world.mapX(Math.log(Ri)); - pointALn.y = world.mapY(p); - world.setWorldCoordinates(NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_LEFT, tBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_TOP), - NsharpConstants.TURBULENCE_WIND_SHEAR_TKE_RIGHT, tBk.toLogScale(NsharpConstants.TURBULENCE_PRESSURE_LEVEL_BOTTOM)); - pointAWsh = new Coordinate(); - tke_windshear_prod=0.54*(high1-high0)*windshearsqrd; - pointAWsh.x = world.mapX( tke_windshear_prod*100); - pointAWsh.y = world.mapY(p); - //System.out.println("P0="+pressure0+" dthetadz0="+dthetadz0+" theta0="+theta0+" log(Ri)="+Math.log(Ri)+ " pointAx="+pointALn.x+ " y="+pointALn.y); - if (! first) { - double [][] linesLn = {{pointALn.x, pointALn.y},{pointBLn.x, pointBLn.y}}; - double [][] linesWsh = {{pointAWsh.x, pointAWsh.y},{pointBWsh.x, pointBWsh.y}}; - turbLnShape.addLineSegment(linesLn); - turbWindShearShape.addLineSegment(linesWsh); - - } - else{ - first=false; - } - pointBLn = pointALn; - pointBWsh = pointAWsh; - } - } - - turbLnShape.compile(); - turbWindShearShape.compile(); - } - - /* - * Chin:: NOTE::: - * This plotting function is based on the algorithm of draw_ICG() at xwvid1.c of AWC Nsharp source code - * by LARRY J. HINSON AWC/KCMO - * - */ - private void createIcingRHShape(WGraphics world){ - //System.out.println("world viewYmin="+world.getViewYmin()+" viewYmax="+world.getViewYmax()+" wolrdYmin="+ world.getWorldYmin()+" wolrdYmax="+ world.getWorldYmax() - // +" viewXmin="+world.getViewXmin()+" viewXmax="+world.getViewXmax()+" wolrdXmin="+ world.getWorldXmin()+" wolrdXmax="+ world.getWorldXmax()); - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc==null){ - return; - } - icingRHShape = target.createWireframeShape(false,descriptor ); - icingRHShape.allocate(this.soundingLys.size() * 2); - Coordinate c0 = null; - - for (NcSoundingLayer layer : soundingLys) { - double pressure = layer.getPressure(); - if (pressure >= NsharpConstants.ICING_PRESSURE_LEVEL_TOP - && pressure <= NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM) { - - FloatByReference parm= new FloatByReference(0); - float relh= nsharpNative.nsharpLib.relh((float)pressure, parm); - Coordinate c1 = new Coordinate(); - double p = bkRsc.getIcingBackground().toLogScale(pressure); - c1.x = world.mapX(relh); - c1.y = world.mapY(p); - //System.out.println("RH="+relh+ " p="+pressure+ " x="+c1.x+ " y="+c1.y); - if (c0 != null) { - double [][] lines = {{c0.x, c0.y},{c1.x, c1.y}}; - icingRHShape.addLineSegment(lines); - } - c0 = c1; - } - } - - icingRHShape.compile(); - } - - /****************************************************************************************************************** - * createIcingEPIShape() - * Chin:: NOTE::: - * This plotting function is based on the algorithm of draw_ICG() at xwvid1.c of AWC Nsharp source code - * by LARRY J. HINSON AWC/KCMO - * original c ode******** - first=-1; - for (i=0;i=100;i++) { - if (sndg[i][3] > -900.0 && sndg[i+1][3]>-900) { - theta1=theta(sndg[i][1],sndg[i][3],1000)+273.15; - thetase1=theta1*exp(const1*mixratio(sndg[i][1],sndg[i][3])*.001/(sndg[i][3]+273.15)); - theta2=theta(sndg[i+1][1],sndg[i+1][3],1000)+273.15; - thetase2=theta2*exp(const1*mixratio(sndg[i+1][1],sndg[i+1][3])*.001/(sndg[i][3]+273.15)); - //Do D-Theta-se/dz - dthetasedz=(thetase2-thetase1)/(sndg[i+1][2]-sndg[i][2]); - midpres=(sndg[i][1]+sndg[i+1][1])/2; - if (first) { - moveto_w(dthetasedz*1E3,fnP(midpres)); - first=0; - } - else - lineto_w(dthetasedz*1E3,fnP(midpres)); - } - } - end of c code ******* - * - **********************************************************************************************************************/ - private void createIcingEPIShape(WGraphics world){ - //System.out.println("world viewYmin="+world.getViewYmin()+" viewYmax="+world.getViewYmax()+" wolrdYmin="+ world.getWorldYmin()+" wolrdYmax="+ world.getWorldYmax() - // +" viewXmin="+world.getViewXmin()+" viewXmax="+world.getViewXmax()+" wolrdXmin="+ world.getWorldXmin()+" wolrdXmax="+ world.getWorldXmax()); - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc==null){ - return; - } - icingEPIShape = target.createWireframeShape(false,descriptor ); - icingEPIShape.allocate(this.soundingLys.size() * 2); - Coordinate pointA = null; - Coordinate pointB=null; - boolean firstround=true; - double t0,t1; - double pressure0=0, pressure1,midpressure0, p, high0=0,high1; - double const1=2500000.0/1004.0; - double theta1=0,thetase1, theta0=0,thetase0=0,mixratio0,mixratio1,dthetasedz0; - NcSoundingLayer layer0, layer1; - for (int i=0; i< soundingLys.size()-1; i++) { - layer0 = soundingLys.get(i); - layer1 = soundingLys.get(i+1); - t0= layer0.getTemperature(); - t1= layer1.getTemperature(); - pressure0 = layer0.getPressure(); - pressure1 = layer1.getPressure(); - if( t0<= NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA || t1<= NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA|| - (pressure0 < NsharpConstants.ICING_PRESSURE_LEVEL_TOP && pressure1 < NsharpConstants.ICING_PRESSURE_LEVEL_TOP)) - continue; - theta1=WxMath.theta(pressure1,t1, 1000)+273.15; - mixratio1 = WxMath.mixingRatio(pressure1, t1); - thetase1 = theta1*Math.exp(const1*mixratio1*.001/(t1+273.15)); - high1= layer1.getGeoHeight(); - theta0=WxMath.theta(pressure0,t0, 1000)+273.15; - mixratio0 = WxMath.mixingRatio(pressure0, t0); - thetase0 = theta0*Math.exp(const1*mixratio0*.001/(t0+273.15)); - high0= layer0.getGeoHeight(); - //Do D-Theta-se/dz - dthetasedz0=(thetase1-thetase0)/(high1-high0)*1E3; - midpressure0 = (pressure1+pressure0)/2; - pointA = new Coordinate(); - p = bkRsc.getIcingBackground().toLogScale(midpressure0); - pointA.x = world.mapX(dthetasedz0); - pointA.y = world.mapY(p); - if(!firstround){ - //System.out.println("Temp="+t0+ " p="+pressure0+ "pointAx="+pointA.x+ " y="+pointA.y+ " pointBx="+pointB.x+ " y="+pointB.y); - double [][] lines = {{pointA.x, pointA.y},{pointB.x, pointB.y}}; - icingEPIShape.addLineSegment(lines); - - } - else - {//this is first round, we need two pints for a line segment. We only have first point now. - firstround= false; - } - pointB = pointA; - - } - icingEPIShape.compile(); - } - /* - * Chin:: NOTE::: - * This plotting function is based on the algorithm of draw_ICG() at xwvid1.c of AWC Nsharp source code - * by LARRY J. HINSON AWC/KCMO - * - */ - private void createIcingTempShape(WGraphics world){ - //System.out.println("world viewYmin="+world.getViewYmin()+" viewYmax="+world.getViewYmax()+" wolrdYmin="+ world.getWorldYmin()+" wolrdYmax="+ world.getWorldYmax() - // +" viewXmin="+world.getViewXmin()+" viewXmax="+world.getViewXmax()+" wolrdXmin="+ world.getWorldXmin()+" wolrdXmax="+ world.getWorldXmax()); - - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - if(bkRsc==null){ - return; - } - icingTempShape = target.createWireframeShape(false,descriptor ); - icingTempShape.allocate(this.soundingLys.size() * 2); - Coordinate c0 = null; - - for (NcSoundingLayer layer : soundingLys) { - double t= layer.getTemperature(); - //if( t > NsharpConstants.ICING_TEMPERATURE_RIGHT || t< NsharpConstants.ICING_TEMPERATURE_LEFT) - // continue; - double pressure = layer.getPressure(); - if (pressure >= NsharpConstants.ICING_PRESSURE_LEVEL_TOP - && pressure <= NsharpConstants.ICING_PRESSURE_LEVEL_BOTTOM) { - - Coordinate c1 = new Coordinate(); - double p = bkRsc.getIcingBackground().toLogScale(pressure); - c1.x = world.mapX(t); - c1.y = world.mapY(p); - //System.out.println("Temp="+t+ " p="+pressure+ " x="+c1.x+ " y="+c1.y); - if (c0 != null) { - double [][] lines = {{c0.x, c0.y},{c1.x, c1.y}}; - icingTempShape.addLineSegment(lines); - } - c0 = c1; - } - } - - icingTempShape.compile(); - } - private void createRscPressTempCurveShape(WGraphics WGc, List soundingLays, NsharpLineProperty lineP){ - IWireframeShape shapeT = target.createWireframeShape(false,descriptor ); - shapeT.allocate(soundingLays.size() * 2); - IWireframeShape shapeD = target.createWireframeShape(false,descriptor ); - shapeD.allocate(soundingLays.size() * 2); - ShapeAndLineProperty shNcolorT = new ShapeAndLineProperty(), shNcolorD=new ShapeAndLineProperty(); - double maxPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, WGc - .getWorldYmax())).y; - double minPressure = NsharpWxMath.reverseSkewTXY(new Coordinate(0, WGc - .getWorldYmin())).y; - boolean drawTemp=true, drawDew=true; - //NsharpParametersSelectionConfigDialog configD = NsharpParametersSelectionConfigDialog.getAccess(); - if(graphConfigProperty!=null){ - drawTemp = graphConfigProperty.isTemp(); - drawDew = graphConfigProperty.isDewp(); - } - Coordinate c0 = null, c01=null; - for (NcSoundingLayer layer : soundingLays) { - double t, d; - t = layer.getTemperature(); - d = layer.getDewpoint(); - - double pressure = layer.getPressure(); - if (t != INVALID_DATA && pressure >= minPressure - && pressure <= maxPressure) { - - Coordinate c1 = NsharpWxMath.getSkewTXY(pressure, t); - - c1.x = WGc.mapX(c1.x); - c1.y = WGc.mapY(c1.y); - if (c0 != null) { - double [][] lines = {{c0.x, c0.y},{c1.x, c1.y}}; - shapeT.addLineSegment(lines); - } - c0 = c1; - } - if (d > -999 && pressure >= minPressure - && pressure <= maxPressure) { - - Coordinate c11 = NsharpWxMath.getSkewTXY(pressure, d); - - c11.x = WGc.mapX(c11.x); - c11.y = WGc.mapY(c11.y); - if (c01 != null) { - double [][] lines = {{c01.x, c01.y},{c11.x, c11.y}}; - shapeD.addLineSegment(lines); - } - c01 = c11; - } - } - - shapeT.compile(); - shapeD.compile(); - - shNcolorT.shape = shapeT; - shNcolorD.shape = shapeD; - if(!overlayIsOn && !compareStnIsOn && !compareTmIsOn){ - //use default color - shNcolorT.lp = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_TEMP]);//chin new config NsharpConstants.color_red; - shNcolorD.lp = linePropertyMap.get(NsharpConstants.lineNameArray[NsharpConstants.LINE_DEWP]);//NsharpConstants.color_green; - } - else - { - shNcolorT.lp = lineP; - shNcolorD.lp = lineP; - } - //check draw temp and dew here. It is easier to do this way, otherwise, we have to check it every wghere - if(drawTemp) - pressureTempRscShapeList.add(shNcolorT); - else - shNcolorT.shape.dispose(); - if(drawDew) - pressureTempRscShapeList.add(shNcolorD); - else - shNcolorD.shape.dispose(); - } - private void createRscwetBulbTraceShape(WGraphics WGc){ - if(wetBulbTraceRscShape!=null){ - wetBulbTraceRscShape.dispose(); - wetBulbTraceRscShape=null; - } - wetBulbTraceRscShape = target.createWireframeShape(false,descriptor ); - wetBulbTraceRscShape.allocate(soundingLys.size() * 2); - float t1; - - Coordinate c2 = null; - Coordinate c1; - // draw trace - for (NcSoundingLayer layer : this.soundingLys) { - if (layer.getDewpoint() > -200 && layer.getPressure() >= 100){ - t1 = nsharpNative.nsharpLib.wetbulb(layer.getPressure(), layer.getTemperature(), - layer.getDewpoint()); - - c1 = NsharpWxMath.getSkewTXY(layer.getPressure(), t1); - c1.x = WGc.mapX(c1.x); - c1.y = WGc.mapY(c1.y); - if(c2!= null){ - - double [][] lines = {{c1.x, c1.y},{c2.x, c2.y}}; - wetBulbTraceRscShape.addLineSegment(lines); - - } - c2 = c1; - } - } - wetBulbTraceRscShape.compile(); - } - private void createRscOmegaShape(WGraphics WGc){ - omegaRscShape = target.createWireframeShape(false,descriptor ); - omegaRscShape.allocate(soundingLys.size() * 2); - float p, omega, t; - double xAxisOrigin=NsharpConstants.OMEGA_X_TOP; - for (NcSoundingLayer layer : this.soundingLys) { - p = layer.getPressure(); - t = layer.getTemperature(); - omega = layer.getOmega()* -10 ;//to have same scale as legacy Nsharp - if (p > 140 && p < 1000 && omega > -10){ - //since 40 units of skewT X-axis is 10 unit of Omega, we have to convert it by - // multiply 4 to omega unit for plotting - Coordinate c1 = NsharpWxMath.getSkewTXY(p, t); - c1.y = WGc.mapY(c1.y); // what we need here is only pressure for Y-axix, - //target.drawLine(xAxisOrigin, c1.y, 0.0, xAxisOrigin + omega* 4, c1.y, 0.0, NsharpConstants.color_cyan, - // commonLinewidth); - double [][] lines = {{xAxisOrigin+40, c1.y},{xAxisOrigin+40 + (omega* 4), c1.y}}; - omegaRscShape.addLineSegment(lines); - } - } - omegaRscShape.compile(); - } - private void createRscHeightMarkShape(WGraphics WGc){ - heightMarkRscShape = target.createWireframeShape(false,descriptor ); - heightMarkRscShape.allocate(20); - //plot meter scales... - for (int j = 0; j < NsharpConstants.HEIGHT_LEVEL_METERS.length; j++) { - int meters = NsharpConstants.HEIGHT_LEVEL_METERS[j]; - // plot the meters scale - double pressure = nsharpNative.nsharpLib.ipres(meters+(int)(soundingLys.get(0).getGeoHeight())); - double y = WGc.mapY(NsharpWxMath.getSkewTXY(pressure, -50).y); - //System.out.println("WGc.mapX(NsharpConstants.left) + 20 =" + (WGc.mapX(NsharpConstants.left) + 20)); - double [][] lines = {{WGc.mapX(NsharpConstants.left) + 20, y},{WGc.mapX(NsharpConstants.left) + 40, y}}; - heightMarkRscShape.addLineSegment(lines); - double [] lblXy = {WGc.mapX(NsharpConstants.left) + 50,y-5}; - heightMarkRscShape.addLabel(Integer.toString(meters/1000)+" km", lblXy); - } - // plot surface level mark{ - if(soundingLys.get(0).getGeoHeight() != NsharpNativeConstants.NSHARP_NATIVE_INVALID_DATA) - { - double y = WGc.mapY(NsharpWxMath.getSkewTXY(soundingLys.get(0).getPressure(), -50).y); - double [][] lines = {{WGc.mapX(NsharpConstants.left) + 20, y},{WGc.mapX(NsharpConstants.left) + 40, y}}; - heightMarkRscShape.addLineSegment(lines); - double [] lblXy = {WGc.mapX(NsharpConstants.left) + 50,y-5}; - heightMarkRscShape.addLabel("SFC("+Integer.toString((int)(soundingLys.get(0).getGeoHeight()))+"m)", lblXy); - } - heightMarkRscShape.compile(); - } - /** - * Create all wire frame shapes at one place. - * Should be used only when a new resource is becoming Current active resource to be displayed. - * - */ - private void createAllWireFrameShapes(){ - //System.out.println("createAllWireFrameShapes called"); - disposeAllWireFrameShapes(); - createRscWireFrameShapes();; - //create static shape - createBkgOmegaShape(); - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - createBkgWindBoxShape(WGc); - createHodoWindMotionBoxShape(); - } - private void createRscWireFrameShapes(){ - //System.out.println("createRscWireFrameShapes called"); - disposeRscWireFrameShapes(); - if(soundingLys != null){ - NsharpBackgroundResource bkRsc = descriptor.getSkewTBkGResource(); - WGraphics WGc = bkRsc.getSkewTBackground().getWorld(); - createRscHeightMarkShape(WGc); - createRscOmegaShape(WGc); - createRscwetBulbTraceShape(WGc); - createRscPressTempCurveShapeAll(); - createRscVTempTraceShape(WGc); - createRscWindBoxWindShape(WGc); - for (ParcelData parData: parcelList){ - createRscParcelTraceShape( WGc, parData.parcelType,parData.parcelLayerPressure); - } - createCloudsShape(WGc); - - createRscHodoWindShapeAll(); - - WGc= bkRsc.getThetaEPresureBackground().getWorld(); - createRscThetaEPressureShape(WGc); - WGc= bkRsc.getThetaEHeightBackground().getWorld(); - createRscThetaEHeightShape(WGc); - WGc= bkRsc.getSrWindsBackground().getWorld(); - createRscSrWindShape(WGc); - - // Chin: Note: delay create possible watch type to when first time paintInterl() called. - // To fix an initial watch type not correct issue: TTR6191. - //WGc = bkRsc.getPsblWatchTypeBackground().getWorld(); - //createBkgPsblWatchShape(WGc); - if(psblWatchTypeBkgShape != null){ - psblWatchTypeBkgShape.dispose(); - psblWatchTypeBkgShape = null; - } - - WGc = bkRsc.getVerticalWindBackground().getWorld(); - createRscVerticalWindShape(WGc); - } - } - public void setGraphConfigProperty(NsharpGraphProperty graphConfigProperty) { - this.graphConfigProperty = graphConfigProperty; - int tempOffset = graphConfigProperty.getTempOffset(); - NsharpWxMath.setTempOffset(tempOffset); - } - - public void setLinePropertyMap( - HashMap linePropertyMap) { - this.linePropertyMap = linePropertyMap; - } - - public void handleTimeLineActConfig(List tlList, NsharpConstants.State actSt){ - for(String tlStr: tlList){ - for(NsharpTimeLineStateProperty tl: timeLineStateList){ - if(tlStr.equals(tl.timeDescription)){ - tl.timeState = actSt; - break; - } - } - } - findCurrentElementIndexesAfterConfig(); - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - if(compareStnIsOn){ - createRscHodoWindShapeAll(); - createRscPressTempCurveShapeAll(); - } - } - public void handleStationActConfig(List stnList, NsharpConstants.State actSt){ - for(String tlStr: stnList){ - for(NsharpStationStateProperty stn: stnStateList){ - if(tlStr.equals(stn.stnDescription)){ - stn.stnState = actSt; - break; - } - } - } - findCurrentElementIndexesAfterConfig(); - setCurSndProfileProp(); - setCurrentSoundingLayerInfo(); - resetData(); - } -} - diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResourceData.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResourceData.java deleted file mode 100644 index a6e1dcaa8b..0000000000 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/skewt/rsc/NsharpSkewTResourceData.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * - * gov.noaa.nws.ncep.ui.nsharp.skewt.rsc.NsharpSkewTResourceData - * - * This java class performs the NSHARP NsharpSkewTResourceData functions. - * This code has been developed by the NCEP-SIB for use in the AWIPS2 system. - * - *
- * SOFTWARE HISTORY
- * 
- * Date         Ticket#    	Engineer    Description
- * -------		------- 	-------- 	-----------
- * 03/23/2010	229			Chin Chen	Initial coding
- *
- * 
- * - * @author Chin Chen - * @version 1.0 - */ -package gov.noaa.nws.ncep.ui.nsharp.skewt.rsc; - -import com.raytheon.uf.viz.core.drawables.IDescriptor; -import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.uf.viz.core.rsc.AbstractResourceData; -import com.raytheon.uf.viz.core.rsc.LoadProperties; - -public class NsharpSkewTResourceData extends AbstractResourceData { - - public NsharpSkewTResourceData() { - super(); - // TODO Auto-generated constructor stub - } - - @Override - public NsharpSkewTResource construct(LoadProperties loadProperties, - IDescriptor descriptor) throws VizException { - return new NsharpSkewTResource(this, loadProperties); - } - - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - return true; - } - - - @Override - public void update(Object updateData) { - // TODO Auto-generated method stub - - } - - @Override - public int hashCode() { - return NsharpSkewTResourceData.class.hashCode(); - } - -} diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ModelSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ModelSoundingDialogContents.java index b459ba6315..ed2cc73d55 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ModelSoundingDialogContents.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ModelSoundingDialogContents.java @@ -39,6 +39,7 @@ import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; import java.io.File; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.HashMap; @@ -84,8 +85,9 @@ public class ModelSoundingDialogContents { private final String GOOD_LATLON_STR = " A good input looked like this:\n 38.95;-77.45 or 38.95,-77.45"; private final String GOOD_STN_STR = " A good input looked like this:\n GAI or gai"; String gribDecoderName = "grid";//NcSoundingQuery.NCGRIB_PLUGIN_NAME; - private String selectedModel=null; + private String selectedModel=""; //private DBType currentDb = DBType.NCGRIB; + private static final String SND_TIMELINE_NOT_AVAIL_STRING = "No Sounding Time for Nsharp"; public enum LocationType { LATLON, STATION @@ -131,10 +133,10 @@ public class ModelSoundingDialogContents { ldDia.startWaitCursor(); ArrayList queryRsltsList1 = NsharpGridInventory.getInstance().searchInventory( - rcMap, "dataTime.refTime" ); + rcMap, "dataTime");//.refTime" ); /* - * Chin Note: with this query, the returned string has this format, "ncgrib/ruc13/2012-01-17_16:00:00.0" - * We will have to strip off "ncgrib/ruc13/" and ":00:00.0", also replace "_" with space, to get + * Chin Note: with this query, the returned string has this format, "grid/ruc13/2012-01-17_16:00:00.0(6)xxxxx" + * We will have to strip off "ncgrib/ruc13/" and ":00:00.0(6)xxxxx", also replace "_" with space, to get * grid file name like this "2012-01-17 16". */ char fileSep = File.pathSeparatorChar; @@ -149,6 +151,9 @@ public class ModelSoundingDialogContents { String refTime = queryRslt.substring(0, queryRslt.indexOf('_')); refTime = refTime + " "+ queryRslt.substring(queryRslt.indexOf('_')+1,queryRslt.indexOf(':')); //System.out.println("ret for disp="+refTime ); + //Chin: a same refTime may be returned more than once. + int index = availableFileList.indexOf(refTime); + if(index == -1) // index = -1 means it is not in the list availableFileList.add(refTime); } } @@ -210,7 +215,7 @@ public class ModelSoundingDialogContents { String gmtTimeStr = String.format("%1$ty%1$tm%1$td/%1$tH%1$tMV%2$03d %3$s", cal, vHour,modelName); //String gmtTimeStr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", cal); if(sndTimeList.indexOf(gmtTimeStr) != -1){ - // this indicate that gmtTimeStr is laready in the sndTimeList, then we dont need to add it to list again. + // this indicate that gmtTimeStr is already in the sndTimeList, then we dont need to add it to list again. continue; } @@ -226,10 +231,12 @@ public class ModelSoundingDialogContents { timeLineToFileMap.put(gmtTimeStr, fl); } } - } } } + if(sndTimeList!=null && sndTimeList.getItemCount()<=0){ + sndTimeList.add(SND_TIMELINE_NOT_AVAIL_STRING); + } ldDia.stopWaitCursor(); } @@ -315,25 +322,6 @@ public class ModelSoundingDialogContents { skewRsc.setSoundingType(selectedModel); NsharpEditor.bringEditorToTop(); } - /* - private void createModelTypeListOld(){ - if(modelTypeList!=null) - modelTypeList.removeAll(); - if(sndTimeList!=null) - sndTimeList.removeAll(); - if(availableFileList!=null) - availableFileList.removeAll(); - ldDia.startWaitCursor(); - NcSoundingModel mdlNames = NcSoundingQuery.soundingModelNameQuery(gribDecoderName); - //System.out.println("return from NcSoundingQuery "); - if(mdlNames != null) - for(String MdlStr: mdlNames.getMdlList()){ - //System.out.println("model name:"+MdlStr); - modelTypeList.add(MdlStr); - } - ldDia.stopWaitCursor(); - }*/ - private void createModelTypeList(){ if(modelTypeList!=null) modelTypeList.removeAll(); @@ -375,12 +363,35 @@ public class ModelSoundingDialogContents { ldDia.stopWaitCursor(); } + private void handleAvailFileListSelection(){ + String selectedFile=null; + if (availableFileList.getSelectionCount() > 0 ) { + selectedFileList.clear(); + for(int i=0; i < availableFileList.getSelectionCount(); i++) { + selectedFile = availableFileList.getSelection()[i]; + //System.out.println("selected sounding file is " + selectedFile); + selectedFileList.add(selectedFile); + } + createMDLSndTimeList(selectedFileList); + } + } + private void handleSndTimeSelection(){ + String selectedSndTime=null; + if (sndTimeList.getSelectionCount() > 0 && sndTimeList.getSelection()[0].equals(SND_TIMELINE_NOT_AVAIL_STRING)== false) { + selectedTimeList.clear(); + for(int i=0; i < sndTimeList.getSelectionCount(); i++) { + selectedSndTime = sndTimeList.getSelection()[i]; + //System.out.println("selected sounding time is " + selectedSndTime); + selectedTimeList.add(selectedSndTime); + } + NsharpMapResource.bringMapEditorToTop(); + } + } public void createMdlDialogContents(){ - selectedFileList.clear(); topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); topGp.setLayout( new GridLayout( 2, false ) ); - + selectedModel = ldDia.getActiveMdlSndMdlType(); ldDia.createSndTypeList(topGp); modelTypeGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); @@ -391,74 +402,19 @@ public class ModelSoundingDialogContents { //query to get and add available sounding models from DB modelTypeList.setFont(newFont); createModelTypeList(); - /* - Object[] mdlNames = NcSoundingQuery.soundingModelNameQuery(gribDecoderName); - //System.out.println("return from NcSoundingQuery "); - if(mdlNames != null) - for(Object MdlStr: mdlNames){ - //System.out.println("model name:"+MdlStr); - modelTypeList.add((String)MdlStr); - }*/ + //create a selection listener to handle user's selection on list modelTypeList.addListener ( SWT.Selection, new Listener () { public void handleEvent (Event e) { if (modelTypeList.getSelectionCount() > 0 ) { selectedModel = modelTypeList.getSelection()[0]; + ldDia.setActiveMdlSndMdlType(selectedModel); //System.out.println("selected sounding model is " + selectedModel); createMDLAvailableFileList(); } } } ); - /*Group gribGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); - gribGp.setText("Database"); - gribGp.setFont(newFont); - gribGp.setLayout( new GridLayout( 2, false ) ); - Button ncgribBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - ncgribBtn.setText("NCGrib"); - ncgribBtn.setEnabled( true ); - if(currentDb == DBType.NCGRIB) - ncgribBtn.setSelection(true); - ncgribBtn.setFont(newFont); - ncgribBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - currentDb = DBType.NCGRIB; - createModelTypeList(); - } - } ); - Button gribBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - gribBtn.setText("Grib"); - gribBtn.setFont(newFont); - gribBtn.setEnabled( true ); - if(currentDb == DBType.GRIB) - gribBtn.setSelection(true); - gribBtn.setBounds(modelTypeGp.getBounds().x+ NsharpConstants.btnGapX, ncgribBtn.getBounds().y + ncgribBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - gribBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.GRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - currentDb = DBType.GRIB; - createModelTypeList(); - } - } ); */ - /* - Button ncgribTestBtn = new Button(gribGp, SWT.RADIO | SWT.BORDER); - ncgribTestBtn.setText("NCGribTest"); - ncgribTestBtn.setEnabled( true ); - ncgribTestBtn.setSelection(false); - ncgribTestBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - gribDecoderName = NcSoundingQuery.NCGRIB_PLUGIN_NAME; - //query to get and add available sounding models from DB - createModelTypeListOld(); - } - } ); */ - - - //bottomGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); - //bottomGp.setLayout( new GridLayout( 2, false ) ); availableFileGp = new Group(topGp,SWT.SHADOW_ETCHED_IN); availableFileGp.setText("Available Grid files:"); @@ -468,18 +424,8 @@ public class ModelSoundingDialogContents { availableFileList.setFont(newFont); //create a selection listener to handle user's selection on list availableFileList.addListener ( SWT.Selection, new Listener () { - private String selectedFile=null; - public void handleEvent (Event e) { - if (availableFileList.getSelectionCount() > 0 ) { - selectedFileList.clear(); - for(int i=0; i < availableFileList.getSelectionCount(); i++) { - selectedFile = availableFileList.getSelection()[i]; - //System.out.println("selected sounding file is " + selectedFile); - selectedFileList.add(selectedFile); - } - createMDLSndTimeList(selectedFileList); - } + handleAvailFileListSelection(); } } ); @@ -492,26 +438,14 @@ public class ModelSoundingDialogContents { sndTimeList.setFont(newFont); sndTimeList.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight *32/5); sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - - selectedTimeList.clear(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - //System.out.println("selected sounding time is " + selectedSndTime); - selectedTimeList.add(selectedSndTime); - } - NsharpMapResource.bringMapEditorToTop(); - } + handleSndTimeSelection(); } }); timeBtn = new Button(topGp, SWT.CHECK | SWT.BORDER); timeBtn.setText("00Z and 12Z only"); timeBtn.setEnabled( true ); timeBtn.setFont(newFont); - //timeBtn.setBounds(modelTypeGp.getBounds().x+ NsharpConstants.btnGapX, modelTypeGp.getBounds().y + modelTypeGp.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - timeBtn.addListener( SWT.MouseUp, new Listener() { public void handleEvent(Event event) { if(timeLimit) @@ -534,7 +468,6 @@ public class ModelSoundingDialogContents { latlonBtn.setText("Lat/Lon"); latlonBtn.setFont(newFont); latlonBtn.setEnabled(true); - //latlonBtn.setBounds(locationMainGp.getBounds().x+ NsharpConstants.btnGapX, locationMainGp.getBounds().y + NsharpConstants.labelGap, 10, NsharpConstants.btnHeight); latlonBtn.setSelection(true); latlonBtn.addListener( SWT.MouseUp, new Listener() { public void handleEvent(Event event) { @@ -660,21 +593,25 @@ public class ModelSoundingDialogContents { } } } ); - /*newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; - else - newtab = false; + + if(selectedModel != null && selectedModel.equals("")== false){ + String[] selectedModelArray = {selectedModel}; + modelTypeList.setSelection(selectedModelArray); + createMDLAvailableFileList(); + selectedFileList = ldDia.getMdlSelectedFileList(); + Object[] selFileObjectArray = selectedFileList.toArray(); + String[] selFileStringArray = Arrays.copyOf(selFileObjectArray, selFileObjectArray.length, String[].class); + availableFileList.setSelection(selFileStringArray); + handleAvailFileListSelection(); + + selectedTimeList = ldDia.getMdlSelectedTimeList(); + Object[] selTimeObjectArray = selectedTimeList.toArray(); + String[] selTimeStringArray = Arrays.copyOf(selTimeObjectArray, selTimeObjectArray.length, String[].class); + sndTimeList.setSelection(selTimeStringArray); + handleSndTimeSelection(); + } - } ); - */ } public void cleanup(){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpGribModelTypeConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpGribModelTypeConfigDialog.java index df360ed11d..f1bf5cd1fb 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpGribModelTypeConfigDialog.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpGribModelTypeConfigDialog.java @@ -114,8 +114,8 @@ public class NsharpGribModelTypeConfigDialog extends Dialog { availableModelTypeList.add(modelName); } } - else - modelTypeList = null; + //else + // modelTypeList = null; return modelTypeList; } private void createDialogContents(Composite parent){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpLoadDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpLoadDialog.java index 78ff8590a9..28663979af 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpLoadDialog.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpLoadDialog.java @@ -20,10 +20,13 @@ package gov.noaa.nws.ncep.ui.nsharp.view; +import java.util.ArrayList; +import java.util.List; + +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; import gov.noaa.nws.ncep.ui.nsharp.NsharpConstants; import gov.noaa.nws.ncep.ui.nsharp.display.NsharpEditor; import gov.noaa.nws.ncep.ui.nsharp.display.map.NsharpMapResource; -import gov.noaa.nws.ncep.ui.nsharp.display.rsc.NsharpResourceHandler; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; @@ -67,6 +70,14 @@ public class NsharpLoadDialog extends Dialog { private ModelSoundingDialogContents mdlDialog; private Group soundingTypeGp, acarsGp; private int activeLoadSoundingType; + private NcSoundingProfile.ObsSndType activeObsSndType=NcSoundingProfile.ObsSndType.NCUAIR; + private ArrayList obsSelectedTimeList = new ArrayList(); + private NcSoundingProfile.PfcSndType activePfcSndType=NcSoundingProfile.PfcSndType.NAMSND; + private List pfcSelectedFileList = new ArrayList(); + private List pfcSelectedTimeList = new ArrayList(); + private String activeMdlSndMdlType=""; + private List mdlSelectedFileList = new ArrayList(); + private List mdlSelectedTimeList = new ArrayList(); private Text text1; private MessageBox mb; private Cursor waitCursor=null; @@ -252,7 +263,55 @@ public class NsharpLoadDialog extends Dialog { return activeLoadSoundingType; } + public List getPfcSelectedFileList() { + return pfcSelectedFileList; + } + public void setPfcSelectedFileList(List pfcSelectedFileList) { + this.pfcSelectedFileList = pfcSelectedFileList; + } + public List getPfcSelectedTimeList() { + return pfcSelectedTimeList; + } + public void setPfcSelectedTimeList(List pfcSelectedTimeList) { + this.pfcSelectedTimeList = pfcSelectedTimeList; + } + public ArrayList getObsSelectedTimeList() { + return obsSelectedTimeList; + } + public void setObsSelectedTimeList(ArrayList obsSelectedTimeList) { + this.obsSelectedTimeList = obsSelectedTimeList; + } + public NcSoundingProfile.ObsSndType getActiveObsSndType() { + return activeObsSndType; + } + public void setActiveObsSndType(NcSoundingProfile.ObsSndType activeObsSndType) { + this.activeObsSndType = activeObsSndType; + } + public NcSoundingProfile.PfcSndType getActivePfcSndType() { + return activePfcSndType; + } + public void setActivePfcSndType(NcSoundingProfile.PfcSndType activePfcSndType) { + this.activePfcSndType = activePfcSndType; + } + public String getActiveMdlSndMdlType() { + return activeMdlSndMdlType; + } + public void setActiveMdlSndMdlType(String activeMdlSndMdlType) { + this.activeMdlSndMdlType = activeMdlSndMdlType; + } + public List getMdlSelectedFileList() { + return mdlSelectedFileList; + } + public void setMdlSelectedFileList(List mdlSelectedFileList) { + this.mdlSelectedFileList = mdlSelectedFileList; + } + public List getMdlSelectedTimeList() { + return mdlSelectedTimeList; + } + public void setMdlSelectedTimeList(List mdlSelectedTimeList) { + this.mdlSelectedTimeList = mdlSelectedTimeList; + } static int count = 0; @@ -296,6 +355,7 @@ public class NsharpLoadDialog extends Dialog { } private void createLoadContents(Composite parent) { + /* CHIN 1331 NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); nsharpMapResource.setPoints(null); NsharpEditor editor = NsharpEditor.getActiveNsharpEditor(); @@ -303,7 +363,7 @@ public class NsharpLoadDialog extends Dialog { NsharpResourceHandler rsc = editor.getRscHandler(); rsc.cleanUpRsc(); editor.refresh(); - } + }*/ dialogParent = parent; obsDialog = new ObservedSoundingDialogContents(dialogParent); pfcDialog = new PfcSoundingDialogContents(dialogParent); diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpPaletteWindow.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpPaletteWindow.java index aa3eae0a32..87961ceb65 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpPaletteWindow.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpPaletteWindow.java @@ -312,12 +312,12 @@ DisposeListener, IPartListener{ NsharpConfigStore configStore = configMgr.retrieveNsharpConfigStoreFromFs(); NsharpGraphProperty graphConfigProperty = configStore.getGraphProperty(); paneConfigurationName = graphConfigProperty.getPaneConfigurationName(); - /*try { - // NsharpGridInventory.getInstance().initInventory(false); + try { + NsharpGridInventory.getInstance().initInventory(false); } catch (VizException e) { // TODO Auto-generated catch block e.printStackTrace(); - }*/ + } } diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpParametersSelectionConfigDialog.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpParametersSelectionConfigDialog.java index b21f64b218..92020e4d0f 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpParametersSelectionConfigDialog.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/NsharpParametersSelectionConfigDialog.java @@ -53,12 +53,12 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { private int labelGap = 20; private int btnGapX = 5; private int btnGapY = 5; - private Button tempBtn, dewpBtn, parcelBtn,parcelAscentBtn, dcapeBtn,vTempBtn, wetBulbBtn, mixingRatioBtn, + private Button tempBtn, dewpBtn, parcelTvBtn,parcelBtn, dcapeBtn,vTempBtn, wetBulbBtn, mixingRatioBtn, dryAdiabatBtn,moisAdiabatBtn,omegaBtn, meanWindVectorBtn, stormMVector3075Btn, stormMVector1585Btn, stormMVectorBunkersRightBtn,stormMVectorBunkersLeftBtn, corfidiVectorBtn, hodoBtn, efflayerBtn, cloudBtn, windBarbBtn; private Text windBarbText, tempOffsetText; //default value for button initial setup - private boolean temp=true, dewp=true, parcel=true,parcelAscent=true,dcape=true, vTemp=true, wetBulb=true, hodo=true, + private boolean temp=true, dewp=true, parcel=true,parcelTv=true,dcape=true, vTemp=true, wetBulb=true, hodo=true, mixratio=false, dryAdiabat=true, moistAdiabat=false, omega=true, meanWind=true, smv3075=false, smv1585=false, smvBunkersR=true, smvBunkersL=true,corfidiV=false, effLayer=true, cloud=false, windBarb=true; private int windBarbDistance=NsharpNativeConstants.WINDBARB_DISTANCE_DEFAULT; @@ -68,7 +68,7 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { graphProperty.setTemp(temp); graphProperty.setDewp(dewp); graphProperty.setParcel(parcel); - graphProperty.setParcelAscent(parcelAscent); + graphProperty.setParcelTv(parcelTv); graphProperty.setDcape(dcape); graphProperty.setVTemp(vTemp); graphProperty.setWetBulb(wetBulb); @@ -170,7 +170,7 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { } public boolean isParcelAscent() { - return parcelAscent; + return parcelTv; } public boolean isVTemp() { @@ -227,7 +227,7 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { temp=graphProperty.isTemp(); dewp=graphProperty.isDewp(); parcel=graphProperty.isParcel(); - parcelAscent=graphProperty.isParcelAscent(); + parcelTv=graphProperty.isParcelTv(); dcape = graphProperty.isDcape(); vTemp=graphProperty.isVTemp(); wetBulb=graphProperty.isWetBulb(); @@ -288,11 +288,28 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { applyChange(); } } ); - parcelBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - parcelBtn.setText(NsharpNativeConstants.PARCEL_TRACE); - parcelBtn.setEnabled( true ); - parcelBtn.setBounds(btnGp.getBounds().x+ btnGapX, dewpBtn.getBounds().y + dewpBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); + parcelTvBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); + parcelTvBtn.setText(NsharpNativeConstants.PARCEL_VT_TRACE); + parcelTvBtn.setEnabled( true ); + parcelTvBtn.setBounds(btnGp.getBounds().x+ btnGapX, dewpBtn.getBounds().y + dewpBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); if(parcel == true) + parcelTvBtn.setSelection(true); + else + parcelTvBtn.setSelection(false); + parcelTvBtn.addListener( SWT.MouseUp, new Listener() { + public void handleEvent(Event event) { + if(parcelTv == true) + parcelTv=false; + else + parcelTv=true; + applyChange(); + } + } ); + parcelBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); + parcelBtn.setText(NsharpNativeConstants.PARCEL_T_TRACE); + parcelBtn.setEnabled( true ); + parcelBtn.setBounds(btnGp.getBounds().x+ btnGapX, parcelTvBtn.getBounds().y + parcelTvBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); + if(parcelTv == true) parcelBtn.setSelection(true); else parcelBtn.setSelection(false); @@ -305,27 +322,10 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { applyChange(); } } ); - parcelAscentBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - parcelAscentBtn.setText(NsharpNativeConstants.PARCEL_TRACE_ASCENT); - parcelAscentBtn.setEnabled( true ); - parcelAscentBtn.setBounds(btnGp.getBounds().x+ btnGapX, parcelBtn.getBounds().y + parcelBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); - if(parcelAscent == true) - parcelAscentBtn.setSelection(true); - else - parcelAscentBtn.setSelection(false); - parcelAscentBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(parcelAscent == true) - parcelAscent=false; - else - parcelAscent=true; - applyChange(); - } - } ); dcapeBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); dcapeBtn.setText(NsharpNativeConstants.DCAPE_TRACE); dcapeBtn.setEnabled( true ); - dcapeBtn.setBounds(btnGp.getBounds().x+ btnGapX, parcelAscentBtn.getBounds().y + parcelAscentBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); + dcapeBtn.setBounds(btnGp.getBounds().x+ btnGapX, parcelBtn.getBounds().y + parcelBtn.getBounds().height+ btnGapY, btnWidth,btnHeight); if(dcape == true) dcapeBtn.setSelection(true); else @@ -788,7 +788,7 @@ public class NsharpParametersSelectionConfigDialog extends Dialog { } @Override public boolean close() { - tempBtn= dewpBtn= parcelBtn= parcelAscentBtn=dcapeBtn=vTempBtn= wetBulbBtn= mixingRatioBtn= + tempBtn= dewpBtn= parcelTvBtn= parcelBtn=dcapeBtn=vTempBtn= wetBulbBtn= mixingRatioBtn= dryAdiabatBtn=moisAdiabatBtn=efflayerBtn=omegaBtn= meanWindVectorBtn= stormMVector3075Btn= stormMVector1585Btn= stormMVectorBunkersRightBtn=stormMVectorBunkersLeftBtn= corfidiVectorBtn= hodoBtn=windBarbBtn=null; //thisDialog= null; diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ObservedSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ObservedSoundingDialogContents.java index de9f6562e1..d985907f83 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ObservedSoundingDialogContents.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/ObservedSoundingDialogContents.java @@ -31,8 +31,8 @@ import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; -import java.util.List; import java.util.TimeZone; import org.eclipse.swt.SWT; @@ -56,7 +56,7 @@ public class ObservedSoundingDialogContents { //private String FILE_DROP = "DROP"; private NcSoundingProfile.ObsSndType currentSndType = NcSoundingProfile.ObsSndType.NONE; private NsharpLoadDialog ldDia; - private List selectedTimeList = new ArrayList(); + private ArrayList selectedTimeList = new ArrayList(); private Font newFont; public boolean isRawData() { return rawData; @@ -144,22 +144,31 @@ public class ObservedSoundingDialogContents { } NsharpMapResource.bringMapEditorToTop(); - /* Chin test if(NsharpMapResource.getMapEditor() != null){ - - //NmapUiUtils.getActiveNatlCntrsEditor().refresh(); - NsharpMapResource.getMapEditor().refresh(); - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().bringToTop(NsharpMapResource.getMapEditor()); } - else{ - //bring the MAP editor back to top - PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().bringToTop(NmapUiUtils.findDisplayByName("Map")); + } - }*/ + private void handleSndTimeSelection(){ + String selectedSndTime=null; + if (sndTimeList.getSelectionCount() > 0 ) { + NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); + nsharpMapResource.setPoints(null); + selectedTimeList.clear(); + ldDia.startWaitCursor(); + for(int i=0; i < sndTimeList.getSelectionCount(); i++) { + selectedSndTime = sndTimeList.getSelection()[i]; + selectedTimeList.add(selectedSndTime); + //System.out.println("selected sounding time is " + selectedSndTime); + int endIndex = selectedSndTime.indexOf(" "); + String queryingSndTime = selectedSndTime.substring(0, endIndex); + queryAndMarkStn(queryingSndTime); + + } + ldDia.setObsSelectedTimeList(selectedTimeList); + ldDia.stopWaitCursor(); } - //NsharpMapModalTool.setModal(); } public void createObsvdDialogContents(){ - currentSndType = NcSoundingProfile.ObsSndType.NONE; + currentSndType = ldDia.getActiveObsSndType(); timeLimit =false; rawData = false; topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); @@ -180,11 +189,13 @@ public class ObservedSoundingDialogContents { public void handleEvent(Event event) { sndTimeList.removeAll(); currentSndType = NcSoundingProfile.ObsSndType.NCUAIR; + ldDia.setActiveObsSndType(currentSndType); createObsvdSndUairList(); //System.out.println("new obvSnd dialog uair btn"); } } ); + bufruaBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); bufruaBtn.setText(FILE_BUFRUA); bufruaBtn.setEnabled( true ); @@ -194,59 +205,11 @@ public class ObservedSoundingDialogContents { public void handleEvent(Event event) { sndTimeList.removeAll(); currentSndType = NcSoundingProfile.ObsSndType.BUFRUA; + ldDia.setActiveObsSndType(currentSndType); createObsvdSndUairList(); } } ); - /*/NCUAIR - ncuairBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - ncuairBtn.setText("NCUAIR"); - ncuairBtn.setEnabled( true ); - ncuairBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - - ncuairBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - //CHIN HDF5 test - currentSndType = NcSoundingProfile.ObsSndType.NCUAIR; - createObsvdSndUairList(); - //System.out.println("new obvSnd dialog uair btn"); - } - } ); - - dropBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - dropBtn.setText(FILE_DROP); - dropBtn.setEnabled( false ); - dropBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - dropBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.DROP; - } - } ); - tamBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - tamBtn.setText(FILE_TAMDAR); - tamBtn.setEnabled( false ); - tamBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, bufruaBtn.getBounds().y + bufruaBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - //tamBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, ncuairBtn.getBounds().y + ncuairBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - tamBtn.setFont(newFont); - tamBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.TAMDAR; - } - } ); - browseBtn = new Button(btnGp, SWT.RADIO | SWT.BORDER); - browseBtn.setText(FILE_BROWSE); - browseBtn.setEnabled( false ); - browseBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, tamBtn.getBounds().y + tamBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - browseBtn.setFont(newFont); - browseBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - sndTimeList.removeAll(); - currentSndType = NcSoundingProfile.ObsSndType.BROWSE; - } - } ); */ midGp = new Group(parent,SWT.SHADOW_ETCHED_IN); midGp.setLayout( new GridLayout( 2, false ) ); timeBtn = new Button(midGp, SWT.CHECK | SWT.BORDER); @@ -262,7 +225,7 @@ public class ObservedSoundingDialogContents { timeLimit = false; //refresh sounding list if file type is selected already - if(currentSndType== NcSoundingProfile.ObsSndType.NCUAIR /*|| currentSndType == NcSoundingProfile.ObsSndType.UAIR*/|| currentSndType == NcSoundingProfile.ObsSndType.BUFRUA){ + if(currentSndType== NcSoundingProfile.ObsSndType.NCUAIR || currentSndType == NcSoundingProfile.ObsSndType.BUFRUA){ createObsvdSndUairList(); } @@ -290,42 +253,27 @@ public class ObservedSoundingDialogContents { sndTimeList = new org.eclipse.swt.widgets.List(sndTimeListGp, SWT.BORDER | SWT.MULTI| SWT.V_SCROLL ); sndTimeList.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight*7 ); sndTimeList.setFont(newFont); + //create a selection listener to handle user's selection on list sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; + //private String selectedSndTime=null; public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - selectedTimeList.clear(); - ldDia.startWaitCursor(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - //System.out.println("selected sounding time is " + selectedSndTime); - int endIndex = selectedSndTime.indexOf(" "); - selectedSndTime = selectedSndTime.substring(0, endIndex); - queryAndMarkStn(selectedSndTime); - selectedTimeList.add(selectedSndTime); - } - ldDia.stopWaitCursor(); - - //NsharpMapMouseHandler.getAccess().setSelectedTimeList(selectedTimeList); - } + handleSndTimeSelection(); } }); - /*newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; + + if(currentSndType== NcSoundingProfile.ObsSndType.NCUAIR || currentSndType == NcSoundingProfile.ObsSndType.BUFRUA){ + if(currentSndType== NcSoundingProfile.ObsSndType.NCUAIR ) + uairBtn.setSelection(true); else - newtab = false; + bufruaBtn.setSelection(true); + createObsvdSndUairList(); + selectedTimeList = ldDia.getObsSelectedTimeList(); + Object[] selTimeObjectArray = selectedTimeList.toArray(); + String[] selTimeStringArray = Arrays.copyOf(selTimeObjectArray, selTimeObjectArray.length, String[].class); + sndTimeList.setSelection(selTimeStringArray); + handleSndTimeSelection(); } - } ); */ } public void cleanup(){ if(sndTimeList != null){ diff --git a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/PfcSoundingDialogContents.java b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/PfcSoundingDialogContents.java index 2f87a87194..c54d9fc874 100644 --- a/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/PfcSoundingDialogContents.java +++ b/ncep/gov.noaa.nws.ncep.ui.nsharp/src/gov/noaa/nws/ncep/ui/nsharp/view/PfcSoundingDialogContents.java @@ -30,6 +30,7 @@ import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.TimeZone; @@ -50,7 +51,7 @@ public class PfcSoundingDialogContents { private Button namBtn, gfsBtn, timeBtn; private boolean timeLimit = false; private List selectedFileList = new ArrayList(); - private List queriedTimeList = new ArrayList(); + private List selectedTimeList = new ArrayList(); private List stnPoints = new ArrayList(); private NcSoundingProfile.PfcSndType currentSndType = NcSoundingProfile.PfcSndType.NONE; private NsharpLoadDialog ldDia; @@ -136,12 +137,57 @@ public class PfcSoundingDialogContents { } ldDia.stopWaitCursor(); } - public void createPfcDialogContents(){ + private void handleAvailFileListSelection(){ + String selectedFile=null; + if (availablefileList.getSelectionCount() > 0 ) { selectedFileList.clear(); + for(int i=0; i < availablefileList.getSelectionCount(); i++) { + selectedFile = availablefileList.getSelection()[i]; + //System.out.println("selected sounding file is " + selectedFile); + selectedFileList.add(selectedFile); + } + ldDia.setPfcSelectedFileList(selectedFileList); + createPFCSndTimeList(selectedFileList); + } + } + private void handleSndTimeSelection(){ + String selectedSndTime=null; + if (sndTimeList.getSelectionCount() > 0 ) { + NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); + nsharpMapResource.setPoints(null); + selectedTimeList.clear(); + ldDia.startWaitCursor(); + List queriedTimeList = new ArrayList(); + for(int i=0; i < sndTimeList.getSelectionCount(); i++) { + selectedSndTime = sndTimeList.getSelection()[i]; + selectedTimeList.add(selectedSndTime); + int endIndex = selectedSndTime.indexOf(" "); + String querySndTime = selectedSndTime.substring(0, endIndex); + //System.out.println("selected sounding time is " + selectedSndTime); + //refTimeStr is same as "PFC file" name in Load dialog display + String refTimeStr=NcSoundingQuery.convertSoundTimeDispStringToRefTime(querySndTime); + //while rangeStartStr is same as "sounding Times + String rangeStartStr = NcSoundingQuery.convertSoundTimeDispStringToRangeStartTimeFormat(querySndTime); + if(queriedTimeList.contains(refTimeStr)== true){ + addStnPtWithoutQuery(refTimeStr,rangeStartStr,querySndTime); + } + else { + queriedTimeList.add(refTimeStr); + queryAndMarkStn(refTimeStr,rangeStartStr,querySndTime); + } + } + + ldDia.stopWaitCursor(); + + nsharpMapResource.setPoints(stnPoints); + NsharpMapResource.bringMapEditorToTop(); + } + } + public void createPfcDialogContents(){ topGp = new Group(parent,SWT.SHADOW_ETCHED_IN); topGp.setLayout( new GridLayout( 2, false ) ); - //ldDia.setShellSize(false); + currentSndType = ldDia.getActivePfcSndType(); ldDia.createSndTypeList(topGp); fileTypeGp = new Group(topGp, SWT.SHADOW_ETCHED_IN); @@ -156,6 +202,7 @@ public class PfcSoundingDialogContents { public void handleEvent(Event event) { currentSndType = NcSoundingProfile.PfcSndType.NAMSND; createPFCAvailableFileList(); + ldDia.setActivePfcSndType(currentSndType); } } ); gfsBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); @@ -167,41 +214,9 @@ public class PfcSoundingDialogContents { public void handleEvent(Event event) { currentSndType = NcSoundingProfile.PfcSndType.GFSSND; createPFCAvailableFileList(); + ldDia.setActivePfcSndType(currentSndType); } } ); - /* - ruc2Btn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - ruc2Btn.setText("RUC2SND"); - ruc2Btn.setEnabled( false ); - ruc2Btn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, gfsBtn.getBounds().y + gfsBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - ruc2Btn.setFont(newFont); - ruc2Btn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.RUC2SND; - createPFCAvailableFileList(); - } - } ); - rucpBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - rucpBtn.setText("RUCPTYPSND"); - rucpBtn.setEnabled( false ); - rucpBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, ruc2Btn.getBounds().y + ruc2Btn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - rucpBtn.setFont(newFont); - rucpBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.RUCPTYPSND; - createPFCAvailableFileList(); - } - } ); - browseBtn = new Button(fileTypeGp, SWT.RADIO | SWT.BORDER); - browseBtn.setText("BROWSE"); - browseBtn.setEnabled( false ); - browseBtn.setBounds(fileTypeGp.getBounds().x+ NsharpConstants.btnGapX, rucpBtn.getBounds().y + rucpBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - browseBtn.setFont(newFont); - browseBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - currentSndType = NcSoundingProfile.PfcSndType.BROWSE; - } - } ); */ timeBtn = new Button(parent, SWT.CHECK | SWT.BORDER); @@ -235,18 +250,8 @@ public class PfcSoundingDialogContents { //create a selection listener to handle user's selection on list availablefileList.setFont(newFont); availablefileList.addListener ( SWT.Selection, new Listener () { - private String selectedFile=null; - public void handleEvent (Event e) { - if (availablefileList.getSelectionCount() > 0 ) { - selectedFileList.clear(); - for(int i=0; i < availablefileList.getSelectionCount(); i++) { - selectedFile = availablefileList.getSelection()[i]; - //System.out.println("selected sounding file is " + selectedFile); - selectedFileList.add(selectedFile); - } - createPFCSndTimeList(selectedFileList); - } + handleAvailFileListSelection(); } } ); @@ -259,54 +264,32 @@ public class PfcSoundingDialogContents { sndTimeList.setFont(newFont); sndTimeList.setBounds(sndTimeListGp.getBounds().x, sndTimeListGp.getBounds().y + NsharpConstants.labelGap, NsharpConstants.listWidth, NsharpConstants.listHeight*36/5 ); sndTimeList.addListener ( SWT.Selection, new Listener () { - private String selectedSndTime=null; + // private String selectedSndTime=null; public void handleEvent (Event e) { - if (sndTimeList.getSelectionCount() > 0 ) { - NsharpMapResource nsharpMapResource = NsharpMapResource.getOrCreateNsharpMapResource();//NsharpLoadDialog.getAccess().getNsharpMapResource(); - nsharpMapResource.setPoints(null); - //.clear(); - ldDia.startWaitCursor(); - queriedTimeList.clear(); - for(int i=0; i < sndTimeList.getSelectionCount(); i++) { - selectedSndTime = sndTimeList.getSelection()[i]; - int endIndex = selectedSndTime.indexOf(" "); - selectedSndTime = selectedSndTime.substring(0, endIndex); - //System.out.println("selected sounding time is " + selectedSndTime); - //refTimeStr is same as "PFC file" name in Load dialog display - String refTimeStr=NcSoundingQuery.convertSoundTimeDispStringToRefTime(selectedSndTime); - //while rangeStartStr is same as "sounding Times - String rangeStartStr = NcSoundingQuery.convertSoundTimeDispStringToRangeStartTimeFormat(selectedSndTime); - if(queriedTimeList.contains(refTimeStr)== true){ - addStnPtWithoutQuery(refTimeStr,rangeStartStr,selectedSndTime); - } - else { - queriedTimeList.add(refTimeStr); - queryAndMarkStn(refTimeStr,rangeStartStr,selectedSndTime); - } + handleSndTimeSelection(); } - ldDia.stopWaitCursor(); - - nsharpMapResource.setPoints(stnPoints); - NsharpMapResource.bringMapEditorToTop(); - } - } }); - /* - newTabBtn = new Button(parent, SWT.CHECK | SWT.BORDER); - newTabBtn.setText("new skewT editor"); - newTabBtn.setEnabled( true ); - //newTabBtn.setBounds(btnGp.getBounds().x+ NsharpConstants.btnGapX, browseBtn.getBounds().y + browseBtn.getBounds().height+ NsharpConstants.btnGapY, NsharpConstants.btnWidth,NsharpConstants.btnHeight); - newTabBtn.setFont(newFont); - newTabBtn.addListener( SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - if(newTabBtn.getSelection()) - newtab = true; + if(currentSndType==NcSoundingProfile.PfcSndType.GFSSND || currentSndType==NcSoundingProfile.PfcSndType.NAMSND){ + if(currentSndType==NcSoundingProfile.PfcSndType.GFSSND) + gfsBtn.setSelection(true); else - newtab = false; + namBtn.setSelection(true); + createPFCAvailableFileList(); + selectedFileList = ldDia.getPfcSelectedFileList(); + Object[] selFileObjectArray = selectedFileList.toArray(); + String[] selFileStringArray = Arrays.copyOf(selFileObjectArray, selFileObjectArray.length, String[].class); + availablefileList.setSelection(selFileStringArray); + handleAvailFileListSelection(); + + selectedTimeList = ldDia.getPfcSelectedTimeList(); + Object[] selTimeObjectArray = selectedTimeList.toArray(); + String[] selTimeStringArray = Arrays.copyOf(selTimeObjectArray, selTimeObjectArray.length, String[].class); + sndTimeList.setSelection(selTimeStringArray); + handleSndTimeSelection(); + } - } );*/ } private void addStnPtWithoutQuery(String refTimeStr,String rangeStartStr, String selectedSndTime) { diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.ui.pgen/META-INF/MANIFEST.MF index a5b5978152..0fce5a4dd4 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/META-INF/MANIFEST.MF +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/META-INF/MANIFEST.MF @@ -26,6 +26,7 @@ Require-Bundle: org.eclipse.ui, Bundle-ActivationPolicy: lazy Export-Package: gov.noaa.nws.ncep.ui.pgen, gov.noaa.nws.ncep.ui.pgen.attrdialog, + gov.noaa.nws.ncep.ui.pgen.clipper, gov.noaa.nws.ncep.ui.pgen.contours, gov.noaa.nws.ncep.ui.pgen.controls, gov.noaa.nws.ncep.ui.pgen.display, diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/icons/clip.gif b/ncep/gov.noaa.nws.ncep.ui.pgen/icons/clip.gif new file mode 100644 index 0000000000..295a867051 Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.ui.pgen/icons/clip.gif differ diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/linePatterns.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/linePatterns.xml index 0762efe8c2..08c05c7151 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/linePatterns.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/linePatterns.xml @@ -45,6 +45,13 @@ + + SHEAR_LINE + + + + + ZZZ_LINE diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooksettings.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooksettings.xml index 0559a85535..48a70a0dbc 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooksettings.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooksettings.xml @@ -1,6 +1,6 @@ - - + + @@ -66,7 +66,7 @@ - + EXT_FIRE @@ -418,7 +418,7 @@ - + 6 @@ -931,7 +931,7 @@ - + @@ -947,7 +947,7 @@ - + @@ -961,19 +961,51 @@ - + - + - - - + + + - - DRY-TSTM + + DRY-T + + + + + + + + + + + + + + + + ISOLD DRY-T + + + + + + + + + + + + + + + + SCT DRY-T @@ -2077,8 +2109,8 @@ - - + + @@ -2094,7 +2126,7 @@ - + @@ -2110,7 +2142,7 @@ - + @@ -2127,8 +2159,8 @@ - - + + @@ -2144,7 +2176,7 @@ - + @@ -2160,7 +2192,7 @@ - + @@ -2176,150 +2208,6 @@ - diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooktype.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooktype.xml index 7b942053b0..6314dc0afe 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooktype.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/outlooktype.xml @@ -96,9 +96,12 @@ + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/productTypes.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/productTypes.xml index cc3d319af2..fd610e6f12 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/productTypes.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/productTypes.xml @@ -1,10474 +1,10708 @@ - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - NUCLEAR_FALLOUT - PRESENT_WX_201 - - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - POINTED_ARROW - LINE_DASHED_6 - SCALLOPED - - - - - JET - Cloud - Turbulence - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - - - - - LINE_SOLID - POINTED_ARROW - LINE_DASHED_3 - LINE_DASHED_6 - SCALLOPED - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - - - - - LINE_SOLID - POINTED_ARROW - LINE_DASHED_3 - LINE_DASHED_6 - SCALLOPED - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - - - - - LINE_SOLID - POINTED_ARROW - LINE_DASHED_3 - LINE_DASHED_6 - SCALLOPED - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - - - - - LINE_SOLID - POINTED_ARROW - LINE_DASHED_3 - LINE_DASHED_6 - SCALLOPED - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - - - - - LINE_SOLID - POINTED_ARROW - LINE_DASHED_3 - LINE_DASHED_6 - SCALLOPED - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - STORM_TRACK - - - - - CCFP_SIGMET - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - TROPICAL_STORM_NH - HURRICANE_NH - PRESENT_WX_201 - - - - - - - - STORM_TRACK - - - - - INTL_SIGMET - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - STORM_TRACK - - - - - CONV_SIGMET - OUTL_SIGMET - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - STORM_TRACK - - - - - NCON_SIGMET - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - - - - GFA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - MultiSelect - Move - Delete - Copy - Delete Point - Undo - Redo - Add Point - Add Point Alt - - - - General Text - - - - - VOLC_SIGMET - VACL_SIGMET - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Delete Point - Delete Part - Delete All - Undo - Redo - Extrap - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - - - Open - Save - Save As - Exit - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TROPICAL_DEPRESSION - - - - - - - - General Text - - - - - LINE_SOLID - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - - - - - Contours - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Refresh - Start Layer - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Rotate - Flip - Delete Point - Delete Part - Delete Obj - Delete All - Undo - Redo - Extrap - Interp - Filter - From - PROD_AIRMET - Cycle - Add Point - Add Point Alt - Distance - IncDec - - - - COLD_FRONT - COLD_FRONT_FORM - COLD_FRONT_DISS - WARM_FRONT - WARM_FRONT_FORM - WARM_FRONT_DISS - STATIONARY_FRONT - STATIONARY_FRONT_FORM - STATIONARY_FRONT_DISS - OCCLUDED_FRONT - OCCLUDED_FRONT_FORM - OCCLUDED_FRONT_DISS - TROF - TROPICAL_TROF - DRY_LINE - INSTABILITY - - - - - PRESENT_WX_061|PRESENT_WX_051 - PRESENT_WX_061|PRESENT_WX_063 - PRESENT_WX_061|PRESENT_WX_080 - PRESENT_WX_061|PRESENT_WX_095 - PRESENT_WX_063|PRESENT_WX_065 - PRESENT_WX_063|PRESENT_WX_080 - PRESENT_WX_063|PRESENT_WX_095 - PRESENT_WX_065|PRESENT_WX_080 - PRESENT_WX_065|PRESENT_WX_095 - PRESENT_WX_051|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_056 - PRESENT_WX_061|PRESENT_WX_066 - PRESENT_WX_061|PRESENT_WX_071 - PRESENT_WX_071|PRESENT_WX_073 - PRESENT_WX_073|PRESENT_WX_075 - PRESENT_WX_071|PRESENT_WX_085 - PRESENT_WX_073|PRESENT_WX_085 - PRESENT_WX_075|PRESENT_WX_085 - PRESENT_WX_071|PRESENT_WX_105 - PRESENT_WX_073|PRESENT_WX_105 - PRESENT_WX_075|PRESENT_WX_105 - PRESENT_WX_080|PRESENT_WX_095 - PRESENT_WX_080|PRESENT_WX_085 - PRESENT_WX_061|PRESENT_WX_079 - PRESENT_WX_079|PRESENT_WX_066 - PRESENT_WX_071|PRESENT_WX_079 - - - - - FILLED_HIGH_PRESSURE_H - FILLED_LOW_PRESSURE_L - HIGH_PRESSURE_H - LOW_PRESSURE_L - SQUARE - FILLED_SQUARE - CIRCLE - FILLED_CIRCLE - TRIANGLE_SPCL - FILLED_TRIANGLE_SPCL - DIAMOND_SPCL - FILLED_DIAMOND_SPCL - STAR_SPCL - FILLED_STAR_SPCL - SINGLE_BRACKET - BOTTOM_HALF_OF_BRACKET - TOP_HALF_OF_BRACKET - LEFT_ADJUSTED_VERTICAL_BAR - RIGHT_ADJUSTED_VERTICAL_BAR - BRACKET_WITH_ONE_CIRCLE - BRACKET_WITH_TWO_CIRCLES - BRACKET_WITH_ONE_ASTERISK - BRACKET_WITH_TWO_ASTERISKS - BRACKET_WITH_ONE_TRIANGLE - BRACKET_WITH_TWO_TRIANGLES - TROPICAL_STORM_NH - HURRICANE_NH - TROPICAL_STORM_SH - HURRICANE_SH - TRIANGLE_WITH_ANTENNA - SIDEWAYS_S - SLASH - STORM_CENTER - TROPICAL_DEPRESSION - TROPICAL_CYCLONE - FLAME - X_CROSS - LOW_X_OUTLINE - LOW_X_FILLED - TROPICAL_STORM_NH_WPAC - TROPICAL_STORM_SH_WPAC - NUCLEAR_FALLOUT - LETTER_A - LETTER_A_FILLED - LETTER_C - LETTER_C_FILLED - LETTER_X - LETTER_X_FILLED - LETTER_N - LETTER_N_FILLED - 30_KT_BARB - MT_WAVE - MT_OBSC - SFC_WND_20K - SFC_WND_30K - LETTER_B - LETTER_B_FILLED - UP_ARROW_SPCL - DOWN_ARROW_SPCL - PRESENT_WX_000 - PRESENT_WX_001 - PRESENT_WX_002 - PRESENT_WX_003 - PRESENT_WX_004 - PRESENT_WX_005 - PRESENT_WX_006 - PRESENT_WX_007 - PRESENT_WX_008 - PRESENT_WX_009 - PRESENT_WX_010 - PRESENT_WX_011 - PRESENT_WX_012 - PRESENT_WX_013 - PRESENT_WX_014 - PRESENT_WX_015 - PRESENT_WX_016 - PRESENT_WX_017 - PRESENT_WX_018 - PRESENT_WX_019 - PRESENT_WX_020 - PRESENT_WX_021 - PRESENT_WX_022 - PRESENT_WX_023 - PRESENT_WX_024 - PRESENT_WX_025 - PRESENT_WX_026 - PRESENT_WX_027 - PRESENT_WX_028 - PRESENT_WX_029 - PRESENT_WX_030 - PRESENT_WX_031 - PRESENT_WX_032 - PRESENT_WX_033 - PRESENT_WX_034 - PRESENT_WX_035 - PRESENT_WX_036 - PRESENT_WX_037 - PRESENT_WX_038 - PRESENT_WX_039 - PRESENT_WX_040 - PRESENT_WX_041 - PRESENT_WX_042 - PRESENT_WX_043 - PRESENT_WX_044 - PRESENT_WX_045 - PRESENT_WX_046 - PRESENT_WX_047 - PRESENT_WX_048 - PRESENT_WX_049 - PRESENT_WX_050 - PRESENT_WX_051 - PRESENT_WX_052 - PRESENT_WX_053 - PRESENT_WX_054 - PRESENT_WX_055 - PRESENT_WX_056 - PRESENT_WX_057 - PRESENT_WX_058 - PRESENT_WX_059 - PRESENT_WX_060 - PRESENT_WX_061 - PRESENT_WX_062 - PRESENT_WX_063 - PRESENT_WX_064 - PRESENT_WX_065 - PRESENT_WX_066 - PRESENT_WX_067 - PRESENT_WX_068 - PRESENT_WX_069 - PRESENT_WX_070 - PRESENT_WX_071 - PRESENT_WX_072 - PRESENT_WX_073 - PRESENT_WX_074 - PRESENT_WX_075 - PRESENT_WX_076 - PRESENT_WX_077 - PRESENT_WX_078 - PRESENT_WX_079 - PRESENT_WX_080 - PRESENT_WX_081 - PRESENT_WX_082 - PRESENT_WX_083 - PRESENT_WX_084 - PRESENT_WX_085 - PRESENT_WX_086 - PRESENT_WX_087 - PRESENT_WX_088 - PRESENT_WX_089 - PRESENT_WX_090 - PRESENT_WX_091 - PRESENT_WX_092 - PRESENT_WX_093 - PRESENT_WX_094 - PRESENT_WX_095 - PRESENT_WX_096 - PRESENT_WX_097 - PRESENT_WX_098 - PRESENT_WX_099 - PRESENT_WX_103 - PRESENT_WX_104 - PRESENT_WX_105 - PRESENT_WX_107 - PRESENT_WX_201 - PRESENT_WX_202 - PRESENT_WX_203 - ICING_00 - ICING_01 - ICING_02 - ICING_03 - ICING_04 - ICING_05 - ICING_06 - ICING_07 - ICING_08 - ICING_09 - ICING_10 - PAST_WX_03 - PAST_WX_04 - PAST_WX_05 - PAST_WX_06 - PAST_WX_07 - PAST_WX_08 - PAST_WX_09 - CLOUD_TYPE_01 - CLOUD_TYPE_02 - CLOUD_TYPE_03 - CLOUD_TYPE_04 - CLOUD_TYPE_05 - CLOUD_TYPE_06 - CLOUD_TYPE_07 - CLOUD_TYPE_08 - CLOUD_TYPE_09 - CLOUD_TYPE_11 - CLOUD_TYPE_12 - CLOUD_TYPE_13 - CLOUD_TYPE_14 - CLOUD_TYPE_15 - CLOUD_TYPE_16 - CLOUD_TYPE_17 - CLOUD_TYPE_18 - CLOUD_TYPE_19 - CLOUD_TYPE_21 - CLOUD_TYPE_22 - CLOUD_TYPE_23 - CLOUD_TYPE_24 - CLOUD_TYPE_25 - CLOUD_TYPE_26 - CLOUD_TYPE_27 - CLOUD_TYPE_28 - CLOUD_TYPE_29 - PRESSURE_TENDENCY_00 - PRESSURE_TENDENCY_01 - PRESSURE_TENDENCY_02 - PRESSURE_TENDENCY_03 - PRESSURE_TENDENCY_04 - PRESSURE_TENDENCY_05 - PRESSURE_TENDENCY_06 - PRESSURE_TENDENCY_07 - PRESSURE_TENDENCY_08 - SKY_COVER_00 - SKY_COVER_01 - SKY_COVER_02 - SKY_COVER_03 - SKY_COVER_04 - SKY_COVER_05 - SKY_COVER_06 - SKY_COVER_07 - SKY_COVER_08 - SKY_COVER_09 - SKY_COVER_10 - - - - - - - - STORM_TRACK - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - INTL_SIGMET - CONV_SIGMET - AIRM_SIGMET - NCON_SIGMET - OUTL_SIGMET - CCFP_SIGMET - VOLC_SIGMET - VACL_SIGMET - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - Arrow - Barb - Directional - Hash - - - - - Circle - - - - - PLUS_SIGN - OCTAGON - TRIANGLE - BOX - SMALL_X - Z_WITH_BAR - X_WITH_TOP_BAR - DIAMOND - UP_ARROW - Y - BOX_WITH_DIAGONALS - ASTERISK - HOURGLASS_X - STAR - DOT - LARGE_X - FILLED_OCTAGON - FILLED_TRIANGLE - FILLED_BOX - FILLED_DIAMOND - FILLED_STAR - MINUS_SIGN - - - - - JET - TCA - GFA - Contours - Outlook - WatchBox - Cloud - Turbulence - TCM - - - - - - - Open - Save - Save As - Exit - Restore - Save All - ProdCtrl - - - Select - Modify - Connect - MultiSelect - Move - Delete - Copy - Flip - Delete Point - Delete Part - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - - - - - - - - - - - - - - - - - - - Open - Save - Save As - Exit - Restore - Save All - ProdCtrl - - - Select - Modify - Move - Delete - Flip - Delete Point - Delete All - Undo - Redo - Add Point - Add Point Alt - - - - - - - General Text - AVIATION_TEXT - MID_LEVEL_CLOUD - - - - - LINE_SOLID - POINTED_ARROW - FILLED_ARROW - LINE_DASHED_2 - LINE_DASHED_3 - LINE_DASHED_4 - LINE_DASHED_5 - LINE_DASHED_6 - LINE_DASHED_7 - LINE_DASHED_8 - LINE_DASHED_9 - LINE_DASHED_10 - DASHED_ARROW - DASHED_ARROW_FILLED - BALL_CHAIN - ZIGZAG - SCALLOPED - ANGLED_TICKS_ALT - FILLED_CIRCLES - LINE_WITH_CARETS - LINE_CARET_LINE - SINE_CURVE - BOX_CIRCLE - FILL_OPEN_BOX - LINE_X_LINE - LINE_XX_LINE - FILL_CIRCLE_X - BOX_X - LINE_CIRCLE_ARROW - DOUBLE_LINE - ZZZ_LINE - TICK_MARKS - STREAM_LINE - LINE_FILLED_CIRCLE_ARROW - - - - - - - - - - - - - - - - - - + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + NUCLEAR_FALLOUT + PRESENT_WX_201 + + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + POINTED_ARROW + LINE_DASHED_6 + SCALLOPED + + + + + JET + Cloud + Turbulence + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + + + + + LINE_SOLID + POINTED_ARROW + LINE_DASHED_3 + LINE_DASHED_6 + SCALLOPED + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + + + + + LINE_SOLID + POINTED_ARROW + LINE_DASHED_3 + LINE_DASHED_6 + SCALLOPED + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + + + + + LINE_SOLID + POINTED_ARROW + LINE_DASHED_3 + LINE_DASHED_6 + SCALLOPED + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + + + + + LINE_SOLID + POINTED_ARROW + LINE_DASHED_3 + LINE_DASHED_6 + SCALLOPED + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + + + + + LINE_SOLID + POINTED_ARROW + LINE_DASHED_3 + LINE_DASHED_6 + SCALLOPED + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + STORM_TRACK + + + + + CCFP_SIGMET + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + TROPICAL_STORM_NH + HURRICANE_NH + PRESENT_WX_201 + + + + + + + + STORM_TRACK + + + + + INTL_SIGMET + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + STORM_TRACK + + + + + CONV_SIGMET + OUTL_SIGMET + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + STORM_TRACK + + + + + NCON_SIGMET + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + + + + GFA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + MultiSelect + Move + Delete + Copy + Delete Point + Undo + Redo + Add Point + Add Point Alt + + + + General Text + + + + + VOLC_SIGMET + VACL_SIGMET + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Delete Point + Delete Part + Delete All + Undo + Redo + Extrap + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + + + Open + Save + Save As + Exit + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TROPICAL_DEPRESSION + + + + + + + + General Text + + + + + LINE_SOLID + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + + + + + Contours + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Filter + From + PROD_AIRMET + Cycle + Add Point + Add Point Alt + Distance + IncDec + + + + COLD_FRONT + COLD_FRONT_FORM + COLD_FRONT_DISS + WARM_FRONT + WARM_FRONT_FORM + WARM_FRONT_DISS + STATIONARY_FRONT + STATIONARY_FRONT_FORM + STATIONARY_FRONT_DISS + OCCLUDED_FRONT + OCCLUDED_FRONT_FORM + OCCLUDED_FRONT_DISS + TROF + TROPICAL_TROF + DRY_LINE + INSTABILITY + + + + + PRESENT_WX_061|PRESENT_WX_051 + PRESENT_WX_061|PRESENT_WX_063 + PRESENT_WX_061|PRESENT_WX_080 + PRESENT_WX_061|PRESENT_WX_095 + PRESENT_WX_063|PRESENT_WX_065 + PRESENT_WX_063|PRESENT_WX_080 + PRESENT_WX_063|PRESENT_WX_095 + PRESENT_WX_065|PRESENT_WX_080 + PRESENT_WX_065|PRESENT_WX_095 + PRESENT_WX_051|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_056 + PRESENT_WX_061|PRESENT_WX_066 + PRESENT_WX_061|PRESENT_WX_071 + PRESENT_WX_071|PRESENT_WX_073 + PRESENT_WX_073|PRESENT_WX_075 + PRESENT_WX_071|PRESENT_WX_085 + PRESENT_WX_073|PRESENT_WX_085 + PRESENT_WX_075|PRESENT_WX_085 + PRESENT_WX_071|PRESENT_WX_105 + PRESENT_WX_073|PRESENT_WX_105 + PRESENT_WX_075|PRESENT_WX_105 + PRESENT_WX_080|PRESENT_WX_095 + PRESENT_WX_080|PRESENT_WX_085 + PRESENT_WX_061|PRESENT_WX_079 + PRESENT_WX_079|PRESENT_WX_066 + PRESENT_WX_071|PRESENT_WX_079 + + + + + FILLED_HIGH_PRESSURE_H + FILLED_LOW_PRESSURE_L + HIGH_PRESSURE_H + LOW_PRESSURE_L + SQUARE + FILLED_SQUARE + CIRCLE + FILLED_CIRCLE + TRIANGLE_SPCL + FILLED_TRIANGLE_SPCL + DIAMOND_SPCL + FILLED_DIAMOND_SPCL + STAR_SPCL + FILLED_STAR_SPCL + SINGLE_BRACKET + BOTTOM_HALF_OF_BRACKET + TOP_HALF_OF_BRACKET + LEFT_ADJUSTED_VERTICAL_BAR + RIGHT_ADJUSTED_VERTICAL_BAR + BRACKET_WITH_ONE_CIRCLE + BRACKET_WITH_TWO_CIRCLES + BRACKET_WITH_ONE_ASTERISK + BRACKET_WITH_TWO_ASTERISKS + BRACKET_WITH_ONE_TRIANGLE + BRACKET_WITH_TWO_TRIANGLES + TROPICAL_STORM_NH + HURRICANE_NH + TROPICAL_STORM_SH + HURRICANE_SH + TRIANGLE_WITH_ANTENNA + SIDEWAYS_S + SLASH + STORM_CENTER + TROPICAL_DEPRESSION + TROPICAL_CYCLONE + FLAME + X_CROSS + LOW_X_OUTLINE + LOW_X_FILLED + TROPICAL_STORM_NH_WPAC + TROPICAL_STORM_SH_WPAC + NUCLEAR_FALLOUT + LETTER_A + LETTER_A_FILLED + LETTER_C + LETTER_C_FILLED + LETTER_X + LETTER_X_FILLED + LETTER_N + LETTER_N_FILLED + 30_KT_BARB + MT_WAVE + MT_OBSC + SFC_WND_20K + SFC_WND_30K + LETTER_B + LETTER_B_FILLED + UP_ARROW_SPCL + DOWN_ARROW_SPCL + PRESENT_WX_000 + PRESENT_WX_001 + PRESENT_WX_002 + PRESENT_WX_003 + PRESENT_WX_004 + PRESENT_WX_005 + PRESENT_WX_006 + PRESENT_WX_007 + PRESENT_WX_008 + PRESENT_WX_009 + PRESENT_WX_010 + PRESENT_WX_011 + PRESENT_WX_012 + PRESENT_WX_013 + PRESENT_WX_014 + PRESENT_WX_015 + PRESENT_WX_016 + PRESENT_WX_017 + PRESENT_WX_018 + PRESENT_WX_019 + PRESENT_WX_020 + PRESENT_WX_021 + PRESENT_WX_022 + PRESENT_WX_023 + PRESENT_WX_024 + PRESENT_WX_025 + PRESENT_WX_026 + PRESENT_WX_027 + PRESENT_WX_028 + PRESENT_WX_029 + PRESENT_WX_030 + PRESENT_WX_031 + PRESENT_WX_032 + PRESENT_WX_033 + PRESENT_WX_034 + PRESENT_WX_035 + PRESENT_WX_036 + PRESENT_WX_037 + PRESENT_WX_038 + PRESENT_WX_039 + PRESENT_WX_040 + PRESENT_WX_041 + PRESENT_WX_042 + PRESENT_WX_043 + PRESENT_WX_044 + PRESENT_WX_045 + PRESENT_WX_046 + PRESENT_WX_047 + PRESENT_WX_048 + PRESENT_WX_049 + PRESENT_WX_050 + PRESENT_WX_051 + PRESENT_WX_052 + PRESENT_WX_053 + PRESENT_WX_054 + PRESENT_WX_055 + PRESENT_WX_056 + PRESENT_WX_057 + PRESENT_WX_058 + PRESENT_WX_059 + PRESENT_WX_060 + PRESENT_WX_061 + PRESENT_WX_062 + PRESENT_WX_063 + PRESENT_WX_064 + PRESENT_WX_065 + PRESENT_WX_066 + PRESENT_WX_067 + PRESENT_WX_068 + PRESENT_WX_069 + PRESENT_WX_070 + PRESENT_WX_071 + PRESENT_WX_072 + PRESENT_WX_073 + PRESENT_WX_074 + PRESENT_WX_075 + PRESENT_WX_076 + PRESENT_WX_077 + PRESENT_WX_078 + PRESENT_WX_079 + PRESENT_WX_080 + PRESENT_WX_081 + PRESENT_WX_082 + PRESENT_WX_083 + PRESENT_WX_084 + PRESENT_WX_085 + PRESENT_WX_086 + PRESENT_WX_087 + PRESENT_WX_088 + PRESENT_WX_089 + PRESENT_WX_090 + PRESENT_WX_091 + PRESENT_WX_092 + PRESENT_WX_093 + PRESENT_WX_094 + PRESENT_WX_095 + PRESENT_WX_096 + PRESENT_WX_097 + PRESENT_WX_098 + PRESENT_WX_099 + PRESENT_WX_103 + PRESENT_WX_104 + PRESENT_WX_105 + PRESENT_WX_107 + PRESENT_WX_201 + PRESENT_WX_202 + PRESENT_WX_203 + ICING_00 + ICING_01 + ICING_02 + ICING_03 + ICING_04 + ICING_05 + ICING_06 + ICING_07 + ICING_08 + ICING_09 + ICING_10 + PAST_WX_03 + PAST_WX_04 + PAST_WX_05 + PAST_WX_06 + PAST_WX_07 + PAST_WX_08 + PAST_WX_09 + CLOUD_TYPE_01 + CLOUD_TYPE_02 + CLOUD_TYPE_03 + CLOUD_TYPE_04 + CLOUD_TYPE_05 + CLOUD_TYPE_06 + CLOUD_TYPE_07 + CLOUD_TYPE_08 + CLOUD_TYPE_09 + CLOUD_TYPE_11 + CLOUD_TYPE_12 + CLOUD_TYPE_13 + CLOUD_TYPE_14 + CLOUD_TYPE_15 + CLOUD_TYPE_16 + CLOUD_TYPE_17 + CLOUD_TYPE_18 + CLOUD_TYPE_19 + CLOUD_TYPE_21 + CLOUD_TYPE_22 + CLOUD_TYPE_23 + CLOUD_TYPE_24 + CLOUD_TYPE_25 + CLOUD_TYPE_26 + CLOUD_TYPE_27 + CLOUD_TYPE_28 + CLOUD_TYPE_29 + PRESSURE_TENDENCY_00 + PRESSURE_TENDENCY_01 + PRESSURE_TENDENCY_02 + PRESSURE_TENDENCY_03 + PRESSURE_TENDENCY_04 + PRESSURE_TENDENCY_05 + PRESSURE_TENDENCY_06 + PRESSURE_TENDENCY_07 + PRESSURE_TENDENCY_08 + SKY_COVER_00 + SKY_COVER_01 + SKY_COVER_02 + SKY_COVER_03 + SKY_COVER_04 + SKY_COVER_05 + SKY_COVER_06 + SKY_COVER_07 + SKY_COVER_08 + SKY_COVER_09 + SKY_COVER_10 + + + + + + + + STORM_TRACK + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + INTL_SIGMET + CONV_SIGMET + AIRM_SIGMET + NCON_SIGMET + OUTL_SIGMET + CCFP_SIGMET + VOLC_SIGMET + VACL_SIGMET + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Arrow + Barb + Directional + Hash + + + + + Circle + + + + + PLUS_SIGN + OCTAGON + TRIANGLE + BOX + SMALL_X + Z_WITH_BAR + X_WITH_TOP_BAR + DIAMOND + UP_ARROW + Y + BOX_WITH_DIAGONALS + ASTERISK + HOURGLASS_X + STAR + DOT + LARGE_X + FILLED_OCTAGON + FILLED_TRIANGLE + FILLED_BOX + FILLED_DIAMOND + FILLED_STAR + MINUS_SIGN + + + + + JET + TCA + GFA + Contours + Outlook + WatchBox + Cloud + Turbulence + TCM + + + + + + + Open + Save + Save As + Exit + Restore + Save All + ProdCtrl + + + Select + Modify + Connect + MultiSelect + Move + Delete + Copy + Flip + Delete Point + Delete Part + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + Outlook + + + + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Restore + Save All + ProdCtrl + + + Select + Modify + Move + Delete + Flip + Delete Point + Delete All + Undo + Redo + Add Point + Add Point Alt + + + + + + + General Text + + + + + LINE_SOLID + POINTED_ARROW + FILLED_ARROW + LINE_DASHED_2 + LINE_DASHED_3 + LINE_DASHED_4 + LINE_DASHED_5 + LINE_DASHED_6 + LINE_DASHED_7 + LINE_DASHED_8 + LINE_DASHED_9 + LINE_DASHED_10 + DASHED_ARROW + DASHED_ARROW_FILLED + BALL_CHAIN + ZIGZAG + SCALLOPED + ANGLED_TICKS_ALT + FILLED_CIRCLES + LINE_WITH_CARETS + LINE_CARET_LINE + SINE_CURVE + BOX_CIRCLE + FILL_OPEN_BOX + LINE_X_LINE + LINE_XX_LINE + FILL_CIRCLE_X + BOX_X + LINE_CIRCLE_ARROW + DOUBLE_LINE + ZZZ_LINE + TICK_MARKS + STREAM_LINE + LINE_FILLED_CIRCLE_ARROW + + + + + + + + + + + + + + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Add Point + Add Point Alt + Distance + IncDec + + + + + + + General Text + + + + + Outlook + + + + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Add Point + Add Point Alt + Distance + IncDec + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + Outlook + + + + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Add Point + Add Point Alt + Distance + IncDec + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + Outlook + + + + + + + + + + + + + Open + Save + Save As + Exit + Restore + Refresh + Start Layer + Save All + ProdCtrl + + + Select + Modify + Move + Delete + Copy + Rotate + Flip + Delete Point + Delete Part + Delete Obj + Delete All + Undo + Redo + Extrap + Interp + Add Point + Add Point Alt + Distance + IncDec + + + + + + + General Text + AVIATION_TEXT + MID_LEVEL_CLOUD + + + + + Outlook + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/settings_tbl.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/settings_tbl.xml index 97ab55b1e0..285add15c4 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/settings_tbl.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/localization/ncep/pgen/settings_tbl.xml @@ -120,6 +120,11 @@ + + + + + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/plugin.xml b/ncep/gov.noaa.nws.ncep.ui.pgen/plugin.xml index e5d096383a..c901f49726 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/plugin.xml +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/plugin.xml @@ -284,6 +284,17 @@ id="layerIndex" name="layerIndex"/> + + + + +
+ + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenClipboard.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenClipboard.java new file mode 100644 index 0000000000..3c4f765437 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenClipboard.java @@ -0,0 +1,96 @@ +/* + * PgenClipboard + * + * Date created: 01/02/2013 + * + * This code has been developed by the NCEP/SIB for use in the AWIPS2 system. + */ +package gov.noaa.nws.ncep.ui.pgen; + +import java.util.ArrayList; +import java.util.List; + +import gov.noaa.nws.ncep.ui.pgen.elements.AbstractDrawableComponent; + +/** + * This singleton is intended to hold copy/cut/paste PGEN elements. + * + *
+ * SOFTWARE HISTORY
+ * Date       	Ticket#		Engineer	Description
+ * ------------	----------	-----------	--------------------------
+ * 01/2013		#967		Jun Wu  	Initial Creation.
+ * 
+ * 
+ * + * @author J. Wu + * + */ +public class PgenClipboard { + + /* + * The singleton instance + */ + private static PgenClipboard instance = null; + + /* + * List of elements that be selected for cut/paste + */ + private List elSelected = null; + + /* + * Hide default constructor + */ + private PgenClipboard() { + + } + + /** + * Static method to get THE PgenSession instance + * @return PgenSession reference + */ + public static synchronized PgenClipboard getInstance() { + + if ( instance == null ) instance = new PgenClipboard(); + return instance; + } + + /** + * @param elSelected the elSelected to set + */ + public void setElSelected(List elSelected) { + this.elSelected = elSelected; + } + + /** + * @return the elSelected + */ + public List getElSelected() { + return elSelected; + } + + /** + * @return none + */ + public void clear() { + elSelected.clear(); + } + + /** + * Remove the existing elements and copy the input elements. + * + * @return none + */ + public void copy( List elSelected ) { + if ( this.elSelected == null ) { + this.elSelected = new ArrayList(); + } + + clear(); + for ( AbstractDrawableComponent el : elSelected ) { + this.elSelected.add( el.copy() ); + } + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenUtil.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenUtil.java index e5b0ef5c09..f4d5055b21 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenUtil.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/PgenUtil.java @@ -218,8 +218,18 @@ public class PgenUtil { setCommandMode("gov.noaa.nws.ncep.ui.pgen.rsc.PgenSelect"); } + /** - * set current ModalTool to Selecting mode + * set current ModalTool to "MultiSelect" mode + */ + public static final void setMultiSelectMode() { + + setCommandMode("gov.noaa.nws.ncep.ui.pgen.rsc.PgenMultiSelect"); + + } + + /** + * set current ModalTool to "DelectObj" mode */ public static final void setDelObjMode() { setCommandMode("gov.noaa.nws.ncep.ui.pgen.rsc.PgenDeleteObj"); diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookAttrDlg.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookAttrDlg.java index f474f4f6ae..e05584bf92 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookAttrDlg.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookAttrDlg.java @@ -175,9 +175,13 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ //Format button private Button fmtBtn; + //previous selection of text label private String prevLbl; + //previous selection of outlook type + private String prevType;; + //default value for 'UseLineColor' button private boolean useLineColor; @@ -202,6 +206,8 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ private boolean flagLabel = true; private boolean flagAction = true; + private String defaultLinetype = "POINTED_ARROW"; + private String lineType = defaultLinetype; /** * Private constructor @@ -324,6 +330,8 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ @Override public void widgetSelected(SelectionEvent e) { String type = ((Combo)(e.widget)).getText(); + prevType = type; + boolean warning = false; //Loop through current layer and see if there is a different type of outlook. @@ -373,6 +381,11 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ } }); + if ( prevType == null ){ + outlookCombo.select( 0 ); + prevType = outlookCombo.getText(); + } + //Check box for label lblBtn = new Button( panel1, SWT.CHECK ); lblBtn.setText("Label:"); @@ -602,7 +615,8 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ if ( de.getParent().getParent() instanceof Outlook ){ showContLines((Outlook)de.getParent().getParent()); } - else if ( de.getParent().getParent().getParent() instanceof Outlook ){ + else if ( de.getParent().getParent().getParent() != null && + de.getParent().getParent().getParent() instanceof Outlook ){ showContLines((Outlook)de.getParent().getParent().getParent()); } @@ -625,8 +639,13 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ if ( de != null ){ if(fmtDlg == null || ( fmtDlg != null && fmtDlg.getShell() == null ) ) { Outlook otlk = null; - if ( de.getParent().getParent() instanceof Outlook ) otlk = (Outlook)de.getParent().getParent(); - else if ( de.getParent().getParent().getParent() instanceof Outlook) otlk = (Outlook)de.getParent().getParent().getParent(); + if ( de.getParent().getParent() instanceof Outlook ){ + otlk = (Outlook)de.getParent().getParent(); + } + else if ( de.getParent().getParent().getParent() != null && + de.getParent().getParent().getParent()instanceof Outlook){ + otlk = (Outlook)de.getParent().getParent().getParent(); + } if ( otlk != null ) { fmtDlg = new OutlookFormatDlg(OutlookAttrDlg.this.getParentShell(), OutlookAttrDlg.this, otlk); fmtDlg.open(); @@ -1089,6 +1108,18 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ } } + //set outlook type + if ( prevType == null ){ + outlookCombo.select( 0 ); + } + else { + int idx = (outlookCombo.indexOf(prevType)); + if ( idx >= 0 ) outlookCombo.select(idx); + else outlookCombo.select(0); + //Set default labels for the selected outlook type + setDefaultLabels( prevType ); + } + //set label text if ( prevLbl == null ){ txtCombo.select( 0 ); @@ -1417,10 +1448,13 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ * @param type */ public void setOtlkType( String type ){ + int idx = outlookCombo.indexOf(type.toUpperCase()); + if ( idx > 0 ){ outlookCombo.select( outlookCombo.indexOf(type.toUpperCase())); setDefaultLabels( this.getOutlookType()); setDefaultLineAttr( outlookCombo.getText() + txtCombo.getText()); } + } /** * Set the text label to the input string @@ -1522,8 +1556,13 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ Line ln = settings.get(key); if ( ln != null ){ this.setAttrForDlg((IAttribute)ln); + lineType = ln.getPgenType(); + } } } + + public String getLineType(){ + return lineType; } /* @@ -1619,6 +1658,9 @@ public class OutlookAttrDlg extends AttrDlg implements IContours, ILine{ */ private void setInfoBtnText() { + if ( contourParm == null || contourLevel == null + || contourTime1 == null ) return; + String str = contourParm + ", " + contourLevel + "\n" + contourTime1.get(Calendar.YEAR) + "-" + (contourTime1.get(Calendar.MONTH)+ 1) + "-" + diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatDlg.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatDlg.java index d7d2c810a9..6ba68a8767 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatDlg.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatDlg.java @@ -8,9 +8,12 @@ package gov.noaa.nws.ncep.ui.pgen.attrdialog; +import java.awt.Color; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.TimeZone; @@ -22,12 +25,18 @@ import javax.xml.transform.dom.DOMSource; import gov.noaa.nws.ncep.ui.pgen.PgenStaticDataProvider; import gov.noaa.nws.ncep.ui.pgen.PgenUtil; +import gov.noaa.nws.ncep.ui.pgen.clipper.ClipProduct; +import gov.noaa.nws.ncep.ui.pgen.display.FillPatternList.FillPattern; +import gov.noaa.nws.ncep.ui.pgen.elements.DECollection; import gov.noaa.nws.ncep.ui.pgen.elements.Layer; +import gov.noaa.nws.ncep.ui.pgen.elements.Line; import gov.noaa.nws.ncep.ui.pgen.elements.Outlook; import gov.noaa.nws.ncep.ui.pgen.elements.Product; import gov.noaa.nws.ncep.ui.pgen.elements.AbstractDrawableComponent; import gov.noaa.nws.ncep.ui.pgen.file.ProductConverter; import gov.noaa.nws.ncep.ui.pgen.file.Products; +import gov.noaa.nws.ncep.ui.pgen.productmanage.ProductConfigureDialog; +import gov.noaa.nws.ncep.ui.pgen.producttypes.ProductType; import org.dom4j.Document; import org.dom4j.Node; @@ -54,6 +63,7 @@ import org.eclipse.ui.PlatformUI; import com.raytheon.uf.common.localization.LocalizationFile; import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; +import com.vividsolutions.jts.geom.Polygon; /** * Implementation of outlook format dialog. @@ -67,6 +77,8 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; * 03/12 $703 B. Yin Generate product text from style sheet * 05/12 #710 B. Yin Format HAIL outlook first * 07/12 #789 B. Yin Change all time to UTC. + * 11/12 ? B. Yin Fixed the otlkAll exception. + * 01/13 #966 B. Yin Added clipping functions. * * * @@ -76,7 +88,9 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; public class OutlookFormatDlg extends CaveJFACEDialog{ //Outlook initial time and expiration time document - static private Document otlkTimesTbl; + private static Document otlkTimesTbl; + + private static HashMap bounds; //instance of the outlook attribute dialog private OutlookAttrDlg otlkDlg; @@ -279,9 +293,10 @@ public class OutlookFormatDlg extends CaveJFACEDialog{ if ( confirmDlg.getReturnCode() == MessageDialog.OK){ msgDlg = new OutlookFormatMsgDlg(OutlookFormatDlg.this.getParentShell(), OutlookFormatDlg.this, otlk, otlkDlg.drawingLayer.getActiveLayer()); - msgDlg.setBlockOnOpen(false); + msgDlg.setBlockOnOpen(true); msgDlg.setMessage(formatOtlk(otlk, otlkDlg.drawingLayer.getActiveLayer())); - msgDlg.open(); + int rt = msgDlg.open(); + if ( rt == Dialog.OK )cleanup(); } } }); @@ -405,6 +420,9 @@ public class OutlookFormatDlg extends CaveJFACEDialog{ } } } + + cleanup(); + } /** @@ -441,13 +459,30 @@ public class OutlookFormatDlg extends CaveJFACEDialog{ //msg += generateLineInfo( ol, "\n"); msg += ol.generateLineInfo("\n"); */ - Layer defaultLayer = new Layer(); - //add watch collection(box and status line) - defaultLayer.addElement(this.issueOutlook(ol)); + Layer defaultLayer = otlkDlg.drawingLayer.getActiveLayer().copy(); + defaultLayer.clear(); Product defaultProduct = new Product(); defaultProduct.addLayer(defaultLayer); + String pdName = otlkDlg.drawingLayer.getActiveProduct().getType(); + ProductType pt = ProductConfigureDialog.getProductTypes().get( pdName); + + Polygon boundsPoly = null; + + if ( pt != null && pt.getClipFlag() != null && pt.getClipFlag() ) { + boundsPoly = getBoundsPoly(pt.getClipBoundsTable(), pt.getClipBoundsName()); + if ( boundsPoly != null ){ + processClip( ol, defaultLayer, boundsPoly); + } + } + + if (pt ==null || pt.getClipFlag() == null || !pt.getClipFlag() || boundsPoly == null ) { + //add watch collection(box and status line) + defaultLayer.addElement(this.issueOutlook(ol)); + } + + ArrayList prds = new ArrayList(); prds.add( defaultProduct ); Products fileProduct = ProductConverter.convert( prds ); @@ -728,4 +763,84 @@ public class OutlookFormatDlg extends CaveJFACEDialog{ } return ret; } + + /** + * Removes selected element. Refresh editor. Set PGEN selecting mode. + */ + private void cleanup(){ + this.close(); + this.getOtlkDlg().drawingLayer.removeSelected(); + this.getOtlkDlg().mapEditor.refresh(); + this.getOtlkDlg().close(); + PgenUtil.setSelectingMode(); + } + + /** + * Clip the input outlook and put it in the layer. + * @param ol + * @param layer + * @param boundsPoly + */ + private void processClip(Outlook ol, Layer layer, Polygon boundsPoly ){ + + //Plot the bounds polygon. + //Line border = new Line(null, new Color[]{Color.MAGENTA},.5f,.5,true, + // false, Arrays.asList(boundsPoly.getCoordinates()), 0, + // FillPattern.FILL_PATTERN_6,"Lines","LINE_SOLID"); + //otlkDlg.drawingLayer.addElement( border ); + + //clip + Outlook clipped = new ClipProduct( boundsPoly, true).clipOutlook(this.issueOutlook(ol) ); + + //Put it in layer + layer.addElement(clipped); + this.issueOutlook(clipped); + + ///Put it in the map editor. + otlkDlg.drawingLayer.replaceElement(ol, clipped); + otlk = clipped; + + //Clean up. Remove ghost. Re-set selected element. + if ( !clipped.isEmpty() && clipped.getPrimaryDE() instanceof Line){ + otlkDlg.setDrawableElement( clipped.getPrimaryDE() ); + if ( otlkDlg.drawingLayer.getSelectedComp() != null && !clipped.isEmpty()) { + otlkDlg.drawingLayer.setSelected( clipped.getPrimaryDE()); + } + otlkDlg.drawingLayer.removeGhostLine(); + otlkDlg.mapEditor.refresh(); + } + else if (clipped.isEmpty()){ + otlkDlg.drawingLayer.removeSelected(); + otlkDlg.drawingLayer.removeGhostLine(); + otlkDlg.mapEditor.refresh(); + } + + } + + /** + * Gets the bounds polygon. + * @param boundsTbl + * @param boundsName + * @return + */ + private Polygon getBoundsPoly(String boundsTbl, String boundsName){ + if ( bounds == null ){ + bounds = new HashMap(); + } + + //check if the polygon is still in memory. + Polygon boundsPoly = bounds.get( boundsTbl + boundsName); + + //load the bounds polygon. + if ( boundsPoly == null){ + boundsPoly = PgenStaticDataProvider.getProvider().loadBounds(boundsTbl, boundsName); + if ( boundsPoly != null ){ + //only keep one polygon in memory + bounds.clear(); + bounds.put( boundsTbl + boundsName, boundsPoly); + } + } + + return boundsPoly; + } } diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatMsgDlg.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatMsgDlg.java index 25982a4b73..0d22630200 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatMsgDlg.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/attrdialog/OutlookFormatMsgDlg.java @@ -37,8 +37,6 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; -import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; - /** * Implementation of a dialog to display information of an outlook product. * @@ -55,7 +53,7 @@ import com.raytheon.viz.ui.dialogs.CaveJFACEDialog; * @author B. Yin */ -public class OutlookFormatMsgDlg extends CaveJFACEDialog { +public class OutlookFormatMsgDlg extends Dialog { //top level container for all widgets private Composite top; @@ -178,12 +176,6 @@ public class OutlookFormatMsgDlg extends CaveJFACEDialog { //clean up this.close(); - ofd.close(); - ofd.getOtlkDlg().drawingLayer.removeSelected(); - ofd.getOtlkDlg().mapEditor.refresh(); - ofd.getOtlkDlg().close(); - PgenUtil.setSelectingMode(); - } } diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/clipper/ClipProduct.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/clipper/ClipProduct.java new file mode 100644 index 0000000000..1a90feb275 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/clipper/ClipProduct.java @@ -0,0 +1,822 @@ +/* + * gov.noaa.nws.ncep.ui.pgen.clip + * + * January 2013 + * + * This code has been developed by the NCEP/SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.ui.pgen.clipper; + +import static java.lang.Math.abs; +import static java.lang.Math.atan2; +import static java.lang.Math.cos; +import static java.lang.Math.pow; +import static java.lang.Math.sin; +import static java.lang.Math.sqrt; +import static java.lang.Math.toDegrees; +import static java.lang.Math.toRadians; +import gov.noaa.nws.ncep.ui.pgen.elements.AbstractDrawableComponent; +import gov.noaa.nws.ncep.ui.pgen.elements.Arc; +import gov.noaa.nws.ncep.ui.pgen.elements.DECollection; +import gov.noaa.nws.ncep.ui.pgen.elements.KinkLine; +import gov.noaa.nws.ncep.ui.pgen.elements.Layer; +import gov.noaa.nws.ncep.ui.pgen.elements.Line; +import gov.noaa.nws.ncep.ui.pgen.elements.MultiPointElement; +import gov.noaa.nws.ncep.ui.pgen.elements.Outlook; +import gov.noaa.nws.ncep.ui.pgen.elements.Product; +import gov.noaa.nws.ncep.ui.pgen.elements.SinglePointElement; +import gov.noaa.nws.ncep.ui.pgen.gfa.Gfa; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.geotools.geometry.jts.JTS; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import com.raytheon.uf.common.geospatial.MapUtil; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.LineString; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.geom.impl.CoordinateArraySequence; + +/** + * Class to clip a PGEN product + * + *
+ * SOFTWARE HISTORY
+ * Date       	Ticket#		Engineer	Description
+ * ------------	----------	-----------	--------------------------
+ * 01/2013		#966			B. Yin		Initial Creation.
+ * 
+ * 
+ * + * @author byin + */ + +public class ClipProduct { + + /** Factory */ + private GeometryFactory geometryFactory = new GeometryFactory(); + + /** Bounds shape is to be converted to this polygon. */ + private Polygon boundsPoly; + + /** Tolerance for coordinates to be treated as the same /close points. */ + private final double PRECISION = 0.000000001; + /** + * Input parameter, defined by user; true to clip all the elements within the bounds, false - + * outside. + */ + public static boolean keep = true; + + public ClipProduct(Polygon bounds, boolean keepInside ){ + + boundsPoly = bounds; + keep = keepInside; + } + + /** + * Clips each individual product. + * + * @param p + * + * @return + */ +// public void clipProduct(Product p, MultiPolygon bounds, boolean keepInside) { +// +// } + + /** + * Clips each individual product. + * + * @param p + * + * @return + */ + public void clipProduct(Product p) { + + if ( boundsPoly == null ) return; + + for (Layer layer : p.getLayers()) { + List before = layer.getDrawables(); + List after = new ArrayList(); + boolean changed = false; + for (AbstractDrawableComponent adc : before) { + List c = clipDrawableComponent(adc); + if (c != null && !c.isEmpty()) { + after.addAll(c); + } + changed = true; + } + if (changed) { + // while (getJoinVGF().joinItself(after)) { + // } + layer.setDrawables(after); + } + } + + } + + public List clipDrawableComponents(List elements) { + List after = new ArrayList(); + for (AbstractDrawableComponent adc : elements) { + List c = clipDrawableComponent(adc); + if (c != null && !c.isEmpty()) { + after.addAll(c); + } + else { + after.add(adc.copy()); + } + } + return after; + } + + /** + * Clips DrawableComponent. + * + * @param adc + * + * @return + */ + private List clipDrawableComponent(AbstractDrawableComponent adc) { + List ret = null; + if (adc instanceof SinglePointElement) { + ret = clipSinglePointElement(adc); + } + else if (adc instanceof MultiPointElement) { + + // circle is a special case, convert it to Line (the same way it is done in old clipvgf) + // But cave has Arc, so add the line points to Arc to make a special arc. + // After clipping, convert it back to Arc with right angles and points. + AbstractDrawableComponent adcOrig = null; + if (adc instanceof Arc) { + // we cannot use polymorphism here, we need pure LIne object to + // be able to draw points + adcOrig = adc.copy(); + adc = convertArcToLine((Arc) adc); + } + +// if (((MultiPointElement) adc).isClosedLine()) { +// adc.getPoints().add(adc.getPoints().get(0)); +// } + // MultiPointElement include Line, Kinkline, Gfa,and Jet...Jet is not clised + else if (adc instanceof Line) { + if (((Line) adc).isClosedLine()) + adc.getPoints().add(adc.getPoints().get(0)); + } + else if (adc instanceof Gfa) { + if (((Gfa) adc).isClosedLine()) + adc.getPoints().add(adc.getPoints().get(0)); + } + else if (adc instanceof KinkLine) { + if (((KinkLine) adc).isClosedLine()) + adc.getPoints().add(adc.getPoints().get(0)); + } + + ret = clipMultiPointElement(adc); + + if (ret == null) + return null; + + /** + * convert special arc to normal arc + */ + for (int i=0; i 0.005 || abs((ys-yTest)/ys) > 0.005) + startAngle = 360 -startAngle; + //System.out.println("xstest "+xTest +" "+yTest ); + xTest = (radius * cos(toRadians(-endAngle)) * cosbeta - radius2 * sin(toRadians(-endAngle)) * sinbeta); + yTest = (radius * cos(toRadians(-endAngle)) * sinbeta + radius2 * sin(toRadians(-endAngle)) * cosbeta); + if (abs((xe-xTest)/xe) > 0.005 || abs((ye-yTest)/ye) > 0.005) //-90866.87 176333.57 -90448.95 176440.64 + endAngle = 360 -endAngle; + //System.out.println("xetest "+xTest +" "+yTest ); + + if ( abs(endAngle) <0.001) //360 + endAngle = 360 + endAngle; + if (startAngle >= endAngle) //start to circum to end + endAngle = 360 + endAngle; + //System.out.println("xe "+xs +" "+ys +" "+xe +" "+ye+" "+" "+x1 +" "+y1 +" "+xTest+" "+yTest); + +// if (newArc.getStartAngle() <= 180) { +// if (startAngle < previousEndAngle) +// startAngle = 360 -startAngle; +// if (startAngle >= endAngle) +// endAngle = 360 - endAngle; +// if (abs(startAngle - endAngle)<180 && ret.get(i).getPoints().size() >36) +// endAngle = 360 - endAngle; +// previousEndAngle = endAngle; +// } +// else { +// startAngle = 360 -startAngle; +// if (startAngle < previousEndAngle) +// startAngle = 360 -startAngle; +// if (startAngle >= endAngle) +// endAngle = 360 - endAngle; +// previousEndAngle = endAngle; +// } + + //System.out.println("& "+startAngle +" "+endAngle); + + newArc.setCenterPoint(center); + newArc.setCircumferencePoint(circum); + newArc.setStartAngle(startAngle); + newArc.setEndAngle(endAngle); + ArrayList pts = new ArrayList(); + pts.add(center); + pts.add(circum); + newArc.setPoints(pts); + ret.set(i, newArc); + } + } + } + else if ( adc instanceof Outlook ) { + ret = new ArrayList(); + ret.add(clipOutlook( (Outlook)adc )); + } + return ret; + } + + /** + * Clips SinglePointElement, depending on keep variable. If keep is true, then the element stays + * if its location is within the polygon. + * + * @param elementToClip + * + * @return the same element if needed to stay, a list of ofjects if this one is split in parts, + * or null + */ + private List clipSinglePointElement(AbstractDrawableComponent elementToClip) { + // using JTS Polygon to determine if a point is inside the polygon + Coordinate c = null; + if (elementToClip instanceof SinglePointElement) { + c = ((SinglePointElement) elementToClip).getLocation(); + } else if (elementToClip instanceof Arc) { + c = ((Arc) elementToClip).getCenterPoint(); + } + Point p = geometryFactory.createPoint(c); + if (pointStays(p)) { + ArrayList ret = new ArrayList(); + ret.add(elementToClip); + return ret; + } + return null; + } + + + + /** + * Converts Arc to pure Line object. We cannot use polymorphism here since Arc extends Line. + * + * @param arc + * + * @return + */ + private Arc convertArcToLine(Arc arc) { + + //Line line = new Line(); + Arc newArc = new Arc(); + try { + // create points + ArrayList points = new ArrayList(); + + Coordinate c0 = arc.getCenterPoint(); + Coordinate c0world = new Coordinate(); + Coordinate c1 = arc.getCircumferencePoint(); + Coordinate c1world = new Coordinate(); + + CoordinateReferenceSystem crs = MapUtil.constructStereographic(MapUtil.AWIPS_EARTH_RADIUS, + MapUtil.AWIPS_EARTH_RADIUS, c0.y, c0.x); + MathTransform fromLatLon = MapUtil.getTransformFromLatLon(crs); + MathTransform toLatLon = fromLatLon.inverse(); + + JTS.transform(c0, c0world, fromLatLon); + JTS.transform(c1, c1world, fromLatLon); + + double x0 = c0world.x; // Center + double y0 = c0world.y; + double x1 = c1world.x; // CircumferencePoint + double y1 = c1world.y; + + double radius = sqrt(pow((y1 - y0), 2) + pow((x1 - x0), 2)); + double radius2 = radius * arc.getAxisRatio(); + + // theta in polar coordinate + double theta = toDegrees(atan2(y1 - y0, x1 - x0)); +// double a1 = theta - arc.getStartAngle(); +// double a2 = theta - arc.getEndAngle(); + double a1 = -arc.getStartAngle(); + double a2 = -arc.getEndAngle(); + + if (abs(a1 - a2) < 0.00001 ) a2 -= 360; //whole circle + + double beta = atan2(y1 - y0, x1 - x0); + double sinbeta = Math.sin(beta); + double cosbeta = Math.cos(beta); + //System.out.println("*****angles "+theta +" "+a1 +" "+a2); + + + for ( double angle =a1; angle > a2; angle -= 5) + { + double alpha = toRadians(angle) ; + double sinalpha = Math.sin(alpha); + double cosalpha = Math.cos(alpha); + + double x = x0 + (radius * cosalpha * cosbeta - radius2 * sinalpha * sinbeta); + double y = y0 + (radius * cosalpha * sinbeta + radius2 * sinalpha * cosbeta); + + Coordinate c = new Coordinate(x, y); + JTS.transform(c, c, toLatLon); + + points.add(c); + + } + + double lastA2x = x0 + (radius * Math.cos(toRadians(a2)) * cosbeta - radius2 * Math.sin(toRadians(a2)) * sinbeta); + double lastA2y = y0 + (radius * Math.cos(toRadians(a2)) * sinbeta + radius2 * Math.sin(toRadians(a2)) * cosbeta); + Coordinate c = new Coordinate(lastA2x, lastA2y); + JTS.transform(c, c, toLatLon); + points.add(c); + + arc.setPoints(points); + +// line.setLineWidth(arc.getLineWidth()); +// line.setSizeScale(arc.getSizeScale()); +// line.setSmoothFactor(arc.getSmoothFactor()); +// line.setClosed(false); +// line.setFilled(arc.isFilled()); +// line.setFillPattern(arc.getFillPattern()); +// line.setPgenCategory("Lines"); +// line.setPgenType("LINE_SOLID"); +// line.setPoints(points); +// line.setColors(arc.getColors()); + } catch (Exception e) { +// e.printStackTrace(); +// line = null; + } + return arc; + //return line; + } + + + /** + * Clips MultiPointElement, depending on keep variable. If keep is true, then the element stays + * if its location is within the polygon. + * + * @param elementToClip + * + * @return + */ + private List clipMultiPointElement(AbstractDrawableComponent elementToClip) { + ArrayList pointsActual = ((MultiPointElement) elementToClip).getPoints(); + + /* + * first insert additional points which are on the border + */ + // and keep track of the newly inserted points + ArrayList pointsOnBorder = new ArrayList(); + + /* + * Process intersections + */ + ArrayList pointsIncludingIntersections = processMultiPointElementIntersection(pointsActual); + + /* + * Now leave only the points which are inside of the polygon (if keep is false, then + * outside) + */ + ArrayList pointsToLeave = processPointsToLeave(pointsOnBorder, + pointsIncludingIntersections); + + if (!pointsToLeave.isEmpty()) { + ((MultiPointElement) elementToClip).setPoints(pointsToLeave); + ArrayList ret = new ArrayList(); + + // need to split in chunks if two consecutive points are newly + // inserted on the border + +// boolean closed = ((MultiPointElement) elementToClip).isClosedLine(); + boolean closed = false; //jet is false + if (elementToClip instanceof Line) { + closed = ((Line) elementToClip).isClosedLine(); + } +// else if (elementToClip instanceof Arc) { closed = false +// closed = ((Arc) elementToClip).isClosedLine(); +// } + else if (elementToClip instanceof Gfa) { + closed = ((Gfa) elementToClip).isClosedLine(); + } + else if (elementToClip instanceof KinkLine) { + closed = ((KinkLine) elementToClip).isClosedLine(); + } + + if (isToSplit(elementToClip, pointsOnBorder)) { + List splitted = split(elementToClip, pointsOnBorder); + // combine if needed + combineFirstAndLast(closed, splitted); + ret.addAll(splitted); + } else { + ((MultiPointElement) elementToClip).setClosed(false); + ret.add(elementToClip); + } + + return ret; + } + return null; + } + + /** + * Decides whether the point is staying or being clipped. + * + *
+	 * Inverse XOR operation !(AˆB) here: INSIDE POLYGON KEEP STAYS true true true false true false true
+	 * false false false false true
+	 * 
+ * + * @param p + * + * @param pointsOnBorder + * + * @return true to stay, false to clip + */ + private boolean pointStays(Point p) { + return !(boundsPoly.contains(p) ^ keep); + } + + /** + * Process intersections + * + * @param pointsActual + * + * @return pointsIncludingIntersections + */ + private ArrayList processMultiPointElementIntersection(ArrayList pointsActual) { + ArrayList pointsIncludingIntersections = new ArrayList(); + Coordinate[] line = new Coordinate[2]; + for (int i = 0; i < pointsActual.size() - 1; i++) { + line[0] = pointsActual.get(i); + line[1] = pointsActual.get(i + 1); + CoordinateArraySequence cas = new CoordinateArraySequence(line); + LineString ls = new LineString(cas, geometryFactory); + Geometry intersection = null; + if (boundsPoly.getExteriorRing().intersects(ls)) { + intersection = boundsPoly.intersection(ls); + } + // add first point + pointsIncludingIntersections.add(pointsActual.get(i)); + // add all the intersection points + if (intersection != null) { + for (Coordinate c : intersection.getCoordinates()) { + if (!compareCoordinates(c, line[0]) && !compareCoordinates(c, line[1])) { + // no need to add the same coordinates twice + pointsIncludingIntersections.add(c); + } + } + } + } + // add the last Coordinate + pointsIncludingIntersections.add(pointsActual.get(pointsActual.size() - 1)); + return pointsIncludingIntersections; + } + + /** + * Process points to leave. + * + * @param pointsOnBorder + * + * @param pointsIncludingIntersections + * + * @return + */ + private ArrayList processPointsToLeave(ArrayList pointsOnBorder, + ArrayList pointsIncludingIntersections) { + ArrayList pointsToLeave = new ArrayList(); + for (Coordinate c : pointsIncludingIntersections) { + Point p = geometryFactory.createPoint(c); + + // If KEEP is false and the point is on border, it should stay. + boolean onBorder = boundsPoly.getExteriorRing().distance(p) < PRECISION; + if (onBorder) { + pointsOnBorder.add(c); + } + if (pointStays(p) || onBorder) { + pointsToLeave.add(c); + } + } + return pointsToLeave; + } + + /** + * This method determines if a component needs to be splitted in chunks when two consecutive + * points are newly inserted on the border. + * + * @param ret + * + * @return true if need to split, false otherwise + */ + private boolean isToSplit(AbstractDrawableComponent adc, ArrayList pointsOnBorder) { + if (adc instanceof MultiPointElement) { + ArrayList points = ((MultiPointElement) adc).getPoints(); + for (int i = 0; i < points.size() - 2; i++) { + if (pointsOnBorder.contains(points.get(i)) && pointsOnBorder.contains(points.get(i + 1))) { + return true; + } + } + } + return false; + } + + /** + * Splits the component, use only if isNeedToSplit method returns true. + * + * @param adc + * + * @param pointsOnBorder + * + * @return + */ + private List split(AbstractDrawableComponent adc, + ArrayList pointsOnBorder) { + ArrayList ret = new ArrayList(); + if (adc instanceof MultiPointElement) { + ArrayList points = ((MultiPointElement) adc).getPoints(); + ArrayList firstElementPoints = new ArrayList(); + ArrayList remainingPoints = new ArrayList(); + int i = 0; + for (i = 0; i < points.size() - 2; i++) { + firstElementPoints.add(points.get(i)); + if (i == 0) continue; + if (pointsOnBorder.contains(points.get(i)) && pointsOnBorder.contains(points.get(i + 1))) { + i++; + break; + } + } + // continue looping + for (; i < points.size(); i++) { + remainingPoints.add(points.get(i)); + } + AbstractDrawableComponent copy = adc.copy(); + ((MultiPointElement) adc).setPoints(firstElementPoints); + if (firstElementPoints.size() > 1) { + ((MultiPointElement) adc).setClosed(false); + ret.add(adc); + } + + ((MultiPointElement) copy).setPoints(remainingPoints); + // by this time we have two elements, the second one might need to + // be splitted, recursive call to the same method + if (copy.getPoints().size() > 2 && isToSplit(copy, pointsOnBorder)) { + ret.addAll(split(copy, pointsOnBorder)); + } else { + ((MultiPointElement) copy).setClosed(false); + ret.add(copy); + } + } + return ret; + } + + /** + * First and last object created after the clipping procedure can be combined if they share a + * point. + * + * @param closed + * + * @param splitted + */ + private void combineFirstAndLast(boolean closed, List splitted) { + AbstractDrawableComponent first = splitted.get(0); + AbstractDrawableComponent last = splitted.get(splitted.size() - 1); + + if (compareCoordinates(first.getPoints().get(0), last.getPoints().get(last.getPoints().size() - 1))) { + closed = true; + } + + if (closed && !keep && splitted.size() > 1) { + splitted.remove(0); + // combine first and last + last.getPoints().addAll(first.getPoints()); + // remove duplicates + ((MultiPointElement) last).setPoints(removeDuplicates(((MultiPointElement) last).getPoints())); + ((MultiPointElement) last).setClosed(false); + } + } + + + /** + * Compares two Coordinate objects by comparing x and y coordinates. If the coordinates are + * close within a precision, returns true, otherwise false. + * + * @param c1 + * + * @param c2 + * + * @return true is x and y are very close, false otherwise + */ + private boolean compareCoordinates(Coordinate c1, Coordinate c2) { + if (abs(c1.x - c2.x) < PRECISION && abs(c1.y - c2.y) < PRECISION) { + return true; + } + return false; + } + /** + * Helper method to remove duplicates from array list, returns a new object with no duplicates. + * + * @param + * + * @param list + * + * @return + */ + private ArrayList removeDuplicates(ArrayList list) { + ArrayList ret = new ArrayList(); + for (T obj : list) { + if (!ret.contains(obj)) { + ret.add(obj); + } + } + return ret; + } + + public Outlook clipOutlook( Outlook otlk ){ + + if ( boundsPoly == null ) return otlk; + + Outlook ret = otlk.copy(); + //ret.clear(); + List clipped = new ArrayList(); + Iterator it = ret.getComponentIterator(); + while ( it.hasNext() ){ + AbstractDrawableComponent adc = it.next(); + it.remove(); + if ( adc.getName().equals(Outlook.OUTLOOK_LABELED_LINE)){ + clipped.addAll(clipOutlookLine( (DECollection) adc )); + } + else if (adc.getName().equals(Outlook.OUTLOOK_LINE_GROUP)){ + clipped.add(clipOutlookLineGroup( (DECollection) adc )); + } + } + + for (DECollection dec : clipped ){ + ret.add(dec); + } + + return ret; + } + + private DECollection clipOutlookLineGroup( DECollection dec ){ + + DECollection ret = dec.copy(); + ret.clear(); + + Iterator it = dec.getComponentIterator(); + + List clipped = new ArrayList(); + + while ( it.hasNext() ){ + clipped.clear(); + + AbstractDrawableComponent adc = it.next(); + it.remove(); + + if ( adc.getName().equals(Outlook.OUTLOOK_LABELED_LINE)){ + clipped.addAll(clipOutlookLine( (DECollection) adc )); + } + + for (DECollection otlkLine : clipped ){ + ret.add(otlkLine); + } + } + + return ret; + } + + private List clipOutlookLine( DECollection dec ){ + List ret = new ArrayList(); + Iterator it = dec.getComponentIterator(); + + while ( it.hasNext() ){ + AbstractDrawableComponent adc = it.next(); + if ( adc instanceof Line ){ + List clippedList = clipDrawableComponent( adc ); + if ( clippedList != null && clippedList.size() >= 1 ){ + Iterator it2 = clippedList.iterator(); + while ( it2.hasNext() ){ + AbstractDrawableComponent clippedLine = it2.next(); + if ( clippedLine instanceof Line ){ + DECollection outlookLine = dec.copy(); + + //remove the original line + Iterator it3 = outlookLine.getComponentIterator(); + while ( it3.hasNext() ){ + AbstractDrawableComponent ln = it3.next(); + if ( ln instanceof Line ){ + it3.remove(); + } + } + + //add the clipped line + outlookLine.add(0, clippedLine ); + ret.add( outlookLine ); + } + } + } + } + } + + return ret; + + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/productmanage/ProductConfigureDialog.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/productmanage/ProductConfigureDialog.java index 4bc600be2d..ed705527f9 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/productmanage/ProductConfigureDialog.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/productmanage/ProductConfigureDialog.java @@ -157,6 +157,7 @@ public class ProductConfigureDialog extends ProductDialog { private Button[] dlgCntlBtn = null; + private Button clipChkBox; private Text shapeFileTxt = null; /* @@ -189,6 +190,9 @@ public class ProductConfigureDialog extends ProductDialog { private Composite pdComp; + private Combo boundsNameCbo; + private Combo boundsListCbo; + /** * Default colors for the default and active product of layer name button. */ @@ -1055,6 +1059,9 @@ public class ProductConfigureDialog extends ProductDialog { else if ( getCurrentTabName().equalsIgnoreCase("Settings") ){ updateSettings( pTyp ); } + else if ( getCurrentTabName().equalsIgnoreCase("Clip") ){ + updateClip( pTyp ); + } else if ( getCurrentTabName().equalsIgnoreCase("Products") ){ pTyp.getProdType().clear(); if ( ptList != null ) pTyp.getProdType().addAll( ptList ); @@ -2115,15 +2122,74 @@ public class ProductConfigureDialog extends ProductDialog { gl0.marginWidth = 3; titleComp.setLayout( gl0 ); - Label filters = new Label( titleComp, SWT.NONE ); - filters.setText( "Clip the Product:"); + Label flagLbl = new Label( titleComp, SWT.NONE ); + flagLbl.setText( "Clip the Product:"); + + clipChkBox = new Button( titleComp, SWT.CHECK ); + clipChkBox.addSelectionListener( new SelectionListener(){ + + @Override + public void widgetSelected(SelectionEvent e) { + if ( ((Button)e.widget).getSelection()){ + boundsListCbo.setEnabled(true); + boundsNameCbo.setEnabled(true); + } + else { + boundsListCbo.setEnabled(false); + boundsNameCbo.setEnabled(false); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + } + + }); + + + Label boundsListLbl = new Label( titleComp, SWT.NONE ); + boundsListLbl.setText( "Bounds Table: "); + + boundsListCbo= new Combo( titleComp, SWT.DROP_DOWN | SWT.READ_ONLY ); + + int init = 0; + int ii = 0; + for ( String str : PgenStaticDataProvider.getProvider().getBoundsTableList() ) { + boundsListCbo.add(str); + if ( str.equals("bwus_bnd")) init = ii; + ii++; + } + boundsListCbo.select( init ); + + boundsListCbo.addSelectionListener( new SelectionListener(){ + + @Override + public void widgetSelected(SelectionEvent e) { + populateBoundsNames( ((Combo)e.widget).getText()); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // TODO Auto-generated method stub + + } + + }); + + Label boundsNameLbl = new Label( titleComp, SWT.NONE ); + boundsNameLbl.setText( "Bounds Name: "); + + boundsNameCbo = new Combo( titleComp, SWT.DROP_DOWN | SWT.READ_ONLY ); + + populateBoundsNames( boundsListCbo.getText()); - Button pBtn = new Button( titleComp, SWT.CHECK ); /* * Input boundary file name */ - GridLayout mainLayout = new GridLayout( 3, false); + /* GridLayout mainLayout = new GridLayout( 3, false); mainLayout.marginHeight = 3; mainLayout.marginWidth = 3; @@ -2132,7 +2198,8 @@ public class ProductConfigureDialog extends ProductDialog { nameComp.setLayout(mainLayout); Label nameLbl = new Label( nameComp, SWT.NONE ); - nameLbl.setText( "Shape File: "); + nameLbl.setText( "Clip Bounds: "); + shapeFileTxt = new Text( nameComp, SWT.SINGLE | SWT.BORDER ); shapeFileTxt.setLayoutData( new GridData( 180, 10 ) ); @@ -2154,6 +2221,11 @@ public class ProductConfigureDialog extends ProductDialog { } } }); + */ + if (!clipChkBox.getSelection()){ + boundsListCbo.setEnabled(false); + boundsNameCbo.setEnabled(false); + } } @@ -2791,6 +2863,9 @@ public class ProductConfigureDialog extends ProductDialog { //update Pgen settings editSettingsTab(); + //update Pgen clip tab + editClipTab(); + //update Product tab editProductsTab(); @@ -2947,6 +3022,37 @@ public class ProductConfigureDialog extends ProductDialog { } + /** + * Edit/Update the Pgen clipping + */ + private void editClipTab() { + + ProductType curPrdType = getCurrentPrdTyp(); + + if ( curPrdType != null && curPrdType.getClipFlag() != null && curPrdType.getClipFlag() ) { + + clipChkBox.setSelection(true); + boundsListCbo.setEnabled(true); + boundsNameCbo.setEnabled(true); + + if ( curPrdType.getClipBoundsTable() != null ){ + boundsListCbo.setText( curPrdType.getClipBoundsTable() ); + if ( curPrdType.getClipBoundsName() != null ){ + populateBoundsNames( boundsListCbo.getText()); + boundsNameCbo.setText( curPrdType.getClipBoundsName() ); + } + } + + } + else { + + clipChkBox.setSelection(false); + boundsListCbo.setEnabled(false); + boundsNameCbo.setEnabled(false); + } + + } + /** * Update the product tab */ @@ -3017,6 +3123,26 @@ public class ProductConfigureDialog extends ProductDialog { } + /** + * Update clip information for a given type + * + * @param ptyp + */ + private void updateClip( ProductType ptyp ) { + + String pdName = typeText.getText(); + if ( pdName == null || pdName.isEmpty() ){ + return; + } + + ptyp.setClipFlag( clipChkBox.getSelection() ); + if (clipChkBox.getSelection() ){ + ptyp.setClipBoundsTable( boundsListCbo.getText()); + ptyp.setClipBoundsName(boundsNameCbo.getText()); + } + + } + /** * Update Pgen Settings for a given type * @@ -3304,6 +3430,9 @@ public class ProductConfigureDialog extends ProductDialog { //update Pgen settings editSettingsTab(); + //update Pgen clipping tab + editClipTab(); + //update Product tab editProductsTab(); } @@ -3419,6 +3548,8 @@ public class ProductConfigureDialog extends ProductDialog { outType.setPgenSettingsFile( nvl( typeIn.getPgenSettingsFile() ) ); + outType.setClipFlag( typeIn.getClipFlag() ); + //Copy PgenActions PgenActions pact = new PgenActions(); for ( String name : typeIn.getPgenActions().getName() ) { @@ -3517,6 +3648,17 @@ public class ProductConfigureDialog extends ProductDialog { return newShell; } + /** + * Sets the bounds name combo from the database table. + * @param table + */ + private void populateBoundsNames( String table ){ + boundsNameCbo.removeAll(); + for ( String str : PgenStaticDataProvider.getProvider().getBoundsNames( table )) { + boundsNameCbo.add(str); + } + boundsNameCbo.select(0); + } } diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/producttypes/ProductType.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/producttypes/ProductType.java index 06406dfbda..9a77a1c92f 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/producttypes/ProductType.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/producttypes/ProductType.java @@ -51,7 +51,10 @@ import javax.xml.bind.annotation.XmlType; "pgenLayer", "pgenSave", "prodType", - "pgenSettingsFile" + "pgenSettingsFile", + "clipFlag", + "clipBoundsTable", + "clipBoundsName" }) @XmlRootElement(name = "ProductType") public class ProductType { @@ -70,6 +73,12 @@ public class ProductType { protected List prodType; @XmlElement(name = "PgenSettingsFile", required = true) protected String pgenSettingsFile; + @XmlElement(name = "ClipFlag") + protected Boolean clipFlag; + @XmlElement(name = "ClipBoundsTable") + protected String clipBoundsTable; + @XmlElement(name = "ClipBoundsName") + protected String clipBoundsName; @XmlAttribute(name = "Subtype") protected String subtype; @XmlAttribute(name = "Type") @@ -331,4 +340,46 @@ public class ProductType { public void setSubtype(String value) { this.subtype = value; } + + /** + * @return the clipFlag + */ + public Boolean getClipFlag() { + return clipFlag; + } + + /** + * @param clipFlag the clipFlag to set + */ + public void setClipFlag(Boolean clipFlag) { + this.clipFlag = clipFlag; + } + + /** + * @return the clipBounds + */ + public String getClipBoundsTable() { + return clipBoundsTable; + } + + /** + * @param clipBounds the clipBounds to set + */ + public void setClipBoundsTable(String table ) { + this.clipBoundsTable = table; + } + + /** + * @return the clipBoundsName + */ + public String getClipBoundsName() { + return clipBoundsName; + } + + /** + * @param clipBoundsName the clipBoundsName to set + */ + public void setClipBoundsName(String clipBoundsName) { + this.clipBoundsName = clipBoundsName; + } } diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenClippingTool.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenClippingTool.java new file mode 100644 index 0000000000..a004e2ff3d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenClippingTool.java @@ -0,0 +1,138 @@ +/* + * gov.noaa.nws.ncep.ui.pgen.tools.PgenClippingTool + * + * 28 January 2013 + * + * This code has been developed by the NCEP/SIB for use in the AWIPS2 system. + */ + +package gov.noaa.nws.ncep.ui.pgen.tools; + +import gov.noaa.nws.ncep.ui.pgen.PgenStaticDataProvider; +import gov.noaa.nws.ncep.ui.pgen.PgenUtil; +import gov.noaa.nws.ncep.ui.pgen.clipper.ClipProduct; +import gov.noaa.nws.ncep.ui.pgen.elements.AbstractDrawableComponent; +import gov.noaa.nws.ncep.ui.pgen.productmanage.ProductConfigureDialog; +import gov.noaa.nws.ncep.ui.pgen.producttypes.ProductType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.raytheon.uf.viz.core.rsc.IInputHandler; +import com.vividsolutions.jts.geom.Polygon; + +/** + * Implements PGEN "Clipping" function. + * + *
+ * SOFTWARE HISTORY
+ * Date       	Ticket#		Engineer	Description
+ * ------------	----------	-----------	--------------------------
+ * 01/13		#966		B. Yin   	Initial Creation.
+ *
+ * 
+ * + * @author B. Yin + */ + +public class PgenClippingTool extends AbstractPgenTool { + + private static HashMap bounds; + + public PgenClippingTool(){ + + super(); + + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.ui.tools.AbstractTool#runTool() + */ + @Override + protected void activateTool( ) { + + super.activateTool(); + if ( !isResourceEditable() ) return; + + drawingLayer.removeGhostLine(); + drawingLayer.removeSelected(); + + String pdName = drawingLayer.getActiveProduct().getType(); + ProductType pt = ProductConfigureDialog.getProductTypes().get( pdName); + + Polygon boundsPoly = null; + + if ( pt != null && pt.getClipFlag() != null && pt.getClipFlag() ) { + boundsPoly = getBoundsPoly(pt.getClipBoundsTable(), pt.getClipBoundsName()); + if ( boundsPoly != null ){ + processClip(boundsPoly); + } + } + + PgenUtil.setSelectingMode(); + + } + + @Override + public IInputHandler getMouseHandler() { + // TODO Auto-generated method stub + return null; + } + + /** + * Clip all drawables in the active layer. + * @param ol + * @param layer + * @param boundsPoly + */ + private void processClip(Polygon boundsPoly ){ + + //Plot the bounds polygon. + //Line border = new Line(null, new Color[]{Color.MAGENTA},.5f,.5,true, + // false, Arrays.asList(boundsPoly.getCoordinates()), 0, + // FillPattern.FILL_PATTERN_6,"Lines","LINE_SOLID"); + //drawingLayer.addElement( border ); + + //clip + List before = new ArrayList(); + for ( AbstractDrawableComponent adc : drawingLayer.getActiveLayer().getDrawables() ) { + before.add( adc.copy()); + } + + List clipped = new ClipProduct( boundsPoly, true).clipDrawableComponents( before ); + List old = new ArrayList(drawingLayer.getActiveLayer().getDrawables() ); + + drawingLayer.replaceElements(old, clipped ); + + } + + /** + * Gets the bounds polygon. + * @param boundsTbl + * @param boundsName + * @return + */ + private Polygon getBoundsPoly(String boundsTbl, String boundsName){ + if ( bounds == null ){ + bounds = new HashMap(); + } + + //check if the polygon is still in memory. + Polygon boundsPoly = bounds.get( boundsTbl + boundsName); + + //load the bounds polygon. + if ( boundsPoly == null){ + boundsPoly = PgenStaticDataProvider.getProvider().loadBounds(boundsTbl, boundsName); + if ( boundsPoly != null ){ + //only keep one polygon in memory + bounds.clear(); + bounds.put( boundsTbl + boundsName, boundsPoly); + } + } + + return boundsPoly; + } +} diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenCopypasteHotkeyHandler.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenCopypasteHotkeyHandler.java new file mode 100644 index 0000000000..11a1db901c --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenCopypasteHotkeyHandler.java @@ -0,0 +1,131 @@ +/* + * PgenClipboard + * + * Date created: 01/02/2013 + * + * This code has been developed by the NCEP/SIB for use in the AWIPS2 system. + */ +package gov.noaa.nws.ncep.ui.pgen.tools; + +import java.util.List; + +import gov.noaa.nws.ncep.ui.pgen.PgenClipboard; +import gov.noaa.nws.ncep.ui.pgen.PgenSession; +import gov.noaa.nws.ncep.ui.pgen.PgenUtil; +import gov.noaa.nws.ncep.ui.pgen.elements.AbstractDrawableComponent; +import gov.noaa.nws.ncep.ui.pgen.elements.Layer; +import gov.noaa.nws.ncep.ui.pgen.rsc.PgenResource; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +/** + * This handler handles copy/paste/cut across PGEN layers/activities using hotkeys. + * + * "CUT" - Ctrl+X only works under "Select" and "MultiSelect" Modes. It copies all + * selected elements to PgenClipboard, then delete originals from PgenResource. + * "COPY" - Ctrl+C copies all selected elements to PgenClipboard. + * "PASTE" - Ctrl+V pastes all elements in PgenClipboard to the current active layer. + * "SELECTALL" - Ctrl+A only works under "Select" and "MultiSelect" Modes. It selects + * all elements in current active layer and sends to PgenResource. No attribute + * dialog will be popped up. This could be followed up by Ctrl+C. + * + *
+ * SOFTWARE HISTORY
+ * Date       	Ticket#		Engineer	Description
+ * ------------	----------	-----------	--------------------------
+ * 01/2013		#967		Jun Wu  	Initial Creation.
+ * 
+ * 
+ * + * @author J. Wu + * + */ +public class PgenCopypasteHotkeyHandler extends AbstractHandler { + + /* (non-Javadoc) + * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) + */ + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + String action = event.getParameter("action"); + if ( action == null || action.isEmpty()){ + return null; + } + + PgenResource pgenRsc = PgenSession.getInstance().getPgenResource(); + if ( pgenRsc == null ) { + return null; + } + + Layer activeLyr = pgenRsc.getActiveLayer(); + if ( activeLyr == null ) { + return null; + } + + boolean changed = false; + String curAction = PgenSession.getInstance().getPgenPalette().getCurrentAction(); + + /* + * "CUT" - Ctrl+X only works under "Select" and "MultiSelect" Modes. It copies all + * selected elements to PgenClipboard, then delete originals from PgenResource. + * "COPY" - Ctrl+C copies all selected elements to PgenClipboard. + * "PASTE" - Ctrl+V pastes all elements in PgenClipboard to the current active layer. + * "SELECTALL" - Ctrl+A only works under "Select" and "MultiSelect" Modes. It selects + * all elements in current active layer and sends to PgenResource. No attribute + * dialog will be popped up. This could be followed up by Ctrl+C. + */ + if ( action.equalsIgnoreCase( "CUT") ) { + if ( curAction != null && ( curAction.equalsIgnoreCase("Select") || + curAction.equalsIgnoreCase("MultiSelect") ) ) { + if ( pgenRsc.getAllSelected() != null && !pgenRsc.getAllSelected().isEmpty() ) { + PgenClipboard.getInstance().copy( pgenRsc.getAllSelected() ); + pgenRsc.deleteSelectedElements(); + changed = true; + + if ( curAction.equalsIgnoreCase("MultiSelect") ) { + PgenUtil.setMultiSelectMode(); + } + else { + PgenUtil.setSelectingMode(); + } + } + } + } + else if ( action.equalsIgnoreCase( "COPY") ) { + if ( pgenRsc.getAllSelected().size() > 0 ) { + PgenClipboard.getInstance().copy( pgenRsc.getAllSelected() ); + } + } + else if ( action.equalsIgnoreCase( "PASTE") ) { + List elms = PgenClipboard.getInstance().getElSelected(); + if ( elms != null && elms.size() > 0 ) { + changed = true; + pgenRsc.addElements( elms ); + } + } + else if ( action.equalsIgnoreCase( "SELECTALL") ) { + if ( curAction != null && ( curAction.equalsIgnoreCase("Select") || + curAction.equalsIgnoreCase("MultiSelect") ) ) { + if ( pgenRsc.getActiveLayer().getDrawables().size() > 0 ) { + + if ( curAction.equalsIgnoreCase("MultiSelect") ) { + PgenUtil.setMultiSelectMode(); + } + else { + PgenUtil.setSelectingMode(); + } + + pgenRsc.setSelected( pgenRsc.getActiveLayer().getDrawables() ); +// PgenClipboard.getInstance().copy( pgenRsc.getActiveLayer().getDrawables() ); + } + } + } + + if ( changed ) PgenUtil.refresh(); + + return null; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenOutlookDrawingTool.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenOutlookDrawingTool.java index d83767e185..3d234eb1c2 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenOutlookDrawingTool.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenOutlookDrawingTool.java @@ -186,14 +186,15 @@ public class PgenOutlookDrawingTool extends AbstractPgenDrawingTool { } else { + String lineType = ((OutlookAttrDlg)attrDlg).getLineType(); // create a new DrawableElement. - if (((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("TROPICAL") - || ((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("FLOOD")) + // if (((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("TROPICAL") + // || ((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("FLOOD")) + // elem = (DrawableElement)def.create( DrawableType.LINE, (IAttribute)attrDlg, + // "Lines", "LINE_SOLID", points, drawingLayer.getActiveLayer()); + // else elem = (DrawableElement)def.create( DrawableType.LINE, (IAttribute)attrDlg, - "Lines", "LINE_SOLID", points, drawingLayer.getActiveLayer()); - else - elem = (DrawableElement)def.create( DrawableType.LINE, (IAttribute)attrDlg, - "Lines", "POINTED_ARROW", points, drawingLayer.getActiveLayer()); + "Lines", lineType, points, drawingLayer.getActiveLayer()); //if (((IMultiPoint)attrDlg).getFillFlag()) ((Line)elem).setFillPattern(attrDlg.getFillPattern()); dec = new DECollection(Outlook.OUTLOOK_LABELED_LINE); @@ -272,13 +273,15 @@ public class PgenOutlookDrawingTool extends AbstractPgenDrawingTool { // create the ghost line and put it in the drawing layer AbstractDrawableComponent ghost = null; - if (((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("TROPICAL") - || ((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("FLOOD")) + String lineType = ((OutlookAttrDlg)attrDlg).getLineType(); + + // if (((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("TROPICAL") + // || ((OutlookAttrDlg)attrDlg).getOutlookType().equalsIgnoreCase("FLOOD")) + // ghost = def.create(DrawableType.LINE, (IAttribute)attrDlg, + // "Lines", "LINE_SOLID", points, drawingLayer.getActiveLayer()); + // else ghost = def.create(DrawableType.LINE, (IAttribute)attrDlg, - "Lines", "LINE_SOLID", points, drawingLayer.getActiveLayer()); - else - ghost = def.create(DrawableType.LINE, (IAttribute)attrDlg, - "Lines", "POINTED_ARROW", points, drawingLayer.getActiveLayer()); + "Lines", lineType, points, drawingLayer.getActiveLayer()); if (((ILine)attrDlg).isFilled()) ((Line)ghost).setFillPattern(((ILine)attrDlg).getFillPattern()); diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenSelectingTool.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenSelectingTool.java index 0dc3405be3..9394c359fe 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenSelectingTool.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenSelectingTool.java @@ -1388,7 +1388,7 @@ public class PgenSelectingTool extends AbstractPgenDrawingTool newContours.update( oldContours ); drawingLayer.replaceElement( oldContours, newContours ); drawingLayer.setSelected( selElem ); - ((ContoursAttrDlg)attrDlg).setCurrentContours( newContours ); + if ( attrDlg != null ) ((ContoursAttrDlg)attrDlg).setCurrentContours( newContours ); } } diff --git a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenTextDrawingTool.java b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenTextDrawingTool.java index b62efc6e34..1907a46cdc 100644 --- a/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenTextDrawingTool.java +++ b/ncep/gov.noaa.nws.ncep.ui.pgen/src/gov/noaa/nws/ncep/ui/pgen/tools/PgenTextDrawingTool.java @@ -45,6 +45,7 @@ import gov.noaa.nws.ncep.ui.pgen.attrdialog.TextAttrDlg; * 02/11 ? B. Yin Fixed Outlook type problem. * 04/11 ? B. Yin Re-factor IAttribute * 08/12 #802 Q. Zhou Fixed Front text of 2 lines. Modified handleMouseMove. + * 12/12 #591 J. Wu TTR343 - added default label value for some fronts. * * * @author B. Yin @@ -119,9 +120,16 @@ public class PgenTextDrawingTool extends AbstractPgenDrawingTool { } } - //for fronts, don't remember last value + /* + * for fronts, don't remember last value. + * + * Jun (12/18/2012, TTR 343/TTN 591) - However, for Squall Line,Tropical Wave, + * Outflow boundary, Dry Line, and Shear Line, need to use the default label + * so the client won't need to type it - + */ if ( prevElem.getName().equalsIgnoreCase("labeledFront")){ - ((TextAttrDlg) attrDlg).setText(new String[] { "" }); + String flbl = getDefaultFrontLabel( prevElem ); + ((TextAttrDlg) attrDlg).setText(new String[] { flbl }); } else if ( prevElem.getName().equalsIgnoreCase("Volcano")){ ((TextAttrDlg) attrDlg).setFontSize(18); @@ -387,5 +395,33 @@ public class PgenTextDrawingTool extends AbstractPgenDrawingTool { } + /* + * Set default label for a few specific fronts. + */ + private String getDefaultFrontLabel( AbstractDrawableComponent elem ) { + + //Use default label for specific fronts. + String frontLabel = ""; + String ptype = elem.getPgenType(); + if ( ptype.equalsIgnoreCase("TROF") ) { + frontLabel = new String( "OUTFLOW BOUNDARY" ); + } + else if ( ptype.equals( "TROPICAL_TROF") ) { + frontLabel = new String( "TROPICAL WAVE" ); + } + else if ( ptype.equals( "DRY_LINE") ) { + frontLabel = new String( "DRYLINE" ); + } + else if ( ptype.equals( "INSTABILITY") ) { + frontLabel = new String( "SQUALL LINE" ); + } + else if ( ptype.equals( "SHEAR_LINE") ) { + frontLabel = new String( "SHEARLINE" ); + } + + return frontLabel; + + } + } diff --git a/ncep/gov.noaa.nws.ncep.viz.localization/src/gov/noaa/nws/ncep/viz/localization/NcPathManager.java b/ncep/gov.noaa.nws.ncep.viz.localization/src/gov/noaa/nws/ncep/viz/localization/NcPathManager.java index f77f344585..346d646a9c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.localization/src/gov/noaa/nws/ncep/viz/localization/NcPathManager.java +++ b/ncep/gov.noaa.nws.ncep.viz.localization/src/gov/noaa/nws/ncep/viz/localization/NcPathManager.java @@ -42,7 +42,9 @@ import com.raytheon.uf.viz.core.localization.LocalizationManager; * 06/07/2012 #717 Archana Added the constants STYLE_RULES_DIR, * MCIDAS_IMG_STYLE_RULES and GINI_IMG_STYLE_RULES * 06/21/2012 #825 Greg Hull rm mosaicInfo.txt + * 10/18/2012 #431 S. Gurung Added constant ADVANCED_ICON_IMG * 12/17/2012 #861 Greg Hull rm PGEN_XML_OVERLAYS + * 02/26/2013 #936 Archana Added FONT_FILES_DIR * * * @@ -77,6 +79,7 @@ public class NcPathManager { public static final String CURSORS_DIR = NCEP_ROOT + "Cursors"; public static final String PLOT_MODELS_DIR = NCEP_ROOT + "PlotModels"; public static final String PLOT_PARAMETERS_DIR = PLOT_MODELS_DIR + File.separator+"PlotParameters"; + public static final String FONT_FILES_DIR = NCEP_ROOT + "fontFiles" + File.separator ; public static final String LOCATOR_SOURCE_DIR = NCEP_ROOT+"LocatorDataSources"; // No longer used. location is now a parameter for the StaticPgenOverlayResource. // public static final String PGEN_XML_OVERLAYS = NCEP_ROOT + "StaticPgenOverlays"; @@ -104,6 +107,7 @@ public class NcPathManager { public static final String CONDITIONAL_FILTER_HELP_FILE = NCEP_ROOT + File.separator + "conditionalFilter" + File.separator + "ConditionalFilterHelp.txt"; public static final String CONDITIONAL_FILTER_MINUS_IMG = NCEP_ROOT + File.separator + "conditionalFilter" + File.separator + "minus_red.gif"; public static final String CONDITIONAL_FILTER_PLUS_IMG = NCEP_ROOT + File.separator + "conditionalFilter" + File.separator + "plus_green.gif"; + public static final String ADVANCED_ICON_IMG = NCEP_ROOT + File.separator + "advanced" + File.separator + "adv_icon.jpg"; // migrating code which looked for these filenames public static final String VORS_STN_TBL = STATIONS_DIR + File.separator+"vors.xml"; diff --git a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/createRbd/CreateRbdControl.java b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/createRbd/CreateRbdControl.java index 01fcb75f08..3029cf69a1 100644 --- a/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/createRbd/CreateRbdControl.java +++ b/ncep/gov.noaa.nws.ncep.viz.resourceManager/src/gov/noaa/nws/ncep/viz/resourceManager/ui/createRbd/CreateRbdControl.java @@ -125,7 +125,7 @@ import gov.noaa.nws.ncep.viz.customprojection.GempakProjectionValuesUtil; * 08/02/2012 #568 Greg Hull Clear Rbd -> Reset Rbd. get the Default RBD * 11/16/2012 #630 Greg Hull Allow selection of resource-defined areas. * 12/02/2012 #630 Greg Hull add zoomLevel combo - * + * 03/05/2013 #958 Quan Zhou Added method to get editor name * * * @author ghull @@ -1793,7 +1793,7 @@ public class CreateRbdControl extends Composite { // they may not be unique without the display id. if( editor == null ) { editor = NmapUiUtils.getActiveNatlCntrsEditor(); - + if (editor != null) { //quan String activeEditorName = NmapUiUtils.getNcDisplayNameWithoutID( editor.getDisplayName() ); @@ -1801,6 +1801,7 @@ public class CreateRbdControl extends Composite { editor = null; } } + } // if they changed the layout then we should be able to modify the layout of the current /// display but for now just punt and get a new editor. diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject index 4c22b08c26..6d6c5d0544 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -2,4 +2,5 @@ gov.noaa.nws.ncep.viz.rsc.plotdata.rsc.PlotResourceData gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefn gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefns gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModel -gov.noaa.nws.ncep.viz.rsc.plotdata.conditionalfilter.ConditionalFilter \ No newline at end of file +gov.noaa.nws.ncep.viz.rsc.plotdata.conditionalfilter.ConditionalFilter +gov.noaa.nws.ncep.viz.rsc.plotdata.rsc.TafPlotInfoRetriever \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/advanced/adv_icon.jpg b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/advanced/adv_icon.jpg new file mode 100644 index 0000000000..ae2b9e5031 Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/advanced/adv_icon.jpg differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSe.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSe.ttf new file mode 100644 index 0000000000..4b4ecc6667 Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSe.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSeBd.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSeBd.ttf new file mode 100644 index 0000000000..672bf761fe Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/VeraSeBd.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/cour.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/cour.pfa new file mode 100644 index 0000000000..b8c097b068 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/cour.pfa @@ -0,0 +1,1954 @@ +%!PS-AdobeFont-1.0: Courier 001.003 +%%CreationDate: Tue Sep 17 16:16:38 1991 +%%VMusage: 57844 76768 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier) readonly def +/FamilyName (Courier) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263786 def +/FontBBox{-48 -288 684 841}readonly def +currentdict end +currentfile eexec +b2de7b9b2a2783a9a81f7a04e7605e0bcc84ad7a981f9d6b201c5fc6acdad3ec +d09a8a1907296b7bf5510822bd65c174d41912f5e2bdc23ec621dd28cb4f8b62 +5882cca862ca3c8bbed56696f8e17809439151596792163977eddcdae7b5c346 +e93a0756e7da36a403e30b34b70eb809ec5a5e6dd43dfc5d482e2424a93fd4d2 +d0e648621eb8f9339f10ba2db9312ae5c071e20946278b5d54f7858a41f0a1b6 +b2cecd201fe0cc773a733fd892bc4352fd2c68554ad49658bfececa5de0a4178 +07560879485b17f950018e00fb441ca6e0face6fa6acc95daea5b530a954419f +a15ff97de6a7ab23540344e0193d5356ebdb99f60fce74a4c1828a36b3de4ec4 +92551fa4f0cc7ed791d897ed75bc5d034f85f7326b59e16a9e9d20d7c7072a4d +311fff4cd4635852ab3e098236a1eb05be8e5d3e4ced8ea930076fb27ae7b5f3 +a135b8e3cfa19b4144c0672503b51641ecdb779eaaaaec164216beb4de034575 +66b93918a02aea1730b7f138623f2df763d6ccadea312d4059487851ad39fa5d +6ae273d56563eb3788c4d9aefb2bd85feff2c8f6a0c383f653ddca8d4072a397 +26bc47616d936e336d1502b65cec60baa4f7c423c290d9a8e067b433ad52790a +b3de64436aeb25a5b8e18a91e616b9c310d8bda5546cb5f46e8d74adb8f970d4 +88a1602e8ed3390cbb9f1e4564f70b2141cb8262cf4dfefbbeff3d15f49afa29 +da9deb04f1e004399a20f57f770b838059aa75ffb5da99581f2fc90dd7b7f4bc +3d3d32a8b2df7a3b9ca0311f5a555e6f05babae4c577b02379370e5a364dcbb3 +1962317eded89394dd26e5e37e5f776a9ce97ffef9429f9e89773a6db3d642cf +319957b03a0434f4f81e782121d8fccd08de4e54e29b1a25b1436d859db45cd3 +c254fb02b22288d080139bf20c4fa130f98e83fde39963c3068c7aafa1c6afb8 +2ff6753842d6dab630e63fd8f7853e9358bc6c074f0acbfe9d56d3b93eb7eb9a +901ed2bbed92737fcae60b95e7186ca800ae2db1570ca4b0ed9ea9fed82ad73d +ed3977472c257b253773de2ca37eccce4faf68f1eb5cdc827dd5bc8e3c03bbfa +e9bd30bcb3cc1d35660637a882f0f4a037bd07fba1c6f5c0e8a88088ecf853dc +b2dc41ee4ed1f75640a93e9208fe5cdc7366cf3b738cf4177df4f922d8081006 +8f8f2b0143a44caed520141238781111a1331e7a6afaedb2019cf0eb438177ba +68fb0d443989e67d21f49cb8a52711507792c45bbf0c25f634cf7c1323d6146f +7c778eff204c71778e5e9723e662106caeccb514b9be0936aa409567ea40b9af +b5852cf3c9cce25acbfdee0097f828d90d21cfcfd46ea083ead540877e565883 +3234b8609a3f376ad94098ec1a1685323be81a64a6174851b6e8e80d3d8cd6f2 +41e2492bc07c052dfd66c7fa12ea0ca90a15f49194b0dbbd6f80aa49cc52e0ab +134571c2883f5adf6b57a036dcadd18f7e397b87fa80be532ac7aac3673796f6 +f20f5341984695dc99359d6e923a79441b64b85d405d53f89edf79d76278604a +4001ccbcf3e10ca83f71202d6f0a2f26db5114515f8eb58a2eedfc6c9f1f9a3f +c40205c32ca33771d7497307b4f67618bf46d3ecadd0d5b6f21d298784f9e22f +e8a97443e951a141e79a2cd6e500653fbb8e34613e57c270301dbad7b89d35b6 +b7f6cfc81e5e9f58508bfdd6c50c8b4d9114f9d9d0764232abf8c84b8c8d5284 +f78138778565991ffefaa9b63d205e74146229c2656d126e3664870c9800b9cf +ee76f078dbb1064aa5609c6c553b2c660a4054e46fffd645e8eb8864d1e15c33 +e20d690b90b6a5b9a7213bdde4856236d9f00d882d8d8cff4b27fbad85503029 +b9a4a75da575bcf29ae444f0714b5580aca0bad9460fbe2c847cd770825c8b0d +72fc684ae45ced430997d41467889fc1969702a44fb77e8de557851d4eb34433 +631c225a516281ac5e0ee6c0dafbc40855c315fd60559e53b5f33d9ef0fd1d04 +31be569d13f6dbd52bed9eff8e7eb514fb469daf3f9f31c7b8d31411692a72f8 +fc3907df11992b3aa76ca73c82710c4901b4eed793d4909a451f5f09f73db0e2 +0c32146422d4d5f83a4e2e92cbd9297944c8bb7205aa2adfc88dc6dcb4e82ff6 +07e4278885300463775ad999e2393ac0f67cd635d955f4ca5a9f57662c7e76a7 +26e7c4256827f0c03cec6855174fff2b78f1870ec2366a59a4e9983ce00941bf +17dc97b59104d05746ffcc1f7bbfd007fbb0eeb36d42f959c90382e49737352a +f582a0c76c1d86a1323af83fdfd653373a3c3b7460c839858f6fcc885f3d47d1 +902001ff877043ce9d13b1f8d1e819320f6374975e740aa77886063741e378c0 +ea28694a1bdcb89c1e2d5e8cb9fd5ab6d20be8cb0a2a74ee73d5f4c32b26c067 +0e7608a372b6e0cdc1819879ca3eb1870c22ee21b8d42780d9ca1489a4abaec2 +7dcc2fe096c55b528baf52e468bac2ee1db1c6e1609740828ad1f4faac82b9da +066b8472b15faaab3109dfbb85667a7def1794ff158cbd6fdaf9987567d8a6c6 +f86ce77b9aa3fed671f7c74a345812c978fead18ac776f7cc2957540a1720941 +5b9cc4bbd5d8aef5997110b41daf2c3d41adf834aa24862f052446ff8a1747f6 +5dadef8451aa72f9c367f21a98e1cb18b2010fc17637a673959e5790df9abb82 +9314ba4785b7bbb5e68cc6da2e021cc4345f4e6f5c6488d481947454148db9f7 +c289ce25764ab1d810268a6db157520ce871f1dff95396f03780bba8202d430b +f76046c04e1f0ef462afbf3650327876b5ce19d87ff9a6ec2e3c294976778c66 +9bf548ec241a295db3cf4139936b6127009f9807f48f09cd54e920474fc1ee65 +8dc69c4afb90f7a737df582b406c98801e77b02a02212a0d924ed58ead539b7d +18f4940a717b46ad908d521b7d07237aa25b4969239fc4968f5cd9827ab24272 +3d29ffec1926011161405f8a9a5c9e1bdc9a9152af563fbeb44d5e4ae05405bc +6a92b23e71cbb866366389fe0d91bcacd5b98a2ed4dcb9976ef9eb6c7cf06d9c +185ef69af37163d441b756f08060fa733b3ebff43160d0ccf5befefeeae06468 +0d18f7c38748d1cec437e170ef4bb6d85eead3105b2a354de80a6396c185caa9 +1d57966cc000bff2880e068d61f2ba670f7f9a2fad0ac5d1f205c1e1fa0a1d3c +110e184837018af730878a978ab3d08581e8b222307d00f86909c39c12d40bd6 +c7299dec0867f7417de60edd1897bd627767b29cea62593542c642f1089242d8 +53f2db5f45b7b21fa906851b2f28437933bd4229e32d093eda4d448641380da1 +9696d7a77fda761865d9a4a8ff48de5aa6550b2f80c7e7fef54f5dc709a9b2fc +120b03223ad9ae5d06298699ff21ea2f71bd34afb79799e67cd496a57e417f1d +87bcf2bb0c5f9fe9067af267e5740c26d6f3a256330d68f138c81883d7c07eb4 +cde5f6b5d82cbf5dd32e0c27c393cbb77cad6dbb058fb1c6653a5cd1a78f0577 +87c9dd5b1a5f83a13226571d38d367f2a4e369b4651a77789aa785f4a6561c92 +e0e82f217b2597d8a180ebe4547aa1500b0f814d309b5b1fe9dc53282c914407 +0fc79d82b5d5ae8bd272b022b35e66cd260c046d102eea1a1a4c0d376daa9b2f +e0dcb3a7254130d5787191998d88d4872834f331c75485d09799d467bfb62465 +5ea38fd84edff90fbcae880820fda0f2a3bd5cab972b4d22f1c649f970e05549 +f33e95a6d0af69653ae918872958bf100a04a7c61b8fe7433697a92b451ea444 +4670e38e33893e59ecb4a621ecd68e76308ec0eb2716fc7427ffd64fe309a635 +71c7b86839add49634114c0aeed57a2afb2a46afb303fed2ca4a7b3cce180595 +49bccef00e92339805dbe1b0c05ace5cd5a9c6d8931cdf62ce4f5406f8ceba6b +29b696b0e0ccbe8b9f9e1afdcec58064e3daa54676f493af1ebc8a2c26ccca62 +9418f0015d84e5931f620207d2c8b193113c8e6af5a0738f7085930e735227e3 +7bf703da80016e492cdffedd077be121b35093b031c35d369298f78134093147 +363062d031233a26726d549b16ccafe56eb0324ddeeb4ca8904da4fb9016fb5c +46b60e873074c2e0c78364bdbd05e0246fb44e77dffbed7fb94364a0ec0970d3 +29ac31712d356bdaaefa99865561391247a78c8ff19f6086b4d8cc464d0b3b41 +7fbe5f6b3e68de6ece2242224dba66940dd25a412c337e4c19c3305e4e1699e4 +53bfa096d66bae0ddf3a3f6d84cbc7478a00f2ff606f86913b768a18f5adafbc +8b18e653351cf8d251ecd0f0d3002862223e3488701c0a5647bfa63b55b5e162 +335533f701659833fed17ee4ef0281032344faf499ae8e33a25f97d5839fe077 +1ad9bfd9e2c1a863e0eb7ce72cc615f4ff19a8ebfe2f44aa6a636bf3197ec107 +37b3ab19482250c61d1a1bf7fc4f325056fc30554f92b88e6c8bc8ea8e5954dd +e367a169447091d9d01b79265cb1054ff7000df3b659208c6166cae1973f3559 +6f4f9645361ecdb125b87b6b9096b8c1894e5e1cbada10134d54ece4bc0a73d0 +7a93de3a3b943697cd3be33ddfa0696663524a7b6e246984620dd268ff65291d +e84855ec9192f88540c57826f6e6f25fbcb4c4e39f6b7fa2a3defd578c08c8ad +f66fe2cc07a3317b3697ac9e5ee19a9e225edd3d52323982d83d4cfa156eb858 +681dca6e77ad60dd946c8a1be74a8bb83fedf6dab14f5a2a5d1cb08ad95f2a93 +c16c39cf8672fc59bf40400920265c7e06ed02b2a788aa23425b45dba3b35a53 +098d3ca23c0bb5a9e16ffd99cb4846121c6f5656bcb8d34d29e3eb078bb39fce +be3b98fd375ba941c515c88cca36f7c55d325d3ff0932244f9c8359831981a10 +67c57e4b0ca5e2db14a9c2e24b10fddf7e037d4cddabae2e5b0443c3387eece2 +04af27ae3befdda5e88267ddcd3eebd90560de14c8f2817b6e6055e53e40b35b +93d64234e4e749cc875d9cfd48032e1059f2d2ea0e7861f3f525c81fe1863640 +c851079cd35118f98d53ecf08b86add9fa65016797fb13f20fa4f9fa0c5644e2 +86e4f6427a278a0715ad34c88b103c6fb8c09d6500886c93f399d56dc0444a53 +f64649f39e423e9b8c5bd7e8711a4455b9bc82282ac372524bcab6140921f9b7 +10f75c662901c3ae885424b03f12a4c9f589ac693c7df6e188913b64a7b1f70f +0c315dbef339b801d0f228c5d82d08c00a9c9b1d825559b47b00e98e58204a11 +257dfd1e7cfb5db205b0dc4c3211374459a58a3d23713068bff43c8b73fa51ce +bf259e69f45b37f30869f44bf3898ef27d9f3b4710b28579538ead0240f72be6 +15eeef499d8d2f0a7aa72a6fffc68a0947dafa98f52e94aa14da157cc2c71aed +17f3c2661ed84e058555d0354770c155c54a03186b815440cf8c7e37f9117e94 +67a5d50281ecea2188537254696c4b50c3aedbd3eba04b543dac970a7193bc79 +bc707725c13b8a747ad5df929cc8365da27c028745fcc82dde3b297258ee413c +d84d17166ae6dad65489dc8d98a4c760c08dd0de05754b408a39434b17773f32 +a3519b27d51781c807a352880f5d667dc8cbe54f2132200db7971b0be03eb42f +aea467cc7a1bdef783ce5d710772da9b71db45c7ba4f3c22ae9a9bdf1f26c29d +811037a170868a8f6644b0092e7cc538fd5c13568ca262ba0fe244f7307727d9 +318a281f38b607c172e64134edb76d6535abbeb9689840a297accf5c15150f2b +29e8cfee85d099297d0c6d50720d686cdd849751966c88e3aa8998c0c5c17665 +69029750afce844147abc710780af405d2a4163d272186ac4d486fc32c1770c8 +37a0656b6a0563e5b38a080f614ae9d49bafb92c96e2bfd140a88c4989952edf +2c835503abd01565e2cafa4373b790376483d4762a99adabdfa0d7a7eaf9da29 +530f626e330c8cc65113b1b7ddf5b01249b9651ce4c47111a5c6590755ff0744 +5ea2a3afa851de664cae6706bf0b640f80ec4a178e518bf6b41c793995934999 +0ccc3cb8f1864b6f20b1160c9ea3f1f8e658e88c81fcb7a28280fb37acfc06d4 +5d5c93509db13e88349ccb959dd1f23c6d5a574b9489fefbca90f8c24982bd5f +8fcc0ee7e13ec573153b51a760f47811a50c1b1e981ed0007e952d15de9fc00a +64966a945ab7cbe49e6bf90062cd8f6fd438428b14612085dd18ecd59924242e +e5c9038abee84cd94acba6c96e805305bacde3a0390a456e19dacc83f8767c5e +a9fef61dc22613e3048cac14ed6a75fa28c06d348e240019aa36faae66d21853 +b43a4c05372b0a958d3d26cd22186f95057ee646602ba13e1974758307085b23 +6ff8b0f2194a00258a76b18dfda0d5049bc9780289dd54194800554a086b80ea +65d97b1d6d03ef0ad22356fd31c90485c34a1cd00837c419c7295b712a9a9258 +b7f0452165473af73b7e21cef53ce54be278298053937f89d0d3bc15657fcc9f +3246261de1a1443c26cca0bf28d291f451d3ce279eec77ab32d5463f7f5ccc69 +5f6fc60739a5ff55dee8232b2b868fbf60a2137d8371422c1fd08fc21468bb4e +6addec19fb2def9aed1599fedacc1e5a38670011bd19ca8415af3d94010a50ac +69e8d2f36cbad97548090d37e081824c5bff928e0a767e0947c8c4f00388e4a9 +5e992a705ca0e7037000e4c191a898b40a74808db0c15c9669d2009ea5c7a391 +dec4f2f4685dfc63fd94703f948d758f11efdd2e0a634e2d4274da9bd84ccea5 +8fb6f41e617ba30fa2114deb639b7b579e2ba187bec24145664921599b6b0559 +d742b3ddaaa4f91ef05cd15db7cb7fa2400f66fd9db3d207cc5728d65b866295 +10b2b6a1cd2a33424a9006a26e8bfa8b3571a59e5cee066cc10bf301269621d7 +4f1c492a02220c551560eab04213b3e8be62fbe2d7af013072ef82f1dbba5b3c +be1974b35ad6e92e6d15c2609c17706422beb22f12d3c4c0a748426dbe65cea3 +a0ff0b208a66460ce8d359b09333e208ef39fc7fefa453cdcb028b195e70c577 +260962e2e8900a286e628bc5b0eac0328c2c6f64f0229ad0fc7872f48fed6d1b +bc490da985c19f622bc07b388a4e70e79bbe40e75d928670eecf2911075dcd05 +6f0010a492dba50abc966411d49f39515b27aa1e16e7b6104b16c6b52b428ab4 +9a6e98ecdb65aca5377819de9d99db481a2d0ccb90a1663cfa6eb6456d101609 +a1958aee3c8f2fa4396038dc4aec5dfd472273900e50bcf3cf5e5711055b90a9 +dd6845b57fcb0d9c6cae3ed0180c7a4c554a1b05298518f4d7de4107993f2715 +4b90a115a8d1a3f074a4f34b67ca5d733d59630a5b0ed10fd6459f4f9e3d17e5 +352ef13aed05ed7a17a44068884977c653628d8bb5d185f5783d041db9644d0d +69bff8433e2d00c9f6a8837a414270c66d0249e414ce0e56d5051ed7aff463c0 +5d6cd8ea3b09e1a3fa4c1a866ef3238fda1b43606f29cffafd8f91ae673bcc38 +804f91178c0d596e109b65d5a462a103a4a29d995567ec16f0263a03bac4132d +e2573eab9dc7349b6b1fdce50dc21125e38d17a3f6ef66b3212de5e0b74c3dd3 +7541e341be122bbedb6ebc2db96dd991f71011aa719c1784e24479deb65f5d05 +3bc429785d4aad99de7b5b5c03e5ce4443dbc7bf483ef1be808c8e508e6000f5 +1dd9d907b07db3d9f6566e5023a8ab0eed23857b30a6ffda86dd1aa3b98eb1b7 +bca8ce298ec3cbe5049272ea33fdca7a8a5e701e27e07cb3da0d395d258a1dbb +8714d83f3ccbbdaa9fe08900475ea6ec759f425bde968014214728d08ddd7358 +1408d3974773001d9bf782dc9cbb5209a5d3027aca7bc277b5dde20b991e8535 +1889d8d498d5e8ad712cd499727f61aa3953be4eb62133bcc578381ba3acddbd +bbd5de324e4195cdc594baa48782031b9df8aad86ebd62218b119123e213615c +cd6894853bfd77d26740d044f58e602733ee307442ab929222edb68527550414 +9ca05eced3d317f03715b8799ad1ef2ede2e3e0fb5aaa71931e70c33f7557128 +cdf1022264f9c9b5dd2d9b548a76ec92ecf9ec2029158b376c89a27c4f738009 +b555618b66865c2f98af0733208d65b1822c734d3a5a2a0d359a32dd566648db +eee996fc085b7025b47b0f8f4df03a5f9a3168b722351088a1eadecb90456a05 +ba74d908d4804034a3b9a915cff7a3b2d467f9a6adbf12c2995b75c03db7b23e +b224cdd2b64a0ea942ee4c07af8eea6587a8d3781ad7a6528d821bfd7028a2fc +5478b6460aa696ee868319dec5e1bcaea69f007b1dc80c47701adacf722b5458 +60158e090398d30a9f049adf3274a492fe891fb7b2bf76b78bad2fb05bf43bf6 +b14095b00eadf94491eb50d75fcdd95025dd329127e4746c2b433cd4793deffe +5015755a330b821f93f96ab10b508e71363ddb55cf4c6f9092201715cf26d859 +784c49b636c639caf84e044dbe3c14bf6d64e9c259af1f24ec73c9d30fc0fac3 +1f9eaf2ca8f49d0d5c18e6a12dc8acdb9f3d8ed49f607258c94967989cc31a21 +5020a9fc65815c230e8da7751552a895b0064c2a1cff3f18f9ceb908540a92a1 +06c7d46c596ecda2e25d331ab85f534313b214ed307dea03d4113ed6fa2ef1e1 +db3adb7861fa48ced61f10ab89faeb82caceda7fb1e9ca240e38611acb421be1 +119683647413c0c063c1468f1376a099f08351bffdfabdfce352ca87c125c021 +2301c6793146014d87d22727aa014d56c375945f7539863eff029d046197d65c +6a7474feaf44f7c07b0ba500752ba29f5f165d4abef0ec13c625ecf722fc9ee4 +6958a291ca5b1f385c6a5c6ed4fb0036cfa6fbfc46f1622a59f019983d1a2f2b +6662970ba2ffa63322b5bac4d58adac06e2ac789e0deda106a28a860e87ccf66 +39ed41fd29be8e218733d486633b763d0c226c18f264a632767957662400393f +4ccbfeec54acd358dbd43e71fd59096150e9db5a2aa6b01bdf8549dc0c9170a0 +05a2e18275d6d74b6815f0205a6990862a083edf44b4052f83ead884c2d891a0 +698a2cdda09d43d67fef477eb0181246a8ea49d8407ca5e24691dc83c45bafb4 +4e555c33e59bb6a17f2bc3501217502c545082e1de1e43a3fbea39ef67644fec +e36492edde144cd3aab6778cc0a4be0fb15bb46f95e86f7b4de290e66cc69f66 +5b20522987d2d0ed0ace9e250ec6c0c4793a2eab0f8f9a00d76d624cfed7399e +d1e766b6c2dac1c46c6a8c3f291ffc03eb71dc220eba0573225e74c9df93e3c3 +d31f4bf8b79a0eae363eebc0d4547d61d0d54c42dd66fabc8befeead4fdc6bb2 +0586a0a47f373849b0b6ddf42a21c6be6e1c9ddb2f78c71a334f855173f681d7 +253a9084447b363872c750476365ac690bb27460e4bbf22ecf0e4d2481bf3b0b +afa54d4295efa2d38cc6490324b12dc991060dede02e8e29156ffe3f9116067f +0478f9b5928e44075e847e0864e06191c88f6ef0408124499b970c5c5acc28f0 +6f15eb4fcda631fbbeb199ec847fed052710c5d3e1f1598f7a279110dfb67e87 +8a0caa27ab4efcc03a6953e28aa9d660999624cb29ab8904942b5df81d67a462 +615111d743ca174075f3cfa6d239741a4e6bddf182de776addf3810047c24c44 +e453a67241e96bb3ed0ca17cd928b8f67585a228176d85ef4b7fc0374123987d +2bc1a0fcb9c5a5be1749e684270f9b77c5cf4ae8d360c14ca596efe21302d343 +3f7881e8a25a88ca999a9f31a2467fb739511a42913b98d56671c74683f2b8de +6cb20b8b9fb3d1b51b9a9a43b8afcee655a3f7217f5a952093f7a7ad84593aab +fe0767f6879cc2ec7e9ab5b59bd82f48d06c9adc0fa218bcf9e1f63e9000eedf +ed014a091dc952e3e0f07eb8e7dd1dfe0cc0e6af9072a53fc95199f9233a66f2 +d04c65bad02d00c3c5ba1f5af4d33a94e8eb5ef8b21ed1637b1c3e3522cff141 +77cbf28628d468249a154e900a9deac70f0be7b7d7efe43b9243eeeea068b03d +0122feac859438fe96eba107d3ebaa99817816652b53944df5bde7b78eae04dc +d2a179fa5c3002457ccce48def5739cd02a8bebc5d65a626bb50e4857a592d46 +52d7696129b176e5ca95c9c3491858d341deb70a0e2d57b811eaef78e52ca362 +9e9dee7e39259100ea60488aabcc05ae2c6f751f41bcb2c690161e8813fb4e7f +d734f2c6fdb37ceee6f7bcbc29b2819e904e61f892fbaee59c4581e2f171f9f3 +60452fa11a872267d49f62df732dee74c8074370bb37d33d939e4a933758487b +280b1d83cb23df036ea8304a2531465a647f81e63dde4734c49a51ad26401384 +0793737f31f69413e5f5152e30309701ea8e96357cbc6bd39053135647519300 +70836262da78a79f8ef1d9a17458e02d8040629b6dc7a7dc114d05a4bb01f90e +01480ca86f291747c4c1b226b2ea6c15a38b6d7078f2f51b264eb125891db1bf +a669525940531976089a9a63fda1c89fbbcf9e5a8ef413f837bb541b1fd6f825 +b7db4d1c1f3fa3eef70eb4df0e962393060034581ae4609479013a72d16803fc +a455f9722c2bba278a1ba5bcf1b8d1a5139f5ae71ff532481524acef4fdee7ef +14d343a1f0e3fe847d9c9e5878bf1e5530820de3e6d438e1e66f20baec033b4f +92d055105ed98345bde4fbb5612dc76b7f51cb9d66150d153a10427c027ee838 +38faa910e77fcd45a41bdc6081b0826206b56c08232984a85a5251a8a8362cc0 +c4b4f4dce651519c55777e6ca349bc060f9523c421b264d1b30895da4abfc4ab +9ecc4fe0b4a1ca8310f453de21a1e73e8bb587ebefa3f4555b5a332499cb2f1f +49b7d122ed4f470711f436d05695fc1f275b93ceade6d04fb2108517d670949a +4bdba8b6cddb62b1c9cc92ed63a8890d1e287e0051e7c8bc47b4a7fec9c7c33b +f668abf07c2ce4e080c8c4e9503b61940db11c5f17c54d09b8b8c5ce3985b422 +1ed39a00c39e87166c7ba0ef441d352259022b609513a2b134e13f48065c7acb +4b101230ba98195e8b49d570347fb95443269e9fcf9fd03c7aba76e7a1b13e18 +7d344d41907fcbdf19f616daa51df3b1b1be673f95c4ef1a271a908548cffd0c +5f70521eec3119ca5588b4b7e04954df14b0589f1448eaa347734e92128f4d51 +28243b9e8d1d64fa12f0c89c604ef7ec03587ba0858739ff07b07dda99390b74 +a1ff879e4219a459c6ecca54896449c3bdf93582f0890bdd0bd6cf8d5168053b +9a33cb7746f62a84af705b6135ad2bf04803e34abb34185acfde007901cfaa43 +64c992303e28a71bdda153858d252d7fd2da0d8dc618fda68f3d26c03641019d +7dd2050beecbf38dd29039ef1923fdb29576b7e3f10671d1cfd93a2e5dbff204 +effcdf0035eea6912163e8a3d995ef07170e0d74f88762a3cdd080d6cb7cbb60 +3adf3cf1e8079a2642cf23f40277b1d0fa687adc1ce2e22ca28d2715d58cf727 +a9bc686734ec03602ac69fe7ee9c08a1a38ce9871e9038cc624c1e423f34539e +4c1dd622e6a2d30e06e2095e30b6c545dfba323e78413ac65afc1be958369d64 +f21405f98fe5b5e58e9ee85dac85dc318349e91e64c839e9c94ce019c32c6cb8 +5ed016f2e6069a4b374e37155400beb75dc3fbdfa829980698b9d725996db955 +e4702b4ab9c406991b30154e150ad128f2bcc1d6aac5383acd6a9ce148ef92c8 +70931f701e867f254c7c82aa34f8d55b28f546e9b7f80437e5a258f22d55ff60 +916a502103299649fa9b14e5dcb9d2beea401e2a3a12bec2315fd88f23fa8a9d +f60511057ad5ab55a602688c5d9b215355bd24cfa4dcbc9959d1facadd693a32 +0bd8737235896ff92faef4135e208e0b52fee9ff7f101a4957c241cb836ef31a +4368603d687ebc95ed844fce7c18983c888ef7309fa051593913ad1d767e142a +d6e6993375d0abce782bd9a6ce804fbf4634a65c063344c1d8469684c09a9d41 +d64736dd3c7dac43b546866d7182336b6a73a4335b8696a43116f9d4a83518ff +1ef7be60d5a243461737ccdf00093ebc76627a1e24d3ac2a60cc8eb39b7ddd3c +205d80bfdc89dc0571abc93def1998bf1c9c4128be86b52c362446f2ac2695d8 +8ad1626b27d6110b8d130fc7189266c5bb05f193e826a98e86374c57ee9af55a +2ebcccf8497a068d6f60769d2c6a22bfb9685fe12e239b4b7c70f13d3ceb0dd5 +9eb53809883cffd0d5ec27e0b66b7a41e642ec1d989ce0ced2f386ee381ea1ef +0c659556abc7dac2d458f816f04e0fcceec190d561c0683f4d579807554ef59d +71762374f6bde146e18ed9944e053f99688ec4d84cb8ed2cff8f7aa3a9b624bc +0bfcb231c35f93dff1382e9568db2499df08dd1f8f8b49ebadbbc2df3943d11f +3a18992b25c7562a7f1faf0e6e653a678942ef689200eaada357e28f2610f9d2 +0f5fa45e81142d264e1e1a54a327ad4ed915749e9f27dd8a36af0b61c4440c6d +9703e5d375f449d352148cfa26c266ef7afb0c3b598e6458d82780dc8d262fb4 +57a136e4107749b0efce94a6ac6c9d49d725d3ae79a217a38b238e4b766edaee +64d0d9dd1e571f16ba46307838319adf6a0d1e7495cc545b7f1ea4911c21c8fc +b88075446a45baa28a9ef33e0b3f3b8db25c57c3a85e34ab0c0fb1b18e7be01b +cc2629fdc69e64825a845fdd7bae1cca2666dcd8a7f846521f4eaa2ab5eb1b51 +af7002dccab0a9a7389c2d3129175d8ce87cc4d73c6d46fcbc10018ea1538fae +45d1b02efd79b908cea0b20d186dfbd0ab05ae06084c5b338d1f60111f5dcdc9 +e2818773fe82b7e0a621678987b93e37946bb24b181a4fb4cba56e3ef726c158 +b0e878ab6469ea8fc0de95a17742141c1ac2b765be853343cf3c935be5b14b37 +203788f32c418aa6206e80edc58a9af1b9547a5bbbce6cc95b56bca4994b32e7 +6bb19593d6da2bb4db58c0b0d1bd0f94149aad4b85a30131f56931a145a65f1c +ccab13dd4b4f3f233d6eab4daf44f42b89da53d2df61dd7e1fa0575f27504b1b +74f843847454fca0e5264fc642a28541d6f1d1caedf7db860ed45d9965121b53 +5611a3fdc881cd1366ebdfb490085ccf11f94905ede6442391bcd93b1d44bcd4 +a7b2f17c7b0ab3bf04d07787451e43b3f25d5e864fc6abbcee5297a293c02937 +b374d8578b71b911556f9c0e71dee07042bb46706f5523f72dda2156e364dce9 +644756987a5dac995c0c86c4df48c1cca629126a0b67b59d50c4e34635c04cdd +165d5607a353568ead3949838d4e5ca7a8e7a9f88540508a122ecd371a77cddb +588e6392fc187c1a210dc63e42491795c21f9f50421bcbb5f2b58fe1db5be2e9 +bb7938f70f3f12aabdb6cd26559d18fd1e7e6757c5470fc2dc7f8fcc6564fe95 +c2164fac044b3243c72f3fd8ca843f111df1a51672447e49070f6ee4c3adc8e2 +5754e8fac50535bd2b164987dc02452a9de63973203ede40ebdc6d0cee93160c +05aa3aca73dc14bb9b8b01b94e8dbace5e937e7f0f09834f266d71d71bc4e06e +885356033cee9a7f346c8609fabffebe003a54704a4035abd55b26fe6819805a +cd33b6425a3b61dd8f3db2b7b9551318d8048b24ffa4b40861614765716d5e67 +a9b1799a48b69864e90476f693cbd8ec106c20e94502ea2ee452c200dfbf45ad +273ced950370c316ecac58f3dd67b523261a30fbcef78d51d427d414619e812e +72afbdfe5946e0e5ff7029808e6fbeb849fbd716ca435bcecfaedfffb8a2c48d +3bf406a132e7a3fc2a9f52c28763e7575bbc2f22f4029bd90c19d9c816205b48 +2b03f88fa36332d72e5f0df82134760d26ffbc3c5867556120f26d10bf19a25f +b52baf6a8f98f0a6322b2735e9c7cf5e152d0b7b01d97c5ee45438a287ff2172 +b164791b1b60b29e88f3b4eb5fcaf195f5d53910c8f00517a82c650621a83ea9 +94cc63f4788c98d56676ae219fef3e446356fba4b49a24c3e0a8c7413c8ac1be +4d0a063d6dee027e9fc4ca54943cefbc760615b6ab16091114003b158b019e10 +5f8c488dba09b70db0ab77ea949f889c1498faf8883d63c36caaf1d3a198e2c7 +6a2c97a0a14e5c3dcfb7034ad7357b3be8cbf95d93131d778758c29887f5cf4b +493044e28e29903a3763fd76b3d69aeb4ae6f95b160fd9519af1a8c90aeb2977 +6f438f1313feab076ccd14323a237ba5bf76faeb29d0ecef23adb8cbefcd6df7 +6741644d51076cf66f92b52d852c8994b9c763dd08099897b11adcf00e9dfcfe +fb6c876b4f076f7923fc3975af92e9606475c78b98d53f60f656b5ff23fc4b60 +32de05f8077319f6b35e97c43dfa17b4de3cf2a3cc799f8bce3aa8c9d1b83a4a +bc42a89abd121d46c1a0235aa761af492e2e2136221ac34039136c291e877912 +d3946118d5afb7f44a7bc0abb2b066606c7d4cb5fc0c8133a84721d8cc7ecafb +fb6b15b6ad5adac50a7c3a3b8beaf70054601140cb8cc08b6372ff8fafb5bd0d +f04364633edc41fa1c4522402313b35550fd3515b9feb6a17c4a5b197e694a07 +477cbd4a46999edf0f0a500ee4c701f55f00d5751c65d08a621cb3f41c298c6e +4ddfe05703b6ec04c25de3e0e7ad4f11dc918e011c5fbb236e5bef784b2ffeb8 +d79be24f9c1c394d5bb839142c1193bb7f224acd259d1a90d2d237addfcec05e +fa0c387d984ce73e67169dc36eebcf137fc9829e4bbddbcbd5f61c2f3155b72e +8f427a15b099c2561ce8b9871feb7c1cfcc24a639e0f2d051ecfab89797d1b1c +0bbb7b374df1d3df75e16998dd4198358e2829f7bd40f50a449b968813949115 +db90a7c403a2832454be362c71875df7476c7651f3414c0d4f497ad1b67b2952 +d41641c740028167677c48374b3151a9021fd3b9c21ca8a8efbd86b11d998813 +f01c3fcc990c60fba08f67d3ab4a302b62ec0f04b9063e01a8c6178f3806935f +638c972686fef41baa1cf372b735fb19bc389af9d7ddbc7d31acb7e915d4b418 +d7a5ab181ce663314278cf8881ac4430ebd3ee131a7a2aade1de7731da96303d +ff212e8fa851cefeafa4969d11b0c4a74e23654821ba2458961cc2b1361bad81 +a8fcbb99475b003c29f738ef40e4f9b1d89cadcef391db7cd117be434d085636 +3af49df9d46a0cfbff5af6e5e4d192a4d13050f5ce3e30471e489d57330853d2 +728007ffe1b7ce41375dbc823b84812a6794b58e38de43b2e22d0d059db64238 +5d32f79fe0d2b8482f61a0e1c2155dd69d2dbd2636bc0f07efb9f6f13c4e61ad +16bc525b35930de9dd5ef4e5e91146acc78987a2e9578475522b3c87d2f5c5ec +ac8e55de0399eb852551148047019fa08fcae9bb7831454ee0d5c36e3744d7a3 +4eed0cb0cc8e82810a673c1098986b7d3ca984597f37f695df8aa168a70d0ae9 +6f526f09ec75fd2c0d2fa0055c519459adc3e7c61816d57ca3bd36f78a06dbe7 +dc22505a4ca8af1b284d887b12b7f161fe27b6f1ed063fb4f7a37b5af0d1231e +9ed802879896ecfad70260c1065ae88e593c75b6d0ce546440c482f5503467c8 +54758fdc1c95cdcb7d5663a0e1ac98d0a518894aa3c6f4e4adeaa8ac81d8952d +585c2b70d5ad861b13f6b48616332c765d1fdd8a97e8b15d38097afa88cd7bb6 +b7c82dc031da0e5e919b3a8cce89da12b8548a7c45fe1ac418eeb8b2318c9516 +59a30e56f4f166a6fcf2473c213449f46cfb906df3ff8ac703020e8cbc71bf21 +6518a3c76265e644f62be4b2c17ce1c8fee549fd14d1cb94b646ecb1d14cfdb5 +cc422d8dae5a86550d4862acca62644fece36492edde670bc9ce80b0ffdaeff6 +82bde3dbf0c403b882882af7572a42b4f49f6bdb5a8aef91159546d90238ec37 +0ba7e2b0cf8bc7505d8a2936e88836d097f48d57aff9b04d08e9fe8f3f35d046 +47d6ae41ab09af7bc1335369407a9558436be878be6e8b7f4cf88cf09a6792af +911ffc61653653d1c6c8da705377941c7d4c1a6cfa6f47c2984436ef697052f8 +8dc07c91414283515bec6bf581c046306800b755c301e5c5e2509c8717d7a450 +1666d78c7a63c74279dd218840526d5c64da4cd356d24ee7382a471e511aa7fb +94dcc208f1d79e5b878bb110d5df78d7a25facd252ba729213bc5b60093c115f +61d72b91eba38d54600893f12f41c59b26752d3efec1336d8a1bdc0e9a33b9c9 +cfb1946d4a60836b1dddddcab7c18a1db24bffe3df0aafce0c145f5c27b8bfef +908fbff18d2f398b914a5803d2337b95bc7d0520bcd60d3730189af04c8417d6 +e12c20626580881bcbf4c7f6a6a5f43e7792de58f7ada1d8784f6a7b4e6f96ce +73c7629a1b3f78b821629b8027e85eb5241d8723f1632145263b0457985be78a +4709401ecb03f96444d94f3369b30b41ae1a16a7671d2a6ab6ecbdad3753fcbb +0edb46887cca933f5909694344f7282cc7bfeff1c3e19e7668db02447082f8d1 +72111d8526c17a4458326bccf6aac24088a3f6dcdc42d5c5587e05ddc8ccfd07 +38e7f9185281192a15d248f7a7c7f013508024e4f2386df48f076b2674e5a720 +c8e5d5db8b7ea56c349a963ed8441501c23b7334c245069978b1d13aae19581a +c8d6bd5bfd27b3083652678c15ea96ac0a901508d2dd0d4d89a772c740ac408b +b9b61c28d5fd3f46463888a3ff49ee43721a0d03907f2d20f9c953c6c1db8bd4 +32afa377913b374443bd560f68d11611b017c876d7cd1a2bed5789a0e5bb2756 +60a68957b69249f0fa1822e3deb8c8c879287fb81344aa625a772093c6ba1517 +11232715b0d53725ab50343c5b1917e2d2575340d003db8adf03b3835475f098 +25e541e87a326369ac59d4b9a71b2d5485f01cfd40313d14492e828a47fef188 +57aad991e624ab1d3d8d696a55d34e3a3689dfb64c5c33fed34fb0c8293da01c +83c58943509507870979b2c51f74ef700bc52509da2802c0f0c1f4516807c3dc +fdcb32c4b5ed6a87231e58f5896c85687edc3e7872206b3c19be99a863a40ff1 +5776e396918ae1ddae9acd9a3c654133aa17294a9e57ba5287db3c71dc1c0d12 +d9d6a6b85f5d1cb487b51e8c1329204815962b6937a22375d5db47c4bde26ed9 +3ea18c82839f55a28f62a508958bc7fdffdfabad5757e5a4e891efdfe9421686 +7dfd4e36a3a394fc1451e38907b58d16fb110d8b18e99945c9d1a215f6c906dc +5c2a8b98ba49c225c437068ed7120c3e591f754bbeb880fa51868ebe4735b7d5 +7c1107652525b3b844183f4cf351ba35d655bd5e66527cdc311a4f0db5412956 +9dabd87a4e45081b4cf219a75432c6c628b596afd87b39b68f600611b3ab3d83 +61b8b056e3aa2b403f6550b72019be02a27b7cd023c45f72ebafca0315f4fea9 +d490254d0adfd8702b6ee29af2e47be8350196e470d622bfd3febf223d7358a6 +a00f042f7d168507d7e69adaca8cdd219cca5ac0a1d28ec684467d9a16152c9c +a31478464b5a35cbb18f064af9de5a5044ae920b9897d6eda7bdad45a2ce8196 +d918a6c98eafdb088df5e11e3eca1b860fee77e4a7a68e21edf484532e24246f +345bc0136909dcdeb2d637b215f1087a3b14a74ce614e00dd9b52795f32dc03d +f2b5fe1c2b19d76b3ec5bb517b0623faa536c0752c796b2179ca76a40c0171fa +99c78e06bf1151c9384a0ecf7e384bc11248d954b21c9de2bf6df4229df208fe +a16848c893f1f25b80020ea691d92d47d82504eebbab22c4fabb9aa29ebc2aab +197d861b9a7949fd86f201a90ee2a453bfa2f49be46e87935cf365b21f946b88 +a3e8647fb2330928c1e5fde0a807c23fcb55b4e2008d5e3add8df3a74e5239b7 +aaec108ea92033cc581aebcf23116ae19f25b8d31eba90ce20388fe73b79cc93 +3fdd183ae909e3122384f79d2fe53cc07cea9151bb3ec076de154e672b580ae3 +42763452c9fd521e7be2ebd9f2a410e989ff4c5beb38346e37d6bc91108939f4 +3edba27cc6d69a60eca3cb41ddec11536719e3cadbfbbbfc877d39021aaaf578 +7b986a01db572a62b492c38466110e1f484fabf38054d0fd6acecc367fcda35c +f928707a3e15a0cbd3f0a6d555e1625582dcf088b8fa6859b01357a3fa460e7e +5cc1a3330318b3fada86b2c55f904d77675ef57f137e8d3852e1cf505029dd33 +153640e04fec2575888cae0258b22f309c93e9042d567ba4a0ffc57cb9e9caa5 +14ecba866518648f968390586f1cb0ac986ddddcdaab912a09c397d12a9973dd +c5abc02b82c7b3c1caac0f1da96154677b7112bfdd1c349dfdb5c4bce5d7146c +8475e3cf71ab9034abacae8182826bcc8836a6c0cbef7b64b67f874a11535956 +2c9a996748958e7238777f23511b0f2c18848599beb4979e22b98eb5d579611c +86d917d84c50b23d55e5975a2cc934a1265c0731c9510c003930cd829e40a4b5 +7690c4b63595f1735d8c2ea162db038f58bf18f3155d0d6c5982d43e0bbcb187 +2eff929a6e4788611c2527175460fc9a8a8bc2b2b3acbeebd6c53779a1156257 +0f53eee2be859bdd702d4e983b2877f1f3ae6e4893cab50d607c42cc9dbd13fa +64f20956338528553e7f0fd6db1fe98257c7acece718e79e6c3ea3588fac6ef5 +a280f937f89e570796220fc2b939832fbb6f34a9cff554269121ef6aa6c3b331 +4f2e22f5e597a4ff253fca5f757fe152e4fb5e6019766336e6288c352042fc2b +e780c7e555f03b991bc44a7456762fd05c9c2e997c626379d447dc056d66332f +fc2a137fc9c2dfa584b127429914c40bc3a8a0ea5e7d6cd3a86844cb8f1ed4b7 +63af17e80a0b808dcc5c70b38c1378c9cbf77601879d0019a8b2ad2d458c17da +932639d69cef730623acd1243b062ccddb62116655812d396686ddc1c8938edb +bafbfe0ccd33221070a60888c8397ca3924e55c5820f4eb29ff35bc501347a74 +6e3704fd2051a50c4c4c1c09c74c9e6ceecad42d37ddbc410485f90a0fea0752 +1d6508208d4d86ae19e2446d21902441b44739849abcbb2adcfa2fb353e6838a +0444fc13839ca5edad7b5638d76537257187eb5dc89a1f412c35ee4d8bc661bc +e25d809bf5e3b082051090b20b6b83225581b547421138abe92a2c3c554651c2 +604f7e79b48a1fe0e630a4caf13fc15fca552dc094be6f359736a68fb4791db2 +9b16edb6e06d3ddfd451b111a06bce53b70b7ef5858905663629e780d0a79fb8 +6c239fd3da4d2fc79a2b7619a3612490f147a44fb5a9a5a8826c7e6f70d9ac90 +41e33c39108c8b963f692c8719187246e9d34f34d5d6053ef759da18ee8251b4 +df0bbca723f7ad791c3dfb0f1db37b01cddda2ce698b3bf679d2cc1ce8685ce0 +c872c2f89c6a6897f8c203ed61aad3f8cc5e0371710f5c4c86343ac388770c56 +f7d1c14b15ca0434218f86befc24136ec73cca2ab768faa087ef70b3d5fb7f20 +0a68082ff38e522eab0ac5c74309807eb4597d8ede958790885aa18c792e6953 +74dd77595a94f74fb896587c5caf286f43223bbfdda9e89be778dffabde05823 +909db8ed5b5310ade1e80da1ef16805f5f8aa900be2ae91c54aa61d40a0cbf91 +4dcec7a0dfb650d6323855a5eb0adf481a2189f7b2736106c56e30a50c27578b +b7b21db20bf5496e50df4e50c834624fc1275dc25375db000aed74ec1a1a6445 +4f041db66cba8a7c7455b4b55eef149414ee08bfad9bab1693f197efd3bd22fc +8368d39b706cc7982ce7179cb85b9eb073fade8bacbb9af70f7101eb114a773b +f5fb3b4231bb9f5e439bffc1464f50ee94b499b3d84d879fac0012433cd406bf +b7420354879ea2220ef28c07df24dcb079fd0dc2a63f9cc9c709dd122b658f95 +e5211c61795a791544e9c21ffdab0acf64bd60644146153f02822f1518d0f6c7 +e3ca9a4096ff4c424516835c7f6607dafe23c0b70c8f8990eff7b8ae724a07b7 +13297d9d7c83d87a6b19eb98c48c6e9422dada99113c8540f48c1ca03058f052 +712c1a46f17a23b45135c443c1128563fd6a66fe9e3c07ba27511b4cf0ff68d7 +792f6fb1589fd22a2cf5051ed798976fb83d3b23b6981f169b44a3e3cc47af92 +9ba4716c51ef979a3ff7e4266899a457a875c0bb296ebeb8384586aa380f9eef +9d52ef6c952e848923ab3f564e776dce58f21b6ded7960f326f4e925ab2cbdfa +863e9c79453e338d7d61b387c193a862fa9e6c456b7652a791a91b0bf01a799d +cbade03850b816ea002185f7740c8e5b7c32b003ff7a8c78911be015f2996455 +586fba449ae8f9b27940cc97d25d77d60b0aa847f586dc6672e0c0f6d2cb636b +51aa401ba97d84da2774cb84912e47c9dade61de470b61994b83b75207af9abe +5e10e5e8cfa8fdb8131bbc68a63886e7fdeed53ad867b6d3284f4e957322274a +3b7b1846d860c446b0c5bbcc3c6241a56d2de295173c3d64103955b1bb8716ff +c0dc492fd348cdd46707637eba91fa455d53b9f528d2245682997bb43cbcbc5e +8ea3e9e2a2bd19202f67d7c16a42c602efe8254c3b2fe935c1f5bdd67d21d270 +35814763f60ab26fc8966849352d3fbdb628486cf74c5224f5d8965c5932f80e +0d8be4b9716e5747ebd84bf452312042fe88d07e57a42a8049fff714e690ae0f +5f7d54fde33112198294c3c6f546b09c76ecb3c414a5ed2a2f93e94c895a6010 +e6bcd4e883d2c7d7e826c14c9ee12f474948664138963a96f83ba7906736e893 +118be766df46767c4464623be7c3697be8fbfd662ef959e03b688d73d2a2d1f7 +4e9982faf31d21830d338bd8bcd83ac92127f9d48bd2660432e97bb6887e869a +9e1871fa2c1eb361bf3916f571d9c7ff2b864658ac152431b931ec6c4f1d48f0 +665a90054febb824b428c2a997b404813e861723fb6c9e2c4bfcd04e8a4d2b26 +2cdce120e24912d32fc6cdd7d7235ac5f3d7840eaff18bd818b715afc03eba17 +7a8c3c3066e95c8840f291521c8429841e8b39d7dec80c3eb56b49a21a02ac90 +0e7a2b67e67732298f4e324825f7c823b7611fad2a8b7eb6bc44c3dc0705b4d2 +58fc26fab5d9c20a786188f593d010a843a9b6fd47f5a71cfd728c48279abd0e +0a26dedb870faa7e19fffb970bcbfc6a61a487a19c56bc4e8d2e3ef093df0b55 +5a928a3b8f8f26c3e8cd4e1fbdb913d3235dabe2fa3b66c832bc9533c12fe5a5 +d6a004efde58f949bfc8bd48c44f8dc5f55d94ce79aa7d71ad14a4f7517ad7c1 +f17cab05e7a745220c32913f3c8f06cf02bacf882d8c293c8290740eb05c22ff +c32c4cb2012c3d7dbd643ef84cd928ef8aaee42797d010e0fca4ed02a1edbe1e +1d7861eb0a741cf976ca07bc02c22930776cb0a36b46b1a4aca00fd2d77f685d +8ba3c1e24c522e43f198fed209ed810b0a7214faf8d583ea9146b26e9ebd52fe +30826222af5fe432bd82d840d0a22b8ba2a7635de4c7fea5aacd8f946df99c0f +cbb84e5194aeb9fbba94a33ccdb34b44a309954dfe2decc1c3f5056bda9456ec +5a6e0bd801218083ac309c737f10e9a42e69b5bf74d0278fba6a691b934d748c +ed7644dfd2f5c5ecac8e55df3b5a225e3d5ba7706fe4e50b7d9d53df98880cff +01aa1a5936513db38de449dd1b1bcb6cf199752df7e2161857fa86cab9d1b645 +95da5a17bc0f305f9023bd265e341558f73a22bd4a01fed1867179986ed99822 +f6eb5eae2fcb74be99f34604fb47cba6c3a0f0cd388ed13dd07337175ffc9fb3 +3befc49a742d6f667af2a4476d6e8e0bb61a002b29ba069a4a78ee1bbd00fda9 +ac18a33cde76217e48b0444e7c90788e60ff3c820ffceda02891d12333d6788c +8028507fa8b9c59d6d6d476c349c1e3646640fe504893b23587c0fef7c278fd7 +e1fc0c12de081c4bc55ee7bf65c9be4c6168abc5281429f3d39bd0bbf771d574 +8b321d993df752b5fecc462ff8306ff73ced8c946f61087ae9606699c2e85261 +c50715085f967542e98f92d89bd22d1b96c1bbf45e11958ce4f31ea3bc994ea8 +e9d0b7cf4ba9ef66b8b6005d6b2960e68dd0c0af4dd9957a253e2d4c47d46a09 +cec1580c02d05bd3720daf7e8fd3d2144b8e5b3414fe89b2b95f8cd153b326e4 +25b4733ddb2b4e1f02000dcc806252311c1e313a1ebbb4a9c445350609cb8bd7 +25e67f6fb760765b01ac474780faa7078d0d0a0973cf6a475087b720de8c5200 +e953eee885e5510b83a16014a6a255bd8273610fd698b773a0e2911690b1d5e0 +517fa1e2909905419d539b7d91f06fcfbe4c05041a06cb8a35bbb51b563e425d +0e65eb7b086acab5475bfe889397b2326cde5d4f7b30da851c55c630805a0548 +eacaec8b20bc10ba9925d13990ffcdb569782c39032bc5c6834eefc519747cef +23e1413ba5c6a03a399e7adc118dab0e5a1a8ddfeb5888a6855ad7ca9b8c5c96 +b33538ca373d4934a879387f55ce65390d313d93e4cc7ec7e0f67c483c3cba57 +f5625699cedee9da8622f0553d19231f626404329268f440398ac131190cb74e +4cecd5be8cdb1a01bc980b993cd8b3ea77eca9642da8e185a363e7df2441b2b8 +d991a14e5a5fea3014aa375197fdbc0b1472b321d5b0d8a543cd958ac036208d +6b33858d4f5a454fda0443a5976a1008da84749552fed657df42290ea9e0bf14 +49b2f609c3b69b8b2618a73e5839fa69cdac52a68932ffd4b9eac9a96aefd44f +d7475a9cdcaf91cbf86e81758426068aad6dccbe6e874248d86bf55aca000641 +4e21877854e95f7b76b3994424bd597f3fbfe58461dc5eb0c03df892baaf83b7 +e5b743b0fec309198e019cb64047d127e47ecda08a6398a46621ee521d05ce94 +be413888a3ffbf5039563b15d39659a57a9044e6caac763d25aefa6ae3315fe2 +a2ee1f6fa44554bddd7150b8d852515988753ea49ead18885ae5d2c876335be4 +c4e022ab6fd7ccf70ebd8afb12c741f8a6b559aca8b7c8c71f2c7c2b046f5922 +4d15b2a85fb38fb2c15623bd669b4da58c1862a69e3d01dd5098887472bddb34 +8f37053c8a9022d23cceb6106487e1d9b3128ac1dc75cff1cbbeb778ecded89d +47e4e96d97b8df40e2b1b21fc062a353ccda5e734d9ed9b1800a27f3f100764c +5f568fa7668cbd8c9cec6ad262c36cac701239b6f462ac4936ba7593ce53e49b +ff228411d4f133a019c029ccb7b973c8ed2239e18c207bfbf148019d088d2dee +c58a1c243f368d42a7123f976cdd4bb47a754e112a27939bbae57c1335f365f3 +20d1e89079e71d3b8f7c2a4a4cda6961489a6f884d75d7493296e2dda3ee5bda +4ec01a82354be5ca793904fa722bf37d85e7fec21b4e98c225fd66e819ff11df +368257087feb4355932627f3f6b9c288afd80ce4533967f42b89da53d2df67f5 +77a03ad16d54cafcbb249565325b7609e419bce2f136756adb46f2bb37010fa4 +211f58e74d0931c6ce66474089df52b9401ea0e26c19714dbfec4f138d6a0acc +f4cab67c1aac582a768819f6eb7f1591bb471640e8a262d8d6be3f935229a8fd +e0c762f89935c88b847d7e7e6b15b2956ac4bc9095edf740c615c9018579fb81 +064a1d68f6982c0cbb0a33cf9a8bfc6e094c3f87bde2ac70fe526cbc63672520 +e6b35070550449599914f3be35eaa1e326bb251d9c9ef42a9244ca8ee79fab1a +dae983f83af2a712f9bf9a2ef74b288a23ca7e958ce8c24ba0c4ad0683306da9 +51071e3ee96c25cd8123e87ecb93cf760360ca98727a7ca23f1273ef4a26eb14 +8e00c231bf56a66f74feafe07322ee921c5de6979821441201c46d7e6cfcbc31 +3edaabe7adaaef5f7f2d7d297de18b504ccb3c0b0d77f03bc9fe79394441267e +5418523ae7f91bfd7389d20f77115a4a9129c33531cfd99a2ca3f7d3f39635cd +0ec256f7bb65b980a9353e9692bc936d8ab18bea370933ff01e8eac03bc98f76 +87e754593e3e06bee184bec18b126f7bf3fd083f87cdfc2c1074ed007432a6d7 +97182114ab1c8e763f8f37c705584da16b4bee27a6b9b24746df9e9b71729bda +630abb697f3348adac537b97ae350f64c8c8b05c82a49f8bdf4a2843c33be4f1 +3a201c7ca5b41823923c9d510ad2741b171e8506b0b79d3f18c8c363f3f04384 +1940e1be692b06b13774d4405ac2ff62876fdbf10d1a87456293c7f4cbbf8a7d +8a0c5ad8da6698efd998f58929c2919d2f8b4c52a904b618a61d4a3936ceeecc +fd97cecd156c2a5979b7321cc4f1b8cb84b00bfd6eb32e12febc812f0115b57e +b60b4cb41d6c109d9d4c4684cc2e46f7a8012aeaa0d7effccf5057cd4efffb16 +79f3b1e8bcab177a67427e3643105ddd8a6d292681cc9114c008febdc659ee93 +70aa08e8bafd8607a45721df8f66d072ba67b863797c96053df935e1950a7ccb +e9f22ee34e2e3607f1cf4bba18eb34480ee49898f7dfe120a3523646c7693b6e +809eeb360ff12283e6c67f84517cc4794c580810df85b855e394d7f1a35c8905 +d61252c16ed95e1b8b64062d122ea621777678d13d7924cd71666c191599921d +f18bbf96addce54db9ee2dd1d4083eb31593b706542e8cfd5438668747dd9234 +afee940b0c9ea6cf1470a700aaff7c1ef56751ba9b10fc5772dfa61f471890c6 +911d9b68bca77b2fc6021d86d68b032f1ba6774830f123e21b4656380efe06e7 +0a6755d5b599dd09e4b1e45c1dd74f7523f447c5fb468a871db7fd074305fde5 +ec49a348a02da990b1fc5cb991a715fa79f49b4d32f601f102618731d98a10b3 +05625db0c0e0eeb02a4fb69a39e4b716993caf7222e329d83cb7e60ea78ced15 +844f3079f7821a44c27c237873b9729c0d690c31e52f3b93349522c6a1da789c +75cc0d1059a2d1339a463acb7da3399414b623751485e9ccb0523a5d0d42ddf2 +e89dfcae5e6a7b743f7e247d171deed57bd133eee43dcf5c95eeffe36b3440fa +2276ec0e4f99715067736ff688c881396724214099c6e2f821721ebdfc68f16f +936a7ca1cc3745ee9b127fca1d9a338cb602b03655e8de2111ea1371808381dd +3190a5ab16fa563e4a71d2499e095eec2749e67e532583d7bb28c595bc45c665 +f14d206480ac3d562c7db8f3314cf070eb696fc952dd964704f7705c58351736 +2364b2b1017c71623027fa35e90a24d7f5172b16fe9a88bf97e05576e582edb0 +8893b5e2465c61ca3157432a1ffee7512e94e63060b4a5c43d8205da43c6f75c +065dbdbfefcadf13177c2b77011e121c1f5d19b6bf1fa1de2a141c4b6210ec1f +05dc8f30bb9feb6d9c22d6aef88aef4ce2c3c9563f0b0eb391cfe00df55e2e68 +1ea1707b2f0371d7095f718ae3bca6c483598937251cc43209701e55a0fec0ca +2a84abe42e58b16b19a8cc1875463649b037bd08e0f3af1dd70348450784e46e +23aed8305e833a81740513e494ec2f1083038404b3a79b679e530d8e1cc833f8 +4fd29391aea36d2b37d2ffeea00e90d50d52fa2d9cbe5224bd19a4bfebfd6d36 +04c250544cc529026dd473b7e906cac0bfd8b106953e4801768dd2f21a12b674 +3dc8e9ea6e662ef88cf8bce0e34f7a88d2401a80ce26d44b0897339dac523c85 +3953cb6a3794963e5cdf296b979a20fb69a20884894c05e38da4d3097da18417 +8185f72ca9e34e0b842662d9f51c59c0d61579414e44f294be31831e7f806b48 +a9c60ccd6ee051d4d29e406c6092f867ea3563fdcdbde1925fecc354ce0ec01e +281d1b4360f3ebdbcdafd217081557869c8618ce923ded375425b9ce0a1f4a33 +eaee378ad6a1177df9432a2f140d5131bf576271a0db8d1e74ebdb78cde4c193 +a7f2fd5e1783013db6401acb51b108f4a71b16c9cf57ef903998163e5201a02a +137992528337a595d9c17828074609b7380f9ea731edb55d4f31c542b522b6c6 +ea2e25c8c562d392317318150d4869c0417be8f5ee48600dee3bad8076d86109 +8a2a3b62bd512b4bcd48916497dbb3c90935321ffc39b457220cc32348a2d2a8 +02547d1f4b4d4bafa402b8a7a7afafbfbd3207b046a576e3f039643b325d8474 +1d1d156f026f664f2cad54fc268f41fb9ded61b9ab9dcda646b42c9070f40635 +a46dfe209b72eadd40049867e8b15bb0a927b1c51c31ea74ca99c4b06322dbc7 +1da693dde3e686c7494d7b49701e8f2b8cd754c30476cf9bd5e0d5af5c6d99a4 +bd87f1b73c25858ede3d1d82710e3bce544fc397a91cda4604e5db7ad2d6460a +31bb35c9ba6df033a70ec0c6f601873d4c6a3d14ea9fc616786920f468c2cd0e +ec9d63e8d085d0be593d8344d989bcaecd6f770f7763e0f8f8938a1a26afda38 +a79a1a0780ca251ab2d9b11e33e394e4ab7bb1f459e9695ad88ad71331277094 +5d3d6bbf673d418761ac787ef5159f9fed9103b28f0d5d86c4aaf4ee462228aa +24bd59026dba7831062dfbc34276c5bde5eed1f7091a216d155ea9f4d9e1e4fc +850ef02f31cf85eb5c9eb8d4f5c55ff4147242cce03827a0c60abf2a727981b9 +9891e361364bbe822a4a5a88f52328ab182a459e5856ef9edf6c835111e2b91a +04d83ea913210e40015d3be601c0b43e2e677d5c9cda5a3d2c405b67095f3fdc +f973bdbb333d13693924369c36f5ae1117bc90d9624016b22a3d6f23a80577b7 +5562f3d48655db8a537bf3409b92d2bd3b02b1aea544636a6b2856d0a1a8debc +43bcf2023a54a3cd885fd9ee3fda7f3435a911c9103f101a39b5a3b5166eaa66 +6a348648ccdc9116fd0167dfa044e6f3f73539fa3444faea7a34b37e49c34ccb +3851f03148c78ce454712f42044b159167701fddd5b664196666bfcbcb7b0b26 +1fdd85134d0a46fe319cf381a545b577d523894b7492f632c944848ea6901adf +9deff2feacd94bc30f6db00a591cefe205390e32974b78f82a6ffa0c1e746ed0 +430f333fb242cc438e0e107faa0ca1a4073224fbdb3af21f6926b6c327f14bb3 +680282dd37e809b2180b112a1d686ed5beadcb5a230b890a30ba2832c1d08aa5 +9a6e9321c362edd0042c1483bdba5ff764a474e6254c16904f76642009c316a1 +41e3c824949a766c5e7067f9eb168a2f152bed22acc112bfdb3162a697698f8d +7eebdf52bcbb14ff206de000beb437783d141f93daf468b1a6a62ca6422e0d3f +c51fe03209132e719c3a7dc6a1aa36aade44c9f9b867afa34f3c26129cb619b5 +01ba4224c7ff90ef8b69650045c57d58d37ab9268abe8bb62459917aad27d939 +69e9c089cc4f417a679bdd99de84a400fcd4e388f4f156fefb6466039fbe72bb +3d05549bcb90a7ec0c2c3565801b3a7a437615337c8dca761d83a7644b04d4da +e67e00edbf2b3139c40dc3d470f8d476728119e9ab31d46b3ff3d6e34bbf6532 +62ecd23a9ecb93ac3d2498f63193ef72d192f98b05aa779b5015b6cad18fd29b +421a17e01cb394d588e37ab7f986e20e204a0f5fe06224f53accc121f112d58a +79f25c60a550a1b325bf33f568d69ca9a4cfb249096b8efe3b43cd703db80fa2 +0bfdfd3e01433f2f69913d13c1d14031545db4877ac7fe4f562322dbd2572cf9 +94b7eb300f26c3b53e75b02b5889cb0420f378a55c9a9b6bba64ce698ceef061 +349f8eee5b3a486870c6a11e9e3ff3fa00e3480610a449c9ea48bee511dda6cd +9ea3e4653dbefb8224bc55a02f77bf16e7b9879bd9ac48788e2fb2e237dba707 +fa90cdb918e02cb6c3e49925b60e2a05a71546d49d1bb161ea5ce6d303fc1876 +dc17e24f47344fdf6029f63d8fe1cc789a7753e492f5421c8b7ec7b777ec3497 +4575b63e74fc255ec95f3a1e93c4d752b42fbc1b1b7dc52b3bd4e33102046fc1 +e16b7ee6fd0411727965c75de86e547608807e51cdc1e51b76b8f9ae0484488a +7d21cf0f3b7ee73f691fa048309c990db12036ec5c299a4eae7411759dfc574a +c321c443af71421b7ec71550348ea60512975b17d6ad6a22463aabdd94befd38 +88ccf264e94a723bad53e4ee0a32245aea16837b570ba36eb70a0414695eed42 +e02948c308e22fcc6d2e1bf714ca662f615aa7cf0b71941fe08fd416db23e1a2 +307575f66fb214814bdf38383587cb14f5096241a544edd522f12bfb4864f0bd +989068be6e80b36c06d4a3609f45a3f249353225d7b0360c438ff0e862a2f29f +77842f954c289477f1654aa13250611733e6c7c531ac69fcedbf29c1e6de2d5c +edebb77f51a6ea25a3fea286986232a2410240b9b7f31ba31a59c40a5882f794 +832097dc9cb0e806db71677341efd5244c8c23a520c8267213204ff5f13e4bd9 +ce3e44c9387c17161ecc5d9c9f40b8dc4e6a16d93f833f07277e976ffb09be89 +d1fe74c1c6e1cf5e21724f8b83e70fd0d4ae72eb2bcd30eacb81710ac3a308f7 +e138c921577a06c8ec7293ac443fad6fd7a6a1873c09011b29e0469e411358e7 +f5d274a072ab9f84f3c5c74c7dd8121084019d89479d44bf25b47c248d4859e9 +c46d6f0acc65a9e1403ae66e84ef3141d688fcf71290cfc65eadab3f43474c2c +c8ae995be0f19d7c0f8a3e2d3e40e2ecdba5efdd8f07981db3fdc34b3d014039 +3d2cb0bfb72e821d01bb22f461cd8f0ca7254cb8937f9f228f1b356c0eb3f522 +8a9337aa9e0b24d3bcdf37b2e2255a8df12b1b343f8df33908e6bed58d5ff638 +584c0c4bfe04e43a4237cefa6cdfaee5507428543ff220a987e68c769d0440a9 +d4a33739e9072bcdd885c601dd30771d731a7c57713bd4b8ccc0c3c188edd8ac +1145ceaee80b1bd2ca85d582f05799bccd97b8547cccd71d10892b1409f2d672 +dabd6f0be7864de89fc66f758f120ca8a7983688e0b05283b5371ef01f2a68b2 +68d9fb855d7d7238b971371a8ab5f9d80e151c132a377d48704342146f9744ec +d7ab4453d258a8719b8455ebe73d35a9f70dab2fdd5d41d2fae8cf56146215ba +3fba4abf8f98765c6ed70b6ca8ab6e28c61611741eceb33e6c2958db40202f25 +8d78853a789ff3ec7afc19e5348d8422f6a28d65f2566d046d7b74973685473e +5cc0ebeba1c944630042e7296d81ac8caa96238bbc09f3067a7d3bbc45b27431 +1abb8e4c580de95be79dd7cda3903094a88fde6a8cfe77633e0481b2e67ca61e +2dcf7872318e63a4134c0f98a472813d4fcf98dffd30736ecbb4facb9c6fd915 +2461f90b736211e0ab68d5cb662be0b511a1e60132f7969dda9b229091286f87 +ec576661a94f818b99dd27ff65a4c2a3c500ff9cdb4b7df109db016ecb5a239a +4cbef1d443c48703f62905ea599b82f76be0fcb01263eef1ef411c72875dd0a7 +a5157265ca3cad3d27f9f9c20577a552e59910187a9d04f4002e07e92d8f5929 +fff98442ffd6d3f8eed65f2c2be666aa6220ec4e18ffe0d2f3daa680d4f27044 +0c3ec7971da783bf7928f77cd7dd11ab8528a390318fc0572f13a5a2b20e5ebb +1daa9df821c0cf3a34258dc56f872175f1d5d8bdf14478a19b53e278cb4fe83c +527bf56a42eacdf193c6ee25337cc2215016a7014f1532df6711d9b637a3d500 +3849a0881c778c74e8e5a47204bae5374afcd1bb8e901bf2a703c5cda6df6915 +c9a93eb94d553d50d3f178eab2f8d6338416539f225964b688bb649f4f148737 +410ff38f25e56ecf583f62f09985f94ec048b8b460de00e58f4f238570b689a7 +ab307b7113814d5f3ff6cf280262acdf7b46aafbc234ec32a931399bab9f2ab8 +b6c05b23fa2152c10888ea6d4e44b44e65721ca646ecae52a79a532565371f14 +1940d81923ad84adc5c6a9f2d1d1efce1e53b5907122edf3df1b69e2d9a87acb +303667cebf95dac21b053fbd39511df938b33032db098fa64fc7bc6407d11be9 +8402713b6bbd9027ba62baa364ea172aba41d3cdb8c6ffafc5468f51644b1576 +84bb51f49fb04a8a56a6cdff871b78b413d8b7bc595bc8e81e453c36087db7c0 +92ccee99d0d3f8ead6877edc5e28210a35dcf3cd49c594171e2531da1536f451 +0e0d51ef1760ec7b1fe195bcb5785c3f26d3c3cac4989c66f6f75a675ed97990 +5621f8b814be502c4c8a940bb6d825e27ca6633eecdc0f1bf725448950a37bef +6abbe0bcd5620ef0a66a736b7eddfaffdf62796577a1f482ec4bdab07024afe3 +18e92459fd61a4277b5e885c50a825e94ec3e8aaf4292ae4bc9499a00ff14c6d +4f742615f0f63a62f273218da051f35a1a429e1b79be5926c10c5a2ac38ea8a8 +6b055407faf2cd0fd6a6b16f847d9ec7e911e436d1d597e012cec5a08d98056d +63ff4d16365a9033251e8dba1ee34f7359fb1115ee681f78a0d9840fd88cde7e +e4791044bc3618b646af915e316d64bfbeac1f6c50cdbed248261813749e1c0c +f998383bc6454d6b384ad69f9a8833860df4d66f750fd45e36f9aa1da976e55b +0b06477f3bafe5feca828fde3a373dae7c2c029f2b2c4992d71ae4fc1804301b +35ca5e73dd0a354b53d1c74531a4c860ca8946c9c05c93483c0f315caa8d791a +afa03fcae03ee7f6378c9ae14cdaf68f002c3f306682777ffc83abccf992c787 +425f604253359ccc2d30361ced2137d2f825eab125a9f4411453292afa0a5228 +e5b6b4b6cdded786c3623f8d02bae3733a72bc1d1c5d8e6ad59a371a1769512e +c26ebbb115291652182bc46ab673d016ec0f25487607fc04adfc072cd084e66a +2d4ef87343c42a4d94cb9bef449af70bac826c0688e26fb2978bc71dcd25fae8 +c3e2d96e8812f882fbe9e0962e1bca90ce38a0da87c42579b1cc21c117ae7533 +1016b8827a466609f215fd6b6b4217beca5e741118e7f77600e1ec593fb3ce2f +cd61c7083a4c5c9b4dc9babc7e573710341d678c527068533bd6d38d9d9c17c6 +51ab8db46418ab6a794d330c7d0c2c5f4d8e6e198b47ad4410fe1e3dbf9ce038 +0d82be729e3cbe262d2bb7f05f269022fcf6c89b204288de95aeb246bdecb355 +341eb2e622215e967abe6b6814e4f76f6dbe972688d7c2ceedbe858b96742122 +8cf1718747cc0b5ace901b98f4a99d7fbc8e5c675d78f0e822fea12e8100b88d +5f8d86c5e048d4d33942bfe125d27f2a4cf26ade4b16d4986ce4e8464f7fd90a +20a162991146ec48522d334120d140e31bc5dbc0c038f3ecb63ff9a2ed0efc3d +a2d7c96b19d6ed49cc04a54f33d365737297ba328e3d646cd0390ec55747bba5 +248d44e594fa8389c72aa738a99dc4dde351d381d010a0f5fe48aade17f62958 +773d1d8500819db54d5f7a21a507f767f2ca63c5ac7c08fdf71e65aea255b971 +f5c2d65dd53d9f62d85be99c8ee05bd698cc7abb7e596ff0d11c51d0534dbb49 +2b219763fc99ba557da54c10bef24935e45364d8cb1ca2471bacacd1d67a77ac +ea885796af2cad89cc2075f3b8bed21f9b56d11d21561e5752289352227e944a +76f5fd44513b79a03f3639bbf8d2c7f4b8fef335a20482b0a3b401923458a4f9 +63f1e52f94ead00d13a5f0fbeaab7826cc8408635b28378899a05e4e390490f8 +d92a93eb8a105a4116a86611ac89f27d946e52ce39eaf255fce513d2b2042e66 +618cc2bc91e8c0128e8315624acb66f2d48cfe637bbf27cee5d0fbaa4b9f99a0 +ebb9f9d8093c08bd4e067abed9308ae286ecc5b0cedd695bb863da43eef448ad +6ab3c9278955e9c1be2a059ba2524352a720c49e5db9eb8d06a09af38b957f78 +c686bfef9f881d906e5caa32e496939359397693aed22c868b2a0872ffd968f9 +53b7c508ae04f706876bc1e165c26abf7ad0cdbb6a0176df1564d7f7cff2359b +cc151a058c48d429db6bd161b8410082d3ac53331c4b57a527d18847ef744ab8 +af983f3d22e35b8724dc460d0484f6e7470316dc9554906769faf9e1e070ea2c +816a9c681e3e00be2a1ab9cbddc6a43a96aca4f4e7359c1535e1e88e4f360569 +13d587efe19e00d48137804dcf153719e8b7b80ff47c0c007d80a1c6a1327d17 +bdf5d8c0c72626ac7e5f569e12ef87a2e142ee2261634e8210f72d92f64e34a2 +c15f7f588e78865b3d6a62b0c3f5a3be15c0754e400d62e7e2618ec5a93417b9 +1a079de49906243fde354491603335b4bf6daa0798b51ca307e41f41baf0bf79 +490f892cf47f2fc51560023dd15049526e134d67f48181f3751305c34ee200db +772cc0dd679264b45a99f5d30c7e893faeb3906d243a037e9baeea613596f222 +172033b01edd18c94df6641f049102ced150c535c70d1c4c66805c5626b52bf0 +9a97e5b539778a096b79166a592e0d5bb8950f7d28ff143f99495cc7c0778405 +fc7fdd349cf53686572f89219faddd5de8f3ddfd828f333edc15f3614f326975 +c9fe749a6a2730670919b4276eaf9b482ca96a0ca64af391696a78a377fd1010 +74a90f73d9895c89d4008683f0759813a61714269f67b10c082843a92fa97b55 +d2f9a40b8e4156f3aebc7fcba0773e00e781b80b07004e5b20f8c9fe14e7df67 +12a64ba22cb262799c84746e45f3f41c4776314c3f4a0b9d7eb83feffbeef166 +0d4590a43a9373c08942f46daaae287a420749f7046742e7b6e15ab3a04d2b97 +2ae73510f57de8d24e555c438d0953e1c41db9d6f6c12d2ae784af55f696efa0 +24b5aaf5b3e20cd6aeabb356f33b6b93ba8cdf2537f4570332c0dd0fce1cf8e2 +ff3cc038ff272b1df339cafe3659ac4541f2204e934a555ad9f1e9ba83148113 +8a8947bc49b9062e71c202631cd8c856e87cf08278f9fd047325dc4be74ede82 +42f483fed616aae2d6a5dad1e1e83f124dec374d57b81da43a0983daa34af7ec +ddec60dbed7ecac68409956a0eaecc110145ceb8d99bda1a766c2ade43326b29 +cd6bfa4416d9e0f2153f4f9a969b033087e152ad9bb85a40479fbac509196c99 +a4f0841449eca6dcac1b9f9d7b26fdd6f7fbcb3cdd32b75091c5f96b3bf114f9 +610343ed284f5658752aac710270945c0a41bc3ddf3bb0b21448311e9331cd27 +06364e3090a1265a17b1b424d03b1e950c824645e11ab766503b0ce70415d410 +afaa5b33eba7b498d80302fe982d9778e4845f3659254ea382964e395d4d0341 +a9feeda8f963739e10ccc58baef8dd49a1361a0cf95083559ba32a8e5426c981 +42ec2e925e4b382d5a531912627eb2a0d98a25fcd540cd5fc6df156d4a5eb1e4 +14dd84c16fb9c6945e7920179130036b5f05f6e283ed715306cea7ecea13e281 +fd69e9a93b2bdac310088ca3153323138d52bb2db9d272b6ff67eb59f3db66f0 +8d1f6ce77c4519977721aa8f532006be856b00b33369fba6b980c420e34ad5b7 +810122ec90aad038dacd3db88ce061e05d12ffe44066c1671738aa913836edc9 +3ab7e596024fb3498a29e5bb543a67ed3e14b9eb13dba247325e70cb0e1fdc5e +b3784da0415cff2b1a089779fab42debd53920ae48556e4f906f92abdcb35cf8 +d53e938b1ad434904aaaccc9463d608bd4dddcbb781f44b864e1703813fae91c +c0b148445b88e4749cb9f52e8a6b8f598d754be58c22aa33d00597d22502a71d +c207d7ebc4efab16f0a9c3bcf6f888698b443779236c33358ac4fc59c2f5ecab +3ed32277fd98ba68be767aacc6abaddc7755b15c62b458a66086dfb464f6c7cd +adad1017b7f4f14d98ef09f0c709ab6c529d19afbbac325ccd80d57ddc19ac69 +57f50212f6500e4adddb800bff909d6117961e6a1bd8580fae0e33103618d4d0 +ed7af5d04ebc3388821c121ba2067e10816fd1dc7a75dfc98106c6e9105f01b5 +99e845e0236258628b904df5441abd12772594645537c75b20460c48b5f21fd0 +2f73460068ec2574fe6829d86d6958a91a588ff609f3c9bcc2bfd3d2220e4550 +3d0e5a0fc0a837f73351be9752a659fee027ebcb926f5ede378f0bd10cc567da +8a829b235b48eb7735919563136fa1a79f99591d431c768b5867a8d2e69e05ad +4f5ff1e34e6971eb4413328c45f3267cfff49e498c870cdb50680ab42bcbc34f +c836c1efcc10e50a43b648c88a7cc7d703389dae2b835cbd5510e1b26d4d436e +5f5ff8f7527c1519bcdc7bd5fe20a390f484db9ed9b91ae7c4f03dfb68b1f204 +5118f5e814af4ae832444f60827aab48a9dd05ecd39dfc943775463889604a74 +58c324cd27782d8bf4b3017821759d70a344eb605bba453527aa7de48be86d71 +c3477d99f41360c647d103666648a5ca008af3e1d5cfa3b40ac10dd1e79b302b +eff96c18bf92a086103a9aaa81e55d1af9fc36931952a736bdf7dc57354afcd6 +a964933bdb66423ea58edbf68618cd5ae35ec562f343c5915df0551e54888e29 +5c86cf31506cd44e8b3224db4aa472bd23bf94e1384078713baf280093460a52 +fd49cec5c2c29d91bf98064e53137575260c5867e73dd117e814a1b2aff8c497 +406a5dc5ded79cbe50fd30846c34d7841a850bd3fe132bebd9852d9b2f1d7726 +559e1cdd292bdac58eed6ae15d3f17b4ad0cdde87b584b190675d27b5fe5d0d4 +71f3040390f6d65937c6d83dc34ada9dcb8b2b401cb1e5396505d0af8c33f113 +518912b0b959f3c2e8d208e1ff28951f403400ad78ac0e4e1456fe9af63303da +adb9fbc8e99ed0a02d960e54c39b3c27e58198d01e358b2336a4be0eb99ec566 +73d45d79e6706c7304c6982d64c00432335da50233fdd28d4dd03851cb8aee4f +523bc43b61f26affdac9bbd7305d389f508b35072c30be43147727dad9199881 +c7044b0abecc5c64d7d3f13aad67177d34237ab9f8cd77893758e13619efbb0b +67315237f63312eab8e1ee1e5a594ed963326bd2c6d54c50b8ee10538b4fec25 +16d138109d2d48849e015934d7e32a192ce4abe5156402c3ee8a3a5d502ce829 +d40b9c801b78c024fae15b5fb88c7ac33028235330da644482c0a22ad5444ed1 +0f69b227de49da59eac7aefcb4ee7dc0b5d1d1aeb6394ae1e0d9e130c1b1cafc +10787eb5aeebc4e7235e6f5b1a991ee9a4cf0c0439025eafb59959c32604a640 +e9007f46f9136026d058b594b796e6747ac3cb6b14eb61a1d03dcf87f05f4edf +e1c6c0dbf6c0618f2ba9d1a690cc811c28033815c699441ac4055e7cdd9d2b91 +b631f7c3ef32648d2ca927186872cf2fa646630d4eca09162ae9fbb00d1ce3c6 +585e4cdaa971d4b7d4ae0d5f8db5da74ad58fcc9e3378e7b2d4ca0036fb50611 +c98fcd020027cbe5faf311ac7a05af6039843af9fc3b830e0a2cea945eea5396 +a5dc74a465a0b6560b6663ac69e867925fb1a69cb553aef3dbc53d8a631e87b0 +0d48619e77de39aaed7dcb68a7a4108ce2225010964fc08660d54d73064d7cc9 +c7c6a2d12d7f5898280324a90128e4d0730ff35e7b93bbd350669297a6214df5 +6a775a5b7e73be6a972896e05d423f9e9798622b632d215812e911a93bdb0ad1 +3c5f628c4ac5704cddf78d3272fb1225bd4e12713557a403da937ea52d193726 +dc8178766f4e739d2e95f14939270b6507f35d83e1fad6c821ea1dcb5eb2a3cd +be3870ece243b7f406cd6b5cb1caddb1b98c32ecdaabe8672dabb042cdecc286 +9e895eb6fe13df2abd25e66acdf07d402998dc54815386a3956cf36458234147 +c90a39e7101e4bf2186153c63ce96f3f34499ae1e1c234a3357ca2ce163106d7 +94083eb36aaa93e85e1676cd94259e173fb6ac65d133b16bd1314b259315c462 +56f294e37c763c5f16af239738efcedc3a6bdf8dd79b34775709ba54296899fb +e9a316485274ed8363da0329ad0f41c62cdf48d7a25ed45ac95b5e6a4e1bbac5 +6da304edcf14c008e3f0d306c7f845b87ba80db258ba7881695209352f41d78d +316017371a32fcd84bf788b511afe571f71e217c0dce3e04ab749d4596d0d340 +87540d4730c013796215caa073a1b99733cb7121a44e22e4fc2b1c052798acae +0f086dba8eae791662949a26eb35613cba94ac58e47f4b7b953ef9913dd2c535 +37da9c1cce1474632288903c95bf7bab47f056b62d11401abc85b20b66d0ce72 +545566f9bf44f5cfa099b66ca02a728afb9877021ddf05c1245849dc6b6816ea +b3cce3e604f604cc7cad40b2c919df5c92b356e0b81f6738a8dd7469a1015a4d +6c5c6decb0c3eae39b7b3fcfd482d53ce5c171c73e23aa44ad41c062e8c7857d +e8b56561cdcad550c6453c755e3e081273763f4e68233213a4059f6363f55741 +973356725ead4dc6398d1d6409ca8d49cc901f6e9958974a7ee5c02f9c426f11 +f29b54c316daa3f1d66e0c9ef73624aa70d23c0f15448cd295589bc2915a6a6d +616d77134382687be88b7c1b9c63c0e695de5487a5a5162411b8218b1174f035 +216716b67f01661902287ae5b384b916d2c1682e2a0664600ce5e494f13ee820 +4b267bf8e863072bc11bb5e4506167ede7aba31f58e468d3f60cf5bd5a2a8721 +018ff213e5c84f672f6f2e651c4708a4f24c0302dcce4614233ac6f540ead177 +7a1155534ea0b6acf7dfebc0c6dc49fc9692951f587cb8c1cf3293328df7655a +d82a144d193cf8b9a274d27c22dde2358ddaf79400a7977a1917fa10f445eaa6 +260ea56720e322abeeb790731031a345c323b9e2e220e9e9fd0d121475c6a7f2 +464252ed44f00d02181f1a5814d682f28c692f969db1d834227cd4b539539ffa +46be32ad1ca3c9b4b337c64d3e61fa5a6d7dc29345a44d0470e564ad61cece8b +37595d7eb3c0933457be8f73758d8d6f38b3e843c8d049103f5193b0e855d5c2 +df1092085c80154c50fa825254dc1b8a895e0bf3f681c2575bbb2b49e64a3c3e +77794024051769ca5903cbb11fd3333656c4eb07d1d366d656467df392bdb9b9 +373e38deb2d83a9eddcb2699116e15b9d0da679aae82655eb917986e768788c6 +279d5559bb5b104b829164cce27896027913105aedc252cd0bc68032feb026c4 +1792df669bdb1d4bd94aea620cfef970e8756b258fa82a9eb86af25b6de4e5e4 +8b0bab5d552326d8c0e6c57783935d7f0cd66c078722682bde80af3645d4a9a7 +ef9aab474929c1749186c309347db0a5020865337542550397b2020dc666b333 +9ba495f358ab8d0adafcc5a3cf7014ac94b635e2ba1779bd0c44aac60cf3fa4f +ecafdc876bbb528cafaf4f577266ed00509dfdc52aef8ece25912c04b8283f6d +a8cbf712d5df4bed83702a76ab73d0adc789924a600c1b00761b986bd668b6db +3de4008316053ec633300ee2e3ef9d0ccd3e2e5ed6a829ca814c8d127dc6f618 +d6165639c5ceadc8ff161f081a019def0f888ec6ccf12b69502a4ac2e802546e +52600c91d51e70bd891c5ba957ed3951d84aa76f6d2a1a7198965409f1ee699c +08694d9852f4a97839956d8060dd6004b0df827d6daf19325ffacf8773f5a14d +b92eeb033282a681b443b54f242016dac22ca7388fb8d00dead2af7f39fd58b6 +f109bcbf96c58e46982148c86ca3bdbf8b61e8164b08f992744c67c636164fd6 +2d68c25016e9c672edbd444e058d3cd9154ae39993f1d5f319d58991f9bcb03b +34910a12bbb597c3f871244561495f5d94b92f3c6b5e1ea0254c7f989e033eb0 +de0beae9676efb0d75ca0ec0fd07757bae8caff29bf2e1c0098e6d0843a2bfa3 +1031b383ebf4d12c07f1e3caee0397f7528ce5eb04c595358875d2872f19cd45 +7b41ac5dafcaecf120b2b11c0f3e927366e7a73bb033845eddabc9c62e373117 +de6a7e7d6895b6e6972d6c36634d46d55e0070e82f96ec375ffebce8a4e09818 +11328206eb0f4b66e0a8087d0145c1d10c49710c3fce4a5239df90d0ac21a0b1 +04d2505f7b5243dc96d4912c9dee3be9dcbfd9f7c2a9c8886dee4c41c58e9ad4 +71836d2e48f5ea7b0fb04ff6d2ba7b8e78ae70c765b11939aab939ec9b9a025c +f27923c7bd0455bb858ac6f74baae573b066943598c3eeafc7f1bfa1b0e5fdad +cc763c0badde7dd314d186b413216fc35ace73311dcf84d0faec0dfb9483eec8 +895fb678dd36d56618c3b125f7ff3b20f7bb8dbd86f52ebb08bad2a73ed6c940 +44706ff7ff263b0dae915e78cb36345989ccf84063ce6047e93a2acbaa983182 +db3ba114d80fecaabd2816ebefcaf0dc6eb42fb47b3d2318fd557cf96eb5201b +b0b265bbb77da6922fbf9184afe896b88738ab3f9ec78e711e418275b101f8da +be795d094d3b2c5f1c5e01da37b4e5976cdfb56fb459c8611ab2cc9081863e48 +eb4515035709f715f99fd62abc2e495cc8d4f8a1becb35d2126ffb08594ff4af +bb82f793854d96a50ff37c24d198f533c348f657ec4726ffb648522893cc36df +d25665df44ff0d6465ab46691fd9445cd3290cf2455618cc3a52d8056f179be5 +649a1b17bf25108f9b5b5a3eeeb22d970d968e25e20c5d4e503ece7bebbbe696 +465191dac3046b7dcd8c3824836bc6ace208dd60982451731e82aa0e85b2c6b0 +af9b9b14848146b09c64abbd9625f7a3bd7b5ee015c8f5edb3755b6356c37301 +18bd9f49bf060984259ae5d7fc6f3ba6f3ca2223e0782444bcbf911885a0dc77 +65d705146b91ebbe0cab032ca8336ce9133136ebe740d0a126f12f43b76fbd35 +4c09f5a66e3bd1c295a6034187e0ba7f916670b840f146d4681d43e9ce18387d +70f44aee7ae7bfebcf588759213263a8a7c4c3fb7c31e890f285f502c5e88963 +964556caeac1f31b8975a9537e40c010380042359200b4a951a9effbaf6fcb28 +1fedcd940e10ceee8f3428f1e00eb8b1626ddc9c6554a8a7ef2e87319f3c532e +afba30b322cc358c2ede14a5aff1ff1f835963929a3f396361b714f352133a81 +406515004549a91a192127406bb9f7a61536f16b6e2b51dfddcf0f31ea338259 +a0ba5126d1459dab06c8ea7d88816b2a750b4e4c6c45109cc8f0944f4a42371f +383a585be96f72ad5884e8337582329971407ac1e6fa94d7faf980550004be9d +a86af226e74b6b87ce02bc9949e3edddcfe0eaaedf502e649122829a4b5a0a96 +baf1aeecb528b092ba289cbe641e2775bd74434cd3915082c4a36a898d2a0347 +6a639cb3665b8621c9ca4b633e7b5e7fb699c39d2fa9583aaa000b1b3520661f +398e43ff8ac75221bb92a5a19ba43def0c89b9ac73f936babf0c930cf3f22eae +373a4c86e6356973490e17ce7163ae33583588d7b7d7e9d3ce84d68ef9c0b524 +8f14be69001dbf85b887e902b37813eaed85fd1b8610e2e964455bd3525f1e99 +c8bec17ae486775dcc124b4a3f2acbf05d6a73146ff4bd922a07022d09cbde83 +5c4dc2588db5720f6d73829b6fe92e592679efd487ec842be2a87a503d88d397 +36bef70dab7684f29558b85bc5ec75db196967063d4ea3942d18b6bb4842202e +2ec18bff6a32a85a82f16342f1c8c2ad3e0cb12d4e61c7ac250f481725256c8c +c7b29e35caabe5a130fe0c917b568453805ce48c7822f8323b7b6bde5450065e +a4a1a6c2c11adc940d1dd15fbadab619b677fa1710eb86cf4d7d7b0c543bd182 +5cf7a30310c18c874c8040e10addd57de7c326253c2a9f550bce08565de02526 +e0f014a504529dec9086aa674b94c1e0786982849905fda956a2f85fe487163c +c68a363c2d44a3300c0364d66824f31dd0f11ef7fa7553cc42fd8961baeecaa0 +edbd70d3f34363147328b558f8247baad15c994d33fa696af72ac2a0c8347179 +b041645dc46262a64d3983c46a3b460295b6afd8bb2de931bdb27a2e94f23553 +f1f87c2d47b88755575e09f50499d1cd6387c16c11399a6b4bac761e80b97370 +0d4d8e3d599119446c9de410e33aa6d5925e8c4947533bb2709b9b1d4d0b96e7 +4012b9cb27a8e1391ef72870058850227748afbbc55a03a79390b98aafc2869b +fbc9ad0d171ab701befe311c559b3865fc0c1055b3e8e881a69fa630efc7a431 +75af2b55c9dee9bff2beae961861e45773e9e37735859983b9603008de8d569f +a9a19016c9d9f101f64c345a4ed17113dc187584c1ac1cb7577927847793c8f7 +0c544d329a753aaf47aaeb5e6550777080224c57fa44a44ce4b16f7ab6a3fe74 +368f6c2d0f8df4f3ce6b762e43645ab0996894b358861c4927c45fc1cfffb7a7 +52cf9ba3966f53f00a3b26a394bf92094d579552f79ef2531e375876e52a88dd +8222317318357ffe48d43a58229a93e7d6113dd47043efb48c85714ac19da484 +08000c866b7675813786229a16e5789f73c1c16b876a790913dd2cfcf92f9c5c +31a33eaad8f368d6531c06ce189e07e9f1cd61aaaa3f8291a61311481e5ebf9b +a45feebff7bd242fe2f018aafb62a4188435c46fe68a7ab09aa8c16b2fca9892 +0b9a2d7148603cb336fbd6b08eaaddb6eeeaf325d25c50f726379d9de1618c36 +d2a1034a29fa981b94220d711e6ba5dcb5ce7ea16d7ea03cbeefba5dc585e5f8 +bc032ff17febb2879e61c079f9b90d0a0b6eb537480000352a63ed828370467a +c526f861c5cfc6e53e9a83077509573239c1d5a349fd53638689132f831ba29d +9963a7497c2bbe933fb653110aabad3629e31a7cb3d6d3875b45b7bb8f62d740 +5a6ecde413d365ed05e7de1d2c95d46783a8be9d1b61f24191a1119078283800 +deb44a0cd447d47581972001497fd5d9972541b6ba2ca719a8177feef3a19097 +20f082c42a5de8a071e16e1bc181e34ad5018131127fbbcda2a9ce8b9f5eb83c +c59c96bf0562e6916be9d99779d8d5294a04aa19d8dc839caa42f48f770f60e9 +18c593242436bd1dceebcd354f77e462fc249037b0fff2ee093a799010800ea4 +8da10c23b02dc20f3c3682b32bce8d7073c13f20ac232a6a42a4a0b5e995b197 +1fdf05dbe37aacc0ef62364c466817274496cbc8686650d480054a10c8105ee4 +47e2347c5cca657dc944fecdec1616cfb16ba4442d08d7f6b8cc69b38fa05211 +3213e8ba2990bbe7e3836c167d2c8fb126fb7cfbbbb28d33058c595cc6a16d6f +e84babe05ccb4bce0b62193e337e8da5320f29f752f03a92cd843a99bc7a1e8e +b449b0c95dca19b9ed1861812c7ed1f2ac7294d227358a5da798d7dd314a601a +3bbed33797c6d571e9cef4a29fc421d2b7db70a7e92ebf91ee50f0ecf2ff63c7 +38a713d1b6d1c542d5c6d95fa4e9fd16f4d219ca943317baab091d2021ebff72 +0a5a81cdcbf5f3bfa3a633d16f4560cd3cf9bc1df7ea6504a3e3b9377e9869e3 +e149ab6fea0f80287c4fb26cc5ca6927f5219a8379c58450b7525bf017d72f4c +b5611169c7d001fb816109b334060b0f2913bdeaea69ff36286c8fee4bf2cc7c +83505fc4b7dcb29ac97b3682c48525e038e5d1274a069858e5505dc932c5634e +fd115e02d0343b75907fe80d7d8d421ce40ca292140e0c0f3d79161c618981cb +ccc0f9c4545942dfa182bdd45dbc71b8ea1d79f1ef51fa88d64247d4d2d3fb02 +f4d908ffd1a763d1383f7f54606269c4a0a6c8c82a01f8a40951dd141e4833d9 +7142aaa9b0a7e1c28dc578faaf9926cefdafaf084d50573395633ee6097b2c8a +e70a16f3191405adb7cda9ab344d0872482f6db9969cda14b7e70821b16b0393 +a0431332b925e11f44882286eead545c0854cd41be75391e2a537f12c1826bee +fb1e13a9e40995e2c20c3e330c993fc40df42e4c8d9f09dbe4f5f4476bc6addd +0377ff3cd6a5f1fd26b5c23744555720cd7902f34407fc6f57fb83cb095a8703 +c9d70c96c50fb522affda15ac3ed668a70be3e1038125f57edb83c4a8e520747 +370b6131f6446eed8f68177b4d3a06333544969d04bc2ef75b891b943a89e011 +e078d01940caa9e1d4010670dfb80b1847bcf9578a6b6bfad675b65b31f8b075 +08ae31e6d3a26680b9cf228bf61514496fc2c7a2cf0a635be96383466226faf7 +a8c3570b3c55a009aa091fa99f71f8a4e82833428ae5cf0c5a585da9dac86a3e +faf1c6c31fc7fbe4395a58b193311f67bbe598f88ad884a5381f82498aa3a2f9 +448f50a604d9db2c1f88b47aa783a82d6d0d45b2334b4ff48c8dc810751fe68d +b2f04324562caa35c19a80ff56911399f5abeb971b982745efbd7b10edce63b5 +e490925781673def91f3329107936028e85f1f633791181217e239a2d4dfca97 +171812d2614131d19115eaac6550184f973d439d723f2c6b80a5678efd9fe5fb +2526505ae8968700b352599b1bd964ef8391b3380e90e8febad06e4545c01017 +14bb2784abd7bd7ed8fff02a028767a781a57e1ff6543e996da730610fd00026 +3ea263f3c46d9844f4ea67c39701fc39e54b9f7316af609b22171c743e7e2fd2 +aac70ffaf84692b1d25735e95e45699a5e15a86a7ce7bfb7c51468c09d239a51 +45802559023de368135b52f4f299a4a3272c3969de888202bc1e99d1990d2aa3 +96a0e2230c6d2494e02ad04e8697e61e0b9420cc90bc0fb687aa27f85929fbcc +f6484d047c785284c777bc07f1c7f558fdc170fb0495d1fc65a50a33a06a061d +718391e14deb33fd37e7d27e47b8f3c9dde4bfe43866450e86105746d10cdfb1 +1e1714a0b78158517aad1eaa5847b37208dff3bf319d87184b82a18ed20d07b0 +ec25a1d278bc3840614953c1219add7c21998a6be45126eb61d87bfd5d1aef28 +7ff4b2724025db64ab552c28f0cddd89a04beb667988cfd5adc8f7b1ee091086 +c2b31a30a9bf56b671c81fe10db4214fe93f3d80bc6b0e90410e123b17fa0d41 +e5cbd5355c41bb9579e1ec93177d3f6ae798df9f70f9dcc6b541d5f4b3c6bd69 +83cc692c4448f91a730bae1f278d700c45a5ac32c6d5bda96aea73c95ba417a5 +5ad76fbb2c2a47c9896efd54cb4f178fda187dffaf47c89d5541c6ec74bb505c +38c34cfe95faafb26eb9d1bcfcda8fc0617da52939ed4dc5b7616691a7188585 +8de6b6cb6f6f742b4a61836d6ccf60775aa0c5ef3bbf7b007f4e2053b4cab7f2 +23c96418426367fc5a833fd2b1a388f3352c8b390ce596b9caa79b9d77ca2020 +41550303c76625b527b29f0446e1e18b93abd527d537d927b9eb1f403c306b9c +c3003ce36eca033b7655eac10b1c2ac5fe0774574d3bb4718039e498dfb06e92 +2e3ca571282388bade3e55cbd711c20a93fe24bfb1ebe38f0cf7e1627cf8fd3c +d0be08d8cb4ad52bdc53587bbdb53362d31e8b0cec96c7f0bada54a0bee96c1c +40b1d8506913e7edc80983683481e8a3e7b049fd9549f422945ccd41b63953c0 +6702215dd8a1e466ff3e2e9b97f7a96df89d3078d5ad49af9480fc84bafd02d0 +6b61dd88963e9ac75b42dc9b255a1c20594ce1265ad4df4c485b3f73cc59a4ca +767b5f026acb27a0c71bb2e92e1761744882dc892d4e53297921a27510f23873 +91bbc37710eb2589dd6ca1784043f4e5dc2f08a3e1b9dff5747f69b3a6bc2e14 +2257f3de54ef93c57001539dd6779fb97029e17b9ed9672ccdd7b0286a3339f4 +30b78bd1de5730f6c46faa5b7b4b6213c3bc8671839ba50da8ad0e47890ec3ba +78d1bc128cfdbfd11d59d3292b277e65ff1bfb343f84becf9130107326e4043e +514a01e05be59423c44cd4366268650173cf594316bd18f0081f10f72a665f6e +0020b773a90493b5ddaca8adbfb488d5854d1591170347cb16eb4a426dbb7cac +8576f074017d3d34d98c5d82e84d52071c910929e417412dc64d0f5ce06535fc +94c62b61337c5b27f4ca50b4f516775ed8ccada4c3203917af8014d0e01f9f5c +568fa7668c26ea9e085fbc736b2e7c607db5c0e983107283fcd701d025d4eb2e +1efef45b9d2cf08827d53568598104724fd6f025c50c97d182218e939b92fbc9 +42fe6460ab63ce07f43189dd38745a93a9179dba460173bb3715b145b74680a9 +aaf104ab04b6b8c8f5803bc03458fbc3ac036bf4f48894248048f6a81dbd403f +12c31ea4736d0dbca37d0f45a264af161accaa64e645d20fd10856b063f83b8d +079863f4984840b937efacb021d47bc94b1cfb9dc183247d25397ce41fb861e0 +0c95fc77407d98932d08c42f2393c8b37ef6357fefd4d196c4bd6fbc414e18c4 +aaaf1e54feb3d81f6d5644eb5759ef5440207410464efabf54645132e798dc10 +b068258a3be66fdebf1c1d428d3381aea736336fec6e86b56f5a6143f74e8bdb +62e0f9dc7b80323b3eabbec05d1bbd6676de2e2543cd37d6055e88074c4bebbe +53ce30241b46f82f635a1833f41888af3771414bb943353ff865da76e25be7ec +2bcea61a15f180552f98af07333fc03749598ae8f3d37916c33deb106a2c15f2 +1989350f1dc372c831fdd25d104e82f05b7a102256d9f8008e23942e3f9aabf8 +9d723bb624d0f60cf559cef6379e552911ba014f422801b50b15ab9fdf4b3311 +a2d79df0a820e262ee4140bef47ed964b1dc7fd55b81e00368fffbc63814e3c1 +46cf77833cce07d69c7f1dc7189171484ce5051817ae7bc7b980eae9a2b05022 +60b19176564e2d1ceb79cee1666ee85f29331554d11037c8a79a7d53948a300e +b7344a824338cfe73480989a0318ff63a0428c8134a2c754e1f5394ec300bc62 +989d2c9fd52e76124ebbaa3576a735ea45a87d8442782a617e765ec3d3b48076 +a97a3127effd10e46accd9947728a362fb83f8718b98331f9b84df8c270f7efd +f2758c8660c1c0f7c570d86fe15bdec1d91cf8c1a417c9386e09c548bb401ec4 +db99ef40ca62cfd7a0e09fe111c4c72674254b5ae6e778dea51ac7e298ed7072 +7d0b85c0fe154538a90c7ecb7e1bebcae32f2db9016a00a6e3bf5a103efdb3fe +8b0212049f9d79f95ed645ad3d53658f1e0ad84237d3fef48579cd86a76bae26 +eedc5dfdc3ed94c434903a6aa1706dc18b91e782b0f31dbd64358d6ae7edb7e8 +39dc973ca173c564c92ff13e56dc206415198dea13dcf9cb8a67af542efac923 +369061a76351da95da7e2e95fe0e245ad0671dbda13efca30a654c37320b4d2e +7cc9699c634d129622df340923b7eca09e7b5961bb33ecb62c85591365a70b93 +ceaed2c7cc0339799783c1047df648349d9c800bae1443589f423ea385798b3c +7bcc72cebcfd2bf1731a488365e50280ed9603b4c51931f91920df1a96bf62c4 +8282e4046baeced383604f06e310d9cea008ad5765d374f854fb5fc4ba116d73 +2439b37d8e391db3f4cfb4980fd6747d3e86aa425a5b4ede03674f404026a74b +61940470546d80f7aefa98482cac4d8880aaa329129aae1831c26f91989901f6 +72b414ea6dc7d8468d112521f57ca320dc8cd56c9023c496cfef9588778d66b3 +79c1ae217e9b4706be2c7bc85ce7e98c7c58189f994450ac8ed2d2b153aec4ec +ef5e8c68866d27e2e77b7760c8911753cbce4994eb7ce82e6b73e3e3567e2ca4 +4fe75a109a4276a6e7abb0dbd00b48318bbbdca6a7d7dea749995868aba5a1fe +50ba244cd047fab144d67378e0b21a5f39231e7cc4ab9cf010432ac20ee61599 +34fa8142a2166266d0d192a502790ae0af11ecf3c94c17ecd26182d6a2a45bf7 +85e3abc677487bc20d52eaa378ac3088706d9b19d7a52efb495e34e605c00597 +faa503dabff584127c2a479075f89497cd7a2d54d02329b81d01c900d18f80ba +46d4f7e8a464cbe141ad02a64951a2927c8fe8f155cd6fa4ff3a44412a59db72 +b74499d0b52486f55672f075ca1944073cff76df0ea2bf64f534bd3ea581e956 +e102bca1029ea246b1f08731ec931f1c0737cb931279bd51e31f83094d47ac55 +d969f50def8c9a2bdb3e340710c2c1337986beb1e032fb9bebf692a5a42dec22 +24befc772b8641e0de28e4fd6271decdb95156908b4a53e92f732888ccca9650 +a5496641ba0673f9a10c2e8c544e76d33e84d1d2cdcaa23fd55bcc7e2969ec01 +c009f0f7f834796bccd863b7f1528c13ff1c499e6dd8bb4ba671dec515fc9ec0 +81bdfd97a96311893af9e102a1ae63a96bc22a2e8a2acdcf082bcba6482285e0 +bb744c99a227a18179e661f63be26e242b3e0b0fd2ffa982a1c4e7f051a66204 +c13a59e66833ce590439c9f26356c74765bc0cf209c1d89e2893f017bae39ff7 +f01d79ed9a99a43a3f6259abc9822bb01ba93eaf77d03cbdc5075860ed4bcea4 +378285716de824c71cbf033015522ab3e741aec821747bd635bada9dc243e58c +f4d8010383774f9f3a8d75bd5b9b8adb3ba2ae89772743fbb4713c46c30168bd +aecbeff476e0c2e6ba174f9301df9b295bb213d3a733e4b5d82d24fe579dd73d +87d647aa7cc0bb6ad46e4ff01d1bd6b8a8eaa59855e73a6e6a0a9a800842f7fd +86748489e1b52a597f23220e6b1da30a92df4eeeed744f56b5ed811292d9c831 +1863ccccd7672ccf160851630b01f805c77893ddd70307d3cadf4e259d25dc37 +5c0f89cb28b082f9ed1b8d61e52f01b7f66e401d318db7a93943c78e47886af2 +56611c91c11e628f9aa71f7553370a97d2766baad7f9e74a1457fba25b6a2ed0 +750694da50f77e4b3dfbf38af5983499046732bce1cb3f435626de6a7b8e46b5 +04a80d1ef0ebd4ed0780b0ebfd8c792cea07d2f1b7e2a63a104088b87da1e620 +29c2741c5de63cfd9d12b4c5212ed7022b5eccb7df7faf85e1d5c4b82ec55795 +de8fa1e4654b594b83069e0692fc4954e6d0d3fe94cb574fac65ce4ed497386b +16304392ea2defd78c6a96bb53bbac50ef7ac097ac45a902b39cc3be09d98f61 +2897ad7d1325af2ae4cc80716ba062243ac48dd0d90d86de3c88b16b4281d009 +08be72525f69b7b286fe28253c4be746976cec1de175b3aae41f3e56af915a04 +7dd0cdc064623e453db8123d652ceee41b60ee7db30d96ed641ccbdd70570c54 +82a169f1b9eac1e410b693301c0dd765afce2af327825cac271aeb79a9ff4691 +830517e26d4682dc30b60ab2555b39471ccb6f38ae631e7e1ef89fcd1847a242 +06592ff50bfc47c434142997a4b682da77300bd19d65af7d2b83dbda5b95903f +220d1a2d90a19819607c481fecb5921de9099a60150a1ceb1a7723ce8b182897 +14c1c181343ec220b929336bb2f35056706dc481164f581bfb8b9492b4a93a76 +f4227de34613379b40d8682d58f56419b7b4fcebb75e58d4d17bc1bdcc114b9e +9aa0ce37136b2d92312a40643559a8c8a2de53af09cf1bf9f978aea6ca80547e +dc97a08a8677bdb27a599dc6027bcb2060274f5034af37c15d737307bed56099 +8df21be030b0e57c4d03e2cb2e3de42daa26ba760ea7279815e6175a6e98e496 +618cb4bcc6c071dc2cd94774b5dbc0f912a7aa808e8f4e92585d0a1bebf22596 +82257ec17a792283dfaafe2e93bd4bdd75c1bc2190454b2da333a335cdd0dcec +6561b83cf0ccc9ac09e3b0b1e2e108f14b500358f8fba4a4c3fc05deeffdd4f8 +bf2d0cadd592f37933aeefb253c717ede98b3c870464382f1d97043a039e6202 +4ceb9e25a50834e1134b4c553442b5d4e763b2f833d494ff6f4f5fedd022066a +c62c41d32bac09cc0faa9f00cea1ad21ffd7b62580d6e4973ef82a0a88a94ba3 +481cfc5541b1ac68e633e53823abe38df4bc11da9e41b6bfa4671082cd0fa20d +d5aea26151a947f7345c69bdad50c344ebd7d52c13f0abb42669724bd7dcace8 +01a3727f02b2a9c7452c890425f74ec7a473b2f6cddb89fc02063349096616f0 +975b3f1360ffa5162b577d556c21c1465b997795313db5ad01a059d074d5186e +5a039181aeb9281717d9fc71f2ae7c423303317f66d2c145a432d40ea79b0cb5 +eb426a4dbc2548439630bd49c09c3ac56aa8c857658bbe3c345cdbe60786dc1b +aaeea1e8134c053bff0239c3b22d9f9811f0f986d34b10ebad0603b099e61a27 +f5da9d88b88c435ed87c4906de206849f5b4427ee0439ce2c99b3e52eb634ab5 +287abb15154d08932c6c360d85030a92bf8dcecad523c123c7d992f742823af4 +95a83c4fb38407e87946bedfc719cc3998d3487589d773ac6da3078b06cd5ecf +77ffb84a96cd2cca241b84a0d35b0b340dff221b9190c1aa2d6ada767a0cfe14 +7e3428cad1c93da6f3a01f821c6a410cf69fd03a2e46f17a31df33af3fe25492 +c6ee8dfe79ffb29561f92f50c69b6fb2ee2841ff6e3723e18f86fa65ceb3bc0d +61e2f19e9962320aa05e82ba9ec7fa6dda9edb2eadee478c2da6951a226ebef7 +b2fdfdea854e541a449db75700f057179623c32027ca181b1c8dd6d83ebb8bda +521d637b32d7bb0900135f61d72bfc97aad5cd3a2aff218547cb96386023d3fb +9a0b86d9ab93acdae4f4eb855735357b77a24ec5ed31811feaaa2f93d6e4ce51 +2c9fe4830743bd3082f52ba17e2a4cceb5bfd2c31099d852bc1d1d1d4ce92c95 +b1868a8fd559e2950a55a8dd30adb1f0aa7b40c900642e56c958764b81334ad2 +5386c2b94732865805b994b5e9949b7b59fa4e9e27cde175106e944d0466fdb0 +85a73fc4d329efc235f368515bf6a5e9460c9e997ccde7bb4691aa903911e9a4 +14fc8fea294185f8d8d80a2a1359f9707121661201a72e571810f9cdcf792c05 +ab01ae9c0916be2070c264b0baf34f63d78df7cefd0abefca77639bf25c32fbc +143a000e2cb1fba326deca8b32671af989df004e1f355b4faf7323da6cdedd69 +1c73f44cd381644c8d6987161b3a5ed5a36cb698f94970a472a32da1ebc8074d +e29a2d9967f7f3e656db600eb06daa0778478ab53b653d19cbc096e39945331e +0d325d2667226e85f7d5e3442e70ab51c294b8eb95edb631cccf964fb8fdb8f2 +83d6dc2150b8c1c31f7a6b2990cff2dad2cce88d8982c4f01da6f41b271f4d43 +4ecea79d6a7c3408d986dad00d2173d387277e35095513a67dff237c7d92b745 +f0ecf708b72515cb9b695e73b321247a08834d084600b3eb7707b9f42cff1205 +814c1d788e3ba40d49b97f15df97173f17918d3e4da33485081791990389e2ee +7350ec14e7d2311d7eaa03718035babf963053ec12e427a0e503f8d0aaef29af +ab22a7ba4410cd40626c21d29eee1b4c5b632d68859d314670891f87f097e293 +80a0a248dd3c0d940f119bab3a42a4d5d62990a03d2dee622e14de8ed1939658 +4db30c49e896782cf4e451269bfcc00f5525b1ad733c068798f41579ca6a6ccd +3aebe7de7bbc0739b45cd693227933d8f36ffdebb558894780fdd8c2f58dec0a +d78ed417b05e089bf1c3c9fc389787a1f510b7c8f103b2ff8fcfa06aaa41cb22 +68939a1649976475b1b3c90d2a69d30ef7d1b800c8fe250fb605f04fba577776 +0cdff81066d7a7703574b0407eb78953dc8a21ea0864324e65c75060fc889f0a +a8d26a6342364972e530cb822ab91393e298075263a6f2f31c2cced33c217aa4 +1b15e0acab0f88706b40b1bc490d9304f588c2df3331b47af241d0136216a1fd +8869ee2ca67aa0b9f3e0920f815ed5f91bfb5b3701402ccdf990d0111254cd40 +00edc94f1960d511583f82f28f71c30eb44e1366f83f98b8ce38bc0a620b07b4 +9a0776d358f6e3d3ef6f145dff0158fd839583401753fff11cc7752ca1813ce2 +8d9266aa71bc27a6cdb2c3ea9bf486e4ce62a112c65f44649d7bd68d8b1d182b +1b7d25cbee30bb6c56bf8fe290fb44946c5c7c5561d6c24e97137e915449ca81 +ade634ff781cb95ac4c43ee88c6c8bb0a5fdff6d0bbbfcd5801885b1bb4f4276 +1b6f2c117bb90058466bebc36ba78a4d229352347715965ade47fdc175bdacf3 +1de2d37ea1106e0ef279da2d566e42f98fe6e5fde8e3a292da9b327541b7cfd5 +d60538874042da03b15ce640ee2d940ddfff12ef13580efd2efcac2e779b9eac +3964ba7e6ca66e05cf3673c49a18e35df6c69f9c4ce16ead461bc5b09e9fc35d +0d66dd4fb6d33066c8b15d6704a9890435742271ea33fb6ac8e5261c2d3db0d8 +84d4ed885d5d4635a4e4898be0eeffebfc0ba8a90bd92bee924078802ff82ff9 +afee85f3a4676be2300906b95000516056165942ccda64e891325dacd9b73750 +5039d2520897cc43d9d404c299a9ee3884704408417d64512d9a6a2afdabacf5 +6ba334c51a72fc247dc3a079e3133517055b607adc13703fee0dca0f3f8ddd59 +8656337980bf58f3ae667b81458d7d539bbea00ee1f0fbe756a22cf51817e7b0 +8a7e28d2acd83b912365aa69ec031c135a5160fcc55a5f9ef4d023c92c2f4598 +8899b1abbc1c8e957c2a416b1be6eb1bedc273b3cc91b1a220bc40b96463def9 +58bbe5b6e685b472e81a125263816fe2e4165960b7851ea8f65cf61aaaf130c1 +04ab6c86ef0493d806386e889630fbf6ad9614041d92d35b5f788b63ee458ee2 +c6e3c06c60cd1f884ad3b1455043757e32e0a35d910c2fa33ac3abefeab3616c +3023179fd264c8d3155dc6c73901a109abc353d664fc19a09ba716398118c94b +5cbdc6c23364cbfeec6410ad2712edaa9932769f4c369877a832359d078559d1 +be39204ad8b6324806ae945e18fe20f6a757a0470a2667bb7284a9fbf1b343e7 +26df689bf6d69574c6e63572e9532fb1e38bd046936d340c55eb8e14fe2e80b3 +a06d4b911c6b3e8333c36b676ae8986469295cde55929a1d1d767476cd47557e +d438bec525de2d4b3f55ae52a6ff18d00d5a1e1abca167a7d8b6dd2c6bf23fb4 +ca20701c9869cb5e930156da33d3b2fcb70404c0df725d664deb78814e175035 +02639a8935dfe80b8809086195a7cc4c354bfcddf7798edab74522bf447f2d47 +52532fe58da8b5aa1c4484b50ce37678f001a6aa77edbc7f0e2ab2b65e9a4635 +92dddbf932a5141e9ca9f108abd76de7c6f73269fd00eb8211f3ce32b92b788c +85933381308f912476ab352462ce1e1d98fb6eea4f690e0e036f3deca9cf1435 +1e24a41320b229df0600c764b7e09984e96501c18eeb9d8b9b6636bf3b6e7068 +581bcdd1def63429afb5aed8edd44646a6dfc56b4f82f49d5819cdef9a6f08c0 +6c559f07d3f09c2b5956acc01544800a24d0c22b00cbb1c06b119521b967cb62 +2981313c666afab4c96817c230807850620fe00bf98be25defb29670cbc61440 +90be418d8263c478d879bb5ef72eede7207cc7b2dea21957e9c476608abcbdee +d50e7d58160952ebd4e840d604d28d68292c556dd79340bae75c318a9f0b2f64 +f3616c680235bd7d4470b7e440bc8b37f351780aac3d311ba51d56cb5267fa2c +0c45354d73fd084635552bf78898e2be90f5d7daaf9353f58920a0fe0de56eed +fdea94349d207f4a5fff48c14c6bfe03eb9b051d28bc950574fde10e2e5e7cc7 +b4d9282e005a2174c09c62adda2e15f87360d8c02030de0b16af093feed4c409 +b908426705ddae110aa3ed8b1093702d8a50c08c2358b932e9b98b0b6e7cbd13 +7b6b2aa51ca68df71980ef797fd483f8dea3e44357451e2b834dd0df380ad9eb +e1a974f1dafde3620fffed6385b1132df572cb35c705614556bd07129c02909c +2bcc8c5aa450e94eef375efd8f77c0a8750c45f45379af43a12f288ede4a0935 +8c67eccb2733446f2a7cd0adbc989b21d5afb11fccb57bb350a39c13b3970e90 +17ec4f1e0c2ab7fe6310a4345d1934fca54b386305f015ec87cc15910c323450 +e1cb60b5a8e0dab68412dafc511811d7fb2ca08d9338a85bfc050e171dda308d +4e58c9695cc8cd6ae5b14e1e5c47fc30e2f38d11c6f4964fd16934a8ffea5726 +8e489a334d073fac76196db7b3c8c6d4eb1b21171ba9d711433dfeef3b7bc0a9 +a50751154d77ef7f6c6be0e35fd0d983a5c03bbb35b7afdf952a9a883500a80b +da5f65cd7aaa71e5abef7260a089bb730a5dbdde0a86c1e1a8acaf76f998eb17 +55a0edfe1207c5692c992741e653480788accb3d8fea8ffafb73650ac8a8c349 +664e92a2a8de84125c75d6155bb6165aee20a0a8ac09ede3a1fb800f6fdf0b4b +4214fa222a5cc6c41f7f7763891f5d578b6d989ee6fa56d8e0f77fb09acf241a +88f5a24d4c08f569c4a305162247216455c4bf6e529128081b10f5cb09f748b8 +e264ed4adc3a950c5ffac368799c4c031ca888d31ce9386986222dc3688f1c22 +82dd221f7463ec3cfdde846512774cc9ee1b1a6a2091355b09a33d4ca8538237 +8e5babc5eb20b1883bbb71a6987aa178aa4dc2378a344b5c6c3e214314c9ff3b +dad4563fbe133fd2faadc70b5e36ec6de0f2d757d49b51c623d42f148f31d730 +a0cf5953840e388b8c6f750e3dae0677a00f78cd81ec1a76dcf0833dab08f3f0 +17b60777617649f85149c20fd9b13dae3efe3e8f1c7b801c5ec0a4e2ece7cc00 +9453c80674657d535bf0dbd60e31a2e9361671ebbd8591034fc5d77951ca9abd +342d1b3ef381ccd243f083b3ca5cd79053a4b1efe8a668b73e9295cb78a9ca0b +6e90f22fdf826ed2561f5b4bd0e6d1acb2fccddbde5db08e82d9113eacb6260c +fbe7af67407eb89e4f29b5669f0172c6e4b1cfb81fd7d28ff5167111b16ee4a3 +49d5ab9408be98a51aa4d17412f0d23f7678238bee914506ae72b470fb581a89 +8969eb6bb0137f9b38873cb5ecb0501e49dd3704719743a5ba4ec9bf5c7d3973 +557888428d30d2fd228127ed32b484096edb0c8adfcf6ffe8cd030f3d5410e62 +2fe54d615272a7bf503ac89d0ef3ace83754978673f9db3e005807e470ea5b55 +3649f61148d42e9e6fd19e4145980c7ecff2bbd8ef84b435e6562a920e88698f +7d1105af11926cd6180d6179eeb68823d99392dc95a948e48f3533ff1c4b2026 +b5ea505db22a265d56441ab455024f4263c9ad36c3e25ce067a1937303f9f216 +186ac443d0909a4ae76915584bbef1f884c321fb823b724c58757e619ffaf201 +17e5d826afb62d2fb7a1e115429191c80aedecf84cc71ac9e7eceed3aaa33838 +861d5699440962f38db466528bcd883ad8385e5b8b9ae1fc891152ffede5c2b1 +39b1445e0da532a4c9d19662c7b9af3a158ed868f5b11d284d19c850ad79bfdc +fc4b44ba68537b205420140e803a16eb78111fdbf1d89cd1efd2663e3e306245 +84a5e70d413f73cc1f9392610d0c4a9a0a3e4e32906a058d8bba062c94fcf4e1 +e402024efb1b7ff8379500d16fdd85b556002de62f78c827de10fc2550bf000d +fe81b29747882b8cab4cd04acbd92f009ae3f79956996cdd6cf5006e200caf32 +e014fa4b4e67ec87f6b76741006fa43e17f11e0aba57592f481bfb8655bc3499 +2e8bc3d57ad02b4744e1cdbfa0a76c543bf214cb6c637eaf4a958b337665baf1 +b286b40fafd6d833d45b4feddf163bea2716d90ddb483f8978b5d92d8f78d13e +9c24b1044543b289efe180f0dc7fffb90cb99f928458d36dfcaa18145b130d7b +6b57be3f81244f6064b61f630af5e876c8847ac278dc25aa942b9b90b25916a2 +ce48a2f2546056f7d3c9e0f637b52eac424c3c7b838b279e9cd310a520be41ab +8c7bde64af685340f44d0d5e4bf793da6d7fa368e9ccec9c933251e56bbecd77 +b0a3a4566dc074e2bd55ec1adead11e4ec91937c8924b7fa593b24ef32db66fe +8b27d795c12db95404b2c66945a9c3124cacb24311fca2567b10ceec21e22667 +8925a85067442df6e02e21e10d6ac641da354c318ab4f244c1c2dee6af49732d +3f390fe6ba7c84e415b35e390ee2037026c01e2fa69d1348871b867a37ac2bcb +df84ebed1024ee8fed087491c8978051c47fc1ab12a4deacfa17797ded28d929 +e212172d3d8efc3b04f5d074ca57271e604ef5d0b9893a6dadf516fd75cb84f1 +237ec510567264b2f20ac77c21e0a623ca2e05f50bdc856d7352bb03dfde6a0d +b16e1afe6d3b6cee4e695d985b7fba36d64365c231ffcbb8be40948810e8147d +591bcf096bbf5d2b545c9945612f60869abcafb92fde6616b5f863e55568c7de +c6b413edc7473bb35c6907607ab5fbc91ad25f4c38707f57d22902f2519f9a76 +338a0c3630d101e49f14089aefb0e8d6c735493560900542402938b467e8437a +1089d9460027ca5851a788767167589784e55718d98528883657b4fa709f5451 +00d0cb2ea4213a44a337afd552b19c10e3f6dbd866444735570db480f037ef4d +18edcefd8f6b14cdba58e3fbf75b469364d0e69c92b8ba3895207d8217c72fb2 +6238e3c231451712babcf6e08c08c637d319867554b4426341e315217fb93c65 +bac24552f95e6890b9dbe1bf7530d720e48e1df460eed718b0fadd1960eec4f2 +f72742a1b8fa8846c10f1201b22c0d79b8c77350226476d4ced87e7b67649c9e +661066879ab9dea79eed6bb0fe1300a73fb3578c0628255273ae4cd379231e9c +aef0f8b72bf778bf14731c68ee50c2a2f31e848447190c3e42b5889f1623e196 +bffc1d8dd1323067e075fe70b4c762ce5fd8aff0e4013f47c2e2ddfd06ad78f1 +63da5f4065a272d91f296e2665b219d6e88c094523116ac9440ec2f9b25ade7c +5852659ddb699fd030656733c6d232a49e75d776a235c1a56ee2f8901707a40f +5b36ac3c98fe021bd1f28dfa10327cdefa5f06b471e8967eac5172dbeff6ef9e +bfe7d129e8f99830e4a12c100d6c5bef79114757ce26d8f0d67b95d9865c7a5d +c91c7d542a2a908b2227ef0b78c7a2bd562a8d73f9c20728917082a2c8dcb321 +de1c8f89588908cfe1a5833bf444f8944088e8742635774796d8d4a0040bcd9c +64ddab4db438402813b59edfa79dfe26afdc6a87093baeabae0c10305f70cea6 +5803702798df945f6f45ed221fc9c2537151d086e2df720b8c689c4df331edc3 +2abf9d322cad08e3c2c06921f3a2c9f7a13a4f51b184cb77a4e7aef35613740b +2bff9401d1488fc671828fef4ee8ac4fdd247d6b778e5df06179b5bbb462f2a2 +e2976cb8794041897a65bc5a9e1c561dcc34c98db07947a416c302b8f20a8614 +572639459e1ea1e510a8f8432b78bc5d1e294d8f57dfc956ef227584d236d0f0 +70a2aea00d94e48110decd629db3727e5015bb0c99a794106d1145fd9fa8f407 +bf279f7b1762421b1f3a1437018efc9704121176e2185065901df20159eece5b +808b749e7847b6ae9ea268f561b90f8f47abdb6528a21a714b749377a3350761 +08e9506decc618e42dfa4ee0abe77d1f771cdde50143913f0407023e19fa0cc7 +464e53218da799ffe7a232241f3debfc6f68bcdc45a73e264b675e3af587042e +1e35b346de4c76875c656aafe366c9097edd12df958335cedf7e25a72755a888 +78fb21bde7a863797c2f0adf73d3dcd928971e1543c594cb1a3a5c364840f0b5 +780b764655fcf831285671b076f7eee0f1c6245e47917124a832ac008ef60825 +0c5220af5e833b6aae1038e9f7dc3c793c7c1aceca66b3c6b0377a4acf9e5aa9 +8fd729ae8ee375e831f507cee9975b130402b78d84a9d685625ad309d078bc2b +645c48ec8503b02569bccf978689a6ad2e2e06c1978f10bdb20d2f828237df91 +cdce385991a328c94e0b556f4cb8987de3a2698c78eb2f2fef4e047292fe9832 +dfc6252ef732568e87aca6b40f113e45852b213bf6e3d1e822b61a34344b65b9 +c68246f682588eaa0dce7c1d1e6a3d3491c34f7df5b0a55da9a33f4d59b5ee49 +beae9267a4542c4bcf7d650e0b533db67074f7a889568dc8d55da631cfe65d1c +305c2c49574e2358bbab65e298b46eecac4caf9c79c918ae18626cb6ea3ea5ab +afd51c88faf8309e2cc5ea3bf72fa7931475882da87a9249cb713bd25ddd0f66 +c98e58dc0eece6bfc1d537f887887e3bf5f52aaa42254ceb85481732f4f22ad0 +c326321139e35d2066b859faf9179d497da1bccc88614d1482cbf349474dd848 +7cfa8ae04a47cc440f9c08b7916727fb9a48325d84de181acd84db1f8450c727 +92f4d2472826883094a0bd330e79d8e79aa7f0fb363d6f6432cf6b191877315f +13b0bd9c5e0dac052685f04b7314f1578e14042e777ef6c7e49b4b1c4510d8a1 +e97ca72c77a81b757ad555437123f371534851fb922fb8ae6eb861d4cd4f14a0 +7cd933d97c711e58704ed2cc1313f4a899b401d7354709fcb8c5204a5144e100 +fd49513bc03eb616b83fcb488905bcfc751efe672ce1911cd55c48dc34e5922c +1e300e2be75c97aafb6d2c7d8b2a27dfcbb59a512e6498af827fdcb3a7a3b572 +2ffd35467d2f4e23a1bc2af72efc4ed8d0e86e983e5e822f5d7479203e7032bd +1ae7a3a7930850325a42b803552a3b00753eb9031c57185c5ee5b8a2c448555a +91cb4522b8688d2a42c15eb2e1931fd963b2e10d09cbef03e4ebf90ff61976be +720e07614b853195dee2ededf3f30c750deaeeebdaf86cdc35cf6bc8f05d7e9f +35eef1e212b9c6ed696bb4673cd837a8fe736c883f042b0dd9f14beca6a1128b +204c2b57cd58e90f046d8ce6ea694e1b71ba8baf7cf6c3346cf0dd5642676b4f +f8b45cacdb4975d45edeade19a7d1970ad567e03cd0fa17222f638b873f60c0c +085b714c18c6ec4ac1213946824452fca1d2e85febb6c071bc80cd3728cbd8b3 +8a85376914273c134b8b8327fd591c5960a0ccf823512e936452df7302d19275 +fd19ee696eac93d10b3bcfec333e1fdb77439eee7f7ba673be0edfa26c52b258 +4f6a61bd87fc89f3cf7b662fa8760e30a800aa7d85e94e57749dc6ed26927ae5 +4e1f84ede593601063711a345afc9ad2daefb924ad66c9cf7ef4d7613cffb79d +e86fc6b5e378a0eea2c69df8bd80d3b34f5e126dafbc5030bf408fd0963e0949 +a537002f59dbc2180085f46bcf7fca9356dd630328b7eef27b7577ce3c168281 +3c4df17f86a68ca27e8309ecc6e6d580df9d6073704008714381148da19acb91 +ce6fd2afa781a092b881b1e75c4525e668ac8450949eb5b4e49ff38806574657 +d45062a294972c441f8c354413102002790c9d27fcccd3f98503d6cac0f9a41c +4966a3899636a40dc223f07568ec42822a05afd80e10795b86b05529faca9c05 +f956766457dfaf48992084889d76195cf5e72e3f689a85fadede52d52fde8385 +0ded200b05377ff550e9a26ee3e976d275c25b536bf429efbbe8084c8908ced2 +7091434606e6f8f76b7407bebadb2bfeb03bbac919875c308ea1c32bd56c30a1 +f61bbd705a87d63f4709d39100257c05a0fe66cdfdd0234cfcb67fd999f88f87 +c13dabfe1e7e91db67b83a4a7f5033bcca4d9e3ad4979b1091ba749e595729ae +ad79ccbe02adef217c049c29e05508a09cc4eefcc004610acd3f45849c631697 +68253242095addad40ec80726101b6d25a4e52e746a9f956906c32f2cb316777 +bfdf3a470df987b5228620332983f68625e7e32a9ca809f61e3c25983fe95987 +a2b032cba145d2a9a31236d26e4bd86d71ea16a0fd85b393f7e3e1ff5b6e418a +25b54766aee0d8272bb2d3c85401e788cb75bd8d676acb121198afc3179dbcdc +8281c914295fc4dee61d150bd8623011b495ab2350e0047dcbdf9a9db40a87c1 +fe9464ff6e95562572c61346b1a00f37c3f0333c81753cf4c5911e5e370c70ed +bbb4626b53f9716a3b83d201957059546ed22831f5ba5ddf5eda421b3167e5c5 +8e4a5ab8437540334a3b3285c1a94a5e2c87fce09d00ef5db6ee78400f1f9c4f +4cdaf7bb85e56677c02dd2b46281c64522aeb1bb1fc83907b4fedd6678ec11ee +46dacfa31b048910cc6c9463bbcebf80ae98304ff2ee9d5c05418c667ce54354 +d66d0c61ad5c8825941523ce6800c2fd3cc05a9bab764f79369599d055085e00 +8d36906da59a1fe6d137605dd7707ad144285bcf31a6047978146b61a4dfdd01 +ed38e1888896f8b02f0bd89a57402a92107e626383323a5fb2e943316575bbfe +b707007cecb0edf4afc52419fa8ac4f6076e1dea9cce97c3f1e60b2212c239de +b4e71711ce691ad89c42074ad4c9b9917b40119dac1f9fbd5cb3e241e5aaa2cb +ba248028a4ab8389fecf0ecbbbd9d0ab8450535f2f7c85c02db8c287f24ec8ee +f67baa4a0eb50a8bbbaf0841f4a24558044a0e41b7fb390b6512aef6d7795222 +5f7bc00e6a6b3e5314fac779a9eb11b38d36facb40ec14e0d875640c90d9e856 +a5a88a273886288f14d44d0d9a8d4144827d587ee2cefed089d6979793051660 +c322890d382117f38e35e643808fd66e48b521a6eacc926b748c7070b6f3cbad +f2a3dfe4e2706dbca9439ffaebf1522e180bc2876cf7f736698fa955fe1f036d +145e3216487fb904045d5533e1b2c3be21e1a64e96bb132581bf0180b8e370ff +a32192305d1075352f404f4e8e338ef2926e71118383a9b328f8e55a5a938c73 +7b7b771d6ef4f4d62d96d5bd1c64190fc6932ac6a91c92f267c502d3c1539b48 +c6e0c511e83b687c80a8d290702c26ed02a355ec420667a8f1ab2e201b814b51 +da7700c5fcbbf06c1de4b4feea2562d1cbaf47c4015b72aa22a9b6490e775d60 +f7b5fe4e7362c765a398b0c39b047cfc5ada1d8abd3efd2894221d1676f04e24 +fd10f66a7a185403caae0a233896a2ae721c0c74798ea526db2a13a419f60883 +d4524d068379bfa6effa715d8907e4729a99acf06d7e2348ec9277c295dcbf30 +879c2a7e7aed3bf984bd8a3b73cd518f8a4f612a179ad16b5c8e6fb0c8f21692 +c764a39fbe7421d2584c7542f9f3e2e76b1a8d81f57df2276e098df6f9a2bcaa +f783708d5d966883d2bafd88416177a159c304091202f2518f31e512e24f467c +67bc619bcfd5b889b0d83229b76ccc9db033745ca4aa2b7fa65e12421c95364b +bec1082d2828ac196ed6340d9c90bb5f102678640d3481397c077ea83cdc3ee0 +927dc768113d2f4deafc9a6a982e129c5000ee2f5051829969719fbe96bb73ea +c332ac4c81c52ba840c1be9cbe9c735639bd9cde6da5f0cc484b20ab18cd8235 +fd2d8eab0cd5a9fe4c276ad9af585aa519de92be8aaec2c7ba6185d7703c02c8 +2a829b02d2cfa16188f5e3ab80aaa4526dc74bf173abafd7104c6c8351f5f362 +84a3db9c28acd707fca8a97979607f4d6dae5b23e111639271f8ea152a6d56db +dd6a6c33c962020393e13a23101899e3d2d3b1be77f23dfe1bc8bb2c56fe0f8a +4ca063369a0efc593be649feeb516b5bfc6994ab38a75beab00afa4c406c2ef9 +a7f2533b5f766bf115a05ae0dd8bd4a0436cf2abb04354d54c82e3e706587cc9 +32f95a254041b036b14d249d49d7390593231facb2c2d80848e94b7700b06527 +4b833e2a22722ff90731aa0f47166fd4fd286d5315e01cbedef249c9b740278d +2a4e183d1148433cc20cd3479d7ee981b0bde4f7f46470d9ee2b6cedc48b0d15 +81849271ebb8536f55b6712a7bed80f2550298b1f81f3aa70d39261a187d7e6f +2097660de875cea28e5583f475fa4e26950853bf6fd5e9b9cee59c1371780054 +b2238f9e6c3c9f3b4a1411fbb89fa1fbcd3052d1893332063add912ca1489077 +9b988149bb9d4da1436a18891fc7f229c2f900fb6b272d55ba55e581f8d0630d +8bb6c022d366dbe8b4238058873514e0df31d73920a720f6dca145fbef4d15c9 +411f5e0322cc61990a48f98a63f23793318c22d178734fbeacc04988901481e1 +ff62d5a8c7aec831ab49c4b5721f68f693e442cbb62d13017ded5011eaa71f41 +7707b7915b92e280d0a7fa0063d90ced947c82ffb0a01b962d2b1aecdfb1839d +d0e8335124fe352593c9938b4f4ec21a4d04bba3a46826df0972c5d8401f6871 +5c7b4906a37608dbd3f630d8f3bb64247d8e198cdf8ab8f891e00aeddbd48263 +17227225811fe52a9de08976cefdb7d5e76db46941b9576e87dd6b400c64a256 +a134755011e3d4d27cb90eded548f91e1acd8ce08b7adc929c1a02b22d65f10b +bed695d8fb1337f715c792b04d103632223040eecf2703e597fdf30a8c42d448 +82e73b2a1c0a73919df7a5cddf25b32afb51f2d24dc4dac2a747cba641fc6fe7 +ec4ecfdfe98bca936ec2819ff6016a17bdfb1c91d893ff861a67fb1ba168c5ef +59f774d859741c6606d680b68b67563b965ef7cb98e162f307504fb77ba9b3c3 +4eba8e45e161f8977fcc6fc2f4c2a677d8caef269e49c9f2f9ff6a309b2c21e5 +c810df536db392cd1b7018dca670f0d484cb7b6ee50ea1bd158af5547dd96166 +da10d10acadeaa04eb9d144a0d13d7a8f80b3e505177b3cf9893396cab022350 +bc705ba65811a2c60fc9f0e6f044206dcf524323b5cbf547d13d54ee0e87f00a +d5a4f507757cef3b458e792cdfbcc25339d8bf388ca94bfc341d76ab42cad16c +3f37cb51c85fe91e387f8c1d84a03da897a699fb80b5de32c0573014ea558d71 +a0eb713c0499438120b4702176b39a69bbf930309a555173d8558e7df642a40d +d506f2498136a5cb19bbdec74d7b436af3ae2fef171244fef9711a9ae983e452 +20f3154be125816f948bb0d93b9853ae68c77ab71a8df0d5df10e4d6b7cdff22 +c3be071f0e5dc4b82293025a27c4ff3cb5209ced6295fa9303b624737e0f3e8c +b8ef7e39762c82c89627cf2e430aa0c339eee58b684ca7fa818dd90aeda2f85e +0844963d933da431ff54348d7d9bd3159549650fa956e1395abd116aeed54518 +649290b0b1f54950529f83b0d8d9620176d7a91b803edc637642c83a761cfc82 +1b21787f83920decfb906a5260def040e62e38135944df33f2c4ad7eab631f22 +6afcf035ff68b4b709311d9d713ac6cad9e7fceec73ae0abeb5fbeafce209148 +1a0e537bd666719b41028283cb1658f4aa7f4512fc61c7631fc4eda8d678e7fd +e9db0fe0f89cf941fe65c32fc88f490226acbcbc93e5ba23dfc83ac4a289870e +5ed31f2b5cf50a93525f381bd56d01bf11299258dc387694fc0cfd877eae3247 +8d6933340343ae8d2fd1740beb0eee04c44614f9c1d45beea74fd4c2d3f49d62 +4388241c96bb392add3896e74b93f670dd8a5c415631b2834b3b8135b49caaca +007feaeca5fb75d9c4423f2f04ef576eaa87b69ff1033a70409cd5ecc93155c2 +18d154bb152491f87a8a49a77c1b6b6bd09982a55c33601547db6c8344c0ba64 +007c9487105cfd10a7bc342309d1aeba097d21d9c1da6e1ad1b1f05b2364678c +e5e496c2e2056dcac7b5c90bc5dd0b0853e30d01800f91597206dc2a1bb5f0fa +d8735dae0e61eb82138284fc4174b009d8dcb57c96b2897dce69785a571549d6 +67f539640bb0092d7d130ce57428b10a985a48576d7f6ea6c4207a53bb62c485 +5275cc7334b6fcb89bb496f3889377c1b0b5719254c3b9b19d041fad4a399e67 +1ba4b04b4a62b1879dd7b04f3b93fe31a3c544eaf70855d695eb3112a05b0537 +4c2196780e52fb906deab5add98ad9a075a1dc44a5e6b5ba6ca0f8d2a634491d +eaca8a763311e9544556b65082f93074e5e4457956783c11dd6b1be5749fe952 +d2f642e8bf267e5426a0ec324af7d2e990254de48c505b1fb742652ac86f38bc +cc59509737401620910489d3a4aae6e84f7b7001bcd617b0f09b5002ad00122f +b1dc4c7db88585c31e637095d3d0dc7fac2337eb79f02fa62d13af0d4b76d43e +69179bca2b3685d635c6f2e1e26bf1a9a609853d1510fa03f78f0b7fb384586f +3e9c1ee38da709fd02ea0ff4d5ce512f8352aa15b232cb91411d1e95965f485d +7ab5421d700af653b90839773fab6d37538ae3d61d9cdef3bd4ff94ec113e9da +9a65f75abcdfac298717436af9c1a1667e7fe80339e1383bd3d45b94f76dd91e +f1ba70a8bc50b51d6b51766722802205c0fc5e8ea0514fdfa5d5b18482694e65 +6ff5d21dc785b278f11b386e5812d42f0b4505f896d7f22b4ba42f4cff11dbe5 +07a53031462b3e29263851e0c91ceaa0573b49a2a6cbcc3c3c1a9c59c556dc2b +12d1a9f6bcc751151ce62c3f30a0ef50eae7a56ab9eb35f93975fd3ad2e21459 +52d709f052197a64afbee9fa03ea2bb9201506c0b6441c9ef7250d73444e01d8 +7ee3dd07ca8cdd5549f62d1726c8d69833e0c9d2ff5af11b1fee0596853fb75b +1387bfe18c4c747f83619a6096371fc6f444877ffaaff4a8f412847409be666d +6f96f3a2a6bdfd20f0bd08afdd3506facd35e4b62c58b4a4645e732a9b1acd6a +cc71f018c9e0622a1705ca635f96c7315f9d876afb459641315bf4ca0c4f7930 +1c0e30a8eeb441218c91d12647d5bdfe2512f2321bc51968c257fd339a24b1b4 +203ba90691564a9c83aae4ff68664d03b1a95da707bfb90033444ecf3deb43e6 +412fdea0ae772206a398de11c52b652ac04499968e2cdd4345fee97a40b86567 +2ed4711234d27ccae5f151d1825af76e8624c0ebe4a5bec34b6998040c3b8292 +76200fc70a6bff7a15cebb81e8b52221a45196fda4087bb32d5a260d077677b6 +6e070d33ad1868a51f7201924825b04335bc192bfefb74e496dab3d54ac4553c +f959ec0dbfdee94289a4a2c166909c26c130ac3ad182057644c8c2dca84a3044 +4e86e891fe1b07729531642e7374c9a272cec66bc04a36db2d0b74a622028adc +d6702773d0c9b6750c28a08902fcdc9f8a290c80c0360ba8019799d33fa42361 +c66575ac108946c97f3aa027ff95d2a6753f9dcf5949df046cbaea6333f19716 +9c0593db17459534deda9863a74b496a837c1d667df9afdaf54320664d0319bb +3bd41ef9a54b4594e6be5dc416c275a73a26af17e493f77ca7ffbeb2f7abb317 +035c249b4b5a33757bf9601b4def56a6207ebfce6e073fc9427f95e4cc3799e5 +5eee6d0422a26449f713a74f0c114d3ea2e9b2e183dd857cf21bb3a53480b0a6 +9c7d8fde6da71863f2b21eb407345e4d72c5667137f83610cd2c391218478c14 +1f1f34be21dd6fdd444ab1c4b0a59439617cd0d04ed9fc568b0c70ab8222f17e +e10c0934f9b567dbb26ee612929ef36036727e4b787015c76e78bef4aee02049 +4896893ffa23af70b4c6363f7b20db155f496ed5a8609be1e5173ce968cdff5b +2fc5a3bc23894ec6f26b71a2ac555a5cac33aa9f71c184b8f9569d286978c586 +0c4d0be59e267ad86edac17b787cbb93dafab3ab4406d83af0fdc7a29b0a0b8b +478d2717fbbc87b305b3f3020c69c358232b5b052d4376db297eef247ed2dd25 +6437c1139017556f879427b786a15bda065a1c70c6dc959f8e0cf727bd50924a +b82a8c56c225fb35f49c6937495f2b6c7a80d6ecd28b0088b52558cb45b238a7 +dd65fc5f16ea69febdb60167d4de4785b1ed69c9f40495cf1aca058ae2795fee +4812b5ae9a88ec6f37f8fc2a964e0170025fc558a7d5e093a498b018390064da +45f6d3c9abcc3af22fb37946cc10ae42bd651e213d7e26570b1eed493c374260 +6e3861f1fa365824d012b5ba6b6bde3d198e0fe078c7c17b045109f6fa5700f4 +86e7fa8b9c1a5aa9a14955877f9c7ce8997cf709ce97211dae33e406979e83e6 +6ed2386c06b400c36404ac371ec3bf27dea61b15d3db5a2eaf68b5e5366112d6 +a18aeb880bf2df3f4c151cb23ed00afd1f41edb073022ea746336ccc2eeff94b +0c896643f9d44d67ca2600eaba8db2a75a18edfdbeef3e55aae36d93c115835a +a41cdcb41d00721efa83cf094a623c356cd01f9f3e61b52336e039f3ecccbcbb +c3db862117281a50bdecc0057520b748a4beabb24b8a5f2d915eae78b359c012 +43b351570dae60fe822219d20aa73d0d2eebfd64a13fb0f05512f1c25eb8cfdb +1f85aefe9cdbc6d213db2396580aee22e7f39ce8fcdd343c9a65f86263613ef5 +c8b1d3d2ce31961170db7f3a930aacc827643fddfebbf77d5a402be5d1000db4 +c80c05b38cb971bb260fb31f8a42750519ff7ca45076a75d3490b51cbcf8b47e +9c43f349db24dedd1c41e013de99f4a02d7afbe73517241dd78d1bb77fb815e0 +23ec47e41c4f1f8cc34b6fa12cfb9837e7428a0eaa9769e786818556955407ba +5079607225977b9d1329e9837fa6ade7df59a7a5c3c6a9de0791655b3a9c88a4 +b9d643f79acbc20eb60019d7afc63f30c5430f0dfdb0750a899347eb1d9cf604 +7bdb596275613295aea793d76f6c1c012385a29721cca1d4a49c666cd91e578b +4cb177c7f24bb53b2a096e7abfd475d8fdbd0bad06ac17be32807dbef46afef6 +743bfe9c65d9f41691f698027dade394fb03a862d3c8aadd957f2e3d22af692e +fa918ace6fce92a690b5481d88638747ebefaa504873781d51bbe392c8de01b5 +ae4efd418cddfb846ae695ca0c4f4bb18da6b54ac6deaf533c552d8dc157a233 +6382159f28a121c9f2f486f9ad00d487fdcee4459470a5f8e3d3ee056b7cf51c +860ee6e54886aeac337f26d1ffc297b6903ef5756f964318d3aeaf9bab264111 +ef2ad05e4666ca98a320e0c30bdecb5d0bb00447c26e72a74cb5067c4734854e +f85a9efea96a40705a62b9fe6ce93fdc47df59fde42c957fc276c86696a70d3f +3503a4ce8c480c2f8abb6b86d4c0b689db26d606dbbfb1ba22960631d355bd6d +f77ba316866036141960bea735580e6b306b30232485f662b05284775da99aac +580a53dc696dcc027a4b008c7f55c8224e7c59eb86227bd3ab0f45f4080f2728 +3721ce2c92b117ef4ec8540bf86ab9aac4d142c87c483764691656f7b95d4c49 +69eb8403eb6e52effc8ce15cb9826fa477dabe136c2915d5f9e03b80e83b7158 +013b8ef2817b1020dacd0b8f8c80e00450cdb8e1d794cbf23596d25116a6eb71 +6186870e761f3b024ef87136d248af0077422381ddc0d997c10677e5c51c87c5 +873b5354c2f429661b9adb4b9c7ca76ccc878daa248857ea3746db53b3a5cb7e +9b239744383e4652d32b75b75a4d678a4adbabe8e640f4e0a80fab602e09c81b +4c563db440fc714dcd23d3a7e4aafa655d569b7f6e4a3e02233027d740b6950f +349d0caf99ad47e7b40f3f9b88e1e6b32dce22027029ef7a470678ccb8651509 +bd9278055958c6c8802ace0c1655fe5e52a9840513b7925150d092a1f7ced5cc +9938244b0bd766dec4954ac6cdd1db1304ae781383d253f65bd24ed05875eb50 +ad99d1bce15be48a6a363ce8f7d1d89b37ca7bc55dd84fb7a925ddacb6134a13 +13ec21412cf11b1182c1e88be892863fb487c57918a111d4857d3a4740603097 +8456c2ad7efd34d949111de4a616362f218528474dacc220f86814f2543f5038 +5f80cb9d39fbc70ae1f66855dcc1ef7982b3488f719683aa5296e955d72a3ed5 +6259fc3f9bc41b0e42514740d750a7c2987ac132eef1f7546a7ee8b073dcb7cb +3077493e4cc2d0b8313968730bd2b0ab3d94258a840e25a52b96025704462c9f +93c3cd3c2f3c66fc7e954dbcd5ffcffa622c797544121f91db0cb7793112dc48 +6996c71221bd8318a1439007735826533bdcf1fac581e5b3b8dd3356e4a578c8 +7d73026ef076fcec3124917ccafe0bf56f934dd8b57e2dbda712020b1c4a7b79 +19d9d7bcb7d5f850104e668f597d1c6945aba72f2ac3fdd00fcfd4f3aa871eda +fa706e53c1fa0d376d1985655cf33ed3dc1791517e9414860e0ea2505d280db0 +864b7b02b80f72f10b5e92a7b79c71c656a14ce57f096ee937fbc8ccae999900 +bf31a9eecf2689584976cc5d9d20f84c3796a4c9c200775c03da8fd51644f372 +0ef4a6354fda3c562a001a95217b009a6b6f1adf1eda0ba99a5ae28faf22594f +d80d09ea4bc02bd5d63f4e0116ad29ceba0b961f2d0530ddaafe3d3b3df8ffab +804c7b7855117d0c0cd591b0828539c954e7b6c05bee6e8002f9453caec5cd25 +ab4397c807b2af43c2b2a883d87fddaf6051f8b2bd6d8c9beb43ea821e48de0d +83ce6e93ac6959d8c7e4088b12240ecfd6a02e0a8a452161f878f024dc8a0786 +35ec88e6a33dc633147b9a2a1ef575e86048b9471713e0c8cc202d56c7ba584b +9edcbfd980a069a994084180291a695144ca4e0ad3ca947180f6fbe8a709a3e5 +401e96b74f2009344d43723b1215d2a145d0e1e91985375efd8e340f01f825a5 +a0d457eb5c5b7da3551bd7edafedc14c3b6b9bfe7eabcb38bcec9f1f94439145 +a32ffc10032228b5d1154d2e22d2efed471a0651c3b9fb04c1910052d08649c6 +3d5b987ef316a90b2c1bdbcca3cbb12f1f426bdeedc8107c9f2538bb506c7524 +983e3147012dd9dbc0dafc96c65478bcf8eed378fee8a20dc9dcb0f229088a1a +67336bbbb67e68efa61fc6a5750c7b29b868eb5c050c493b97ad7dfaef8f75c2 +8a8092c5be3c1fe73d519c1625670c78c373765b2803b932dab26c54664699ae +d14e20aeed56b0a70516517a62473369e6541d759522598a0be737cfc0f4b74b +17d63a72fa6798b867a1cb133cbe5ea48401fd4646773d5c377628a2560dd870 +283ecba942f65f660a909811a5332596b84ac3e6b583a24c7c5ce30ed978ebd6 +e0ea5b8f534d586b97b3d8f3d9511cf39b0ac45a21cb831c81e8b78b7824b0d9 +211b916b64a0efd2fb710b6777a93874dd625311bbb74a04c734bc3c8298b660 +9cf371f8a04b6e13bb4c5cf308a042e4346959cc5e7209f5d7e2ac25911f4f2b +b14eb97582f80998b77714e872260ca785293e0f67aba0a232d677515c3e5611 +3bf6cc8c1b0d13219db4ec3d600392cfba7c3c7602d29ee0583baa53c1601433 +76d3f84601e562b73e389ec97a1863bd0063c5b2edbb5dbf35208a9a19291f25 +3913cc05c4ea5fe74c591893b53bd8bebbed59f13bbeada69cb75d3b8fa31afe +3172b85cc8863f52b594621f80eb005e0d038adb6802e1ad80492867eaf8ea04 +6b391ac713a3fc24c0e036066c8c1143491e8854a4e8d3a6eac1c063bf1cc60c +3333732f67b43bf55b43631eb2931a9519af5b44127b432871b99b3621236172 +d0ec4edcc0be44702893c0e749d7ffd81ae042be89442ed0d0f45fdfd2a34cff +d26e692dac3f81ccfb7a7676444b48a5ee7df7b37da76b1c7c50654cf9df7f47 +da61082b64748c038e8b6fb6dcc2d82446064d826fc2406c3398b5d24fc41ef1 +ea4b833f9c9818a78864daafff9bfeac577964ea167734f4a4e4fd85516a68dc +bc0a64b1d406651c9ec70e97bc15f4d0fc43e96bd31174dd4d0d228897a01bad +1530f486e86bde3b7fe8203fe79f3904cc70f3fe5b70a52cdc3ac40812974ee4 +3ee335e05a5aad251c22b83bb027f8fd6a695a85eed610205c395f7ebba3a6cf +27dec1048355636242f23e74b70640c1affa52309879376c911b07074bf35f5d +d74e2a963209ef85f1902784898da3d4f43af02744afe6679890b7ac96f3176f +e1cebe8d534617401e5342ecc07e115fa5cd1d77998d30c28da15b763f1e9412 +d314c535a574d0584a257487052c4f088066ed99e434bc8cc0f975436473f9c4 +17588ecc0c37bf0901211aeb658dd4d1b30a8155ec7ce8940f059935cf6ddb00 +e47d4da7428dce12920cdd864ed00fed8a18c39d32556a2a1befece0443beb0f +690fc9552f851aba3862083d820da90009c546c0f8d974644c3f2033a81bc38e +9432837e0469329715ad7c6d910a8506a4135fb4fd6951dedc46231de609f65d +c86d66af10eeff7a899f92ef897410d56ab4193039c558325c7240ffe9172847 +42076b218220db2011c9dc6938f41d08634c9e07a81e91753f595a2fbb72752e +0e2eb941101c30a26cb976cdd181a4d8fb0187092773e56b47acb7d6bc7c878a +00bf69eafe8c2fd1665c3fe1b6358e3b6fc761bb19d8fdb16b77272f28c0ddcf +db4c7afd48f12daf1ccee639e8cce5234f7e60905f7ef178b39cd17a5f5819af +bd6523b008e1e3fcb7ebf0a85e328b9845788b9743ba205ff3809cdff74c8f83 +ac937ab9b041f32e9ce0209b62d8021c5d05809fe51d277a31f531f8e62d2e0d +143125b599d06c714b6220981f5e8b20e64bfc4be032393b308cd99d1cda5433 +aee558820c95db7f5ed52e60baf77cd27a60db1d6ff7c907280b024e3c1d6726 +3f3eba29035bb5d70090c199ec5682ef5fd7ce0563c453eca594ab0349fa32a9 +707df207e19461c79c33b3e6ff2dc5700cba1b297d9d215dbc3647f7920b82b3 +1e7d22319352e83376b373197e03c4c42137754961ec274a241c492daafb078d +8f0b2c1127e57f13de96d2bc9be9b5120e063757fe6b05d4e5bd7566b22d79cb +78c01deeacd07d86e961d0cb9db376d61d1beada56b1a629a93f83405c7c10c1 +eca67a71aa87d7c0d28e295a01fddf038bad9b0de720718eae09d7edbf128a7d +da8d786ee0b16d4d21b3564133476ff42ae7d8a5347749ec2a2a4642e87e7b64 +e6166032aacb00247f1ed8f552c94f3506f9939418ea62ff14d3ff98158eee04 +24bd5e3fa77c2562cd5bc6c7f0ffa1838653713e87b1da2e1a4d202f04e60dd2 +66d6d48653caea42cfc43d05894d1173cee0ff773fcf9803c2e5c150385f0c8d +b67532b4012fd89c5558b045c3026017fa4cb17cece11712ab0d617631b1a509 +6677062be9a1289736fb1abfd9630274e40393cc9988d2589f22612bcba6b339 +c961e5a4e1fbf411a7e719959a322dbb622c8a9cf51d6f405ebebac19e6051ca +5b750d7506ec8a03cdcc8e62c6d7af9f6a32b0b585f66b26ca61e290e39e341f +0b2d3784d104f82872ba0e1ed967a064f708aacfe052002972006fe14cd4963e +1b34ef38b99be8a7a83ede48c85d5c71d69e0e4ae72d7b6b1a46bd26cc636dae +815786e9e0eee89493bfebb89037f3bac832781c8b1630e31542ef7cd6a483c9 +004ab161038ac6aeb38b48b8293ad11bf441db1fef2a168b77d69c4a79f921d7 +ab9f1cba257605d81928fc46c43a4f93d39b01b07ffd0006d38366393cc64b18 +d8b18fa2899b9178c40f008044fa0d1a41e879573171478c147cf71731075421 +650fbb856eca3b36a741e2077245845e074dbdd2fcfbbc4581a2766f1830fcf3 +3255695d54307eac8196cbb693d536795388233829cb670ea78b793c4c9aeb73 +f7e7de4860712a5fbc17ce5ad07ca98d70eb3c94a79383338199a56951a45a76 +6fee0d58788e22740f2568e515aa495edc80da6a84a2797c198cc1f3d6fbb2eb +893f79f9f54ac81b39b6dac070a763cc81959bab607569423d423fc8fe5f98e1 +4bcf769ea77c0d11e5dbe2fb539ce15e09b68349a925949afcbe381192be5146 +d28382fed48e03ee3221bec2aa8c7270f43c948320a3cd0b831e529aa585a7c8 +66f2edbc5b569d4d95e3ec52c8a7d35381cafac5c301508672352d9b0f582a73 +9564b6cca37b517019c7633561f33198dd54a886408080671e1e77c0d2e5023f +489305ca314ef082008d37da60896f6c4094451ccc52f7ac0d72286febd7c852 +5ed8f36974b846d64bdad643db37d8ea837387e100432131b11d5c42e5ec117a +d17b2bcceb463d68ae7aad5b877b076f34609146884f216716186f4cdf7134c0 +f72d36ef9696d2b53ec3a3149a5b17f45bad371cbd72f2699cd52636151546e3 +d22c085349f42ba0c21d90524a94b37168ff489efe6de3ce97679298b18eca37 +bee071ba1f93d7d2fb811987973864dfad11bb5c645ce0a435f1db7bf20671b3 +caaa89df0478215fb76ea26f00682f4656e63c358f3b0bc84c64c17c3471dee3 +c97400d051617c205d5815ba63ff38bf46f06a8fbac182a4ca27038b0c8ee103 +6a9a449cc5a9ac774dcb04bc9f48503a3f4a085114e2f190e57859724a8f1e36 +cf97cfcc15d196ef82aa6d2964dbd886c39c4e72e15d869df1dbce4169171f27 +68cac43be9c95e344bcf7f0af27b45d386ab6248608416be5f432d582338d3fa +c77b80e9874d5b65658698e21bd2d4ba153f97d21223e488d4c5c2c8a7520e95 +f6ff8b1a19d4cc920de4621166a4eaea5774219ab3efd4dc9202c5225d4e6505 +91c475337f68a2d870375bb8def9f4319aaec852b76049401c121568f16b9be4 +ed27ff64c810b325bca29b5642438e259135f361419e8b5b23f6aab03ac0b22a +348478b32e93fc448502b81b0626489f4a358702e7067b1bbde9448c4af59d24 +a72c83e0042ac510c6a91e5a9ae0a69d2be865505238e396006527756734e924 +4e883e05abfe0dc62f9bfd0e8025172704111627916379044c3cfe0bd1d7e2c1 +05adfc871ff2db60351210af676444b37ce21aa14f1879ae06efe7b4338eb55f +0aa768ac12df6bd8b87feac0f48fdd26f6d2de4ad88e898499608cb770f754d5 +3571822bdb5de28107b378f4b1bc67c0106a24e9d1785336bc80d1da9636a5f6 +d25dc355a88023f7189533e4a2416755821a03a069681f4b0554ab826d2819f2 +a4cc0726412e1d2a0001a3ca49709dc21e7032eccab2f58d80a8163cc8129684 +b4277d3ad896600f610b1883cc973f8a975e328cf4b069b44e4d5207ce889bcc +49684bb2f1eebd711c8adfd4607abced0fba91b6958bcd5874b01e8370c7264b +9cfe66d1298374288f3d3f399700fda41a7b193411d1873d321e846b089a2e51 +0426782a79990da94d6182c912fe9752a93d6de0d37eee602f0907b8cd2f46dc +ed1179536bf9a3b74c0fbfe8974173a2c630c7360bd90f9c697b1d5068478814 +7806f05c70da8a11ef065cea507de043415f855f595aebd10ad001a0b68cd5a2 +ea7858041a9f40f05485b0385bdf08007f4213ab76c70b463e7427b79f826ea7 +ebf94bc420f700a50a2bbf291c867d5b181b8738738bbb76d93503e7c603a7f8 +354772c516443fbd33382b7913840785e5ae794fe571eb3fc65070eac273f00f +d12bc28451ff8be0dde26dc63bedb66acc6570fb166a583d796fe9493793baf9 +6a13bce0e7952fee6c6700a9180f5ba2d0cfb2963e0cc8606d48b9be7bc99c9b +efb1a2dea357ba87d790c52f7a90a2db476bdfb93f48910ae8cb5e91d1d146fc +04736b13a017ee2216f286ed57965d2017adea323978d3fdaecf864b51fc9aff +cc24902e266b084d518f1f063a2d0bc625ad9b108e322019d1ffe9a26aea6423 +69edd0537d1097bbd66dad8d859e7f02bfb3a77762907f989cb8579a352a0719 +969abd926a2caaeb9db6852b1494277fcfef88795af85f0750856b9a764f94a6 +5a120b04e33aab0d36907b89bee7586021221b27ca23559ae68a208fca16703a +2fd2f1d8ceff5274e64c441befc0ef7901e5ec1be2faabb271b3801c485713bb +8846c95c6ac596046cb941fe5a5ef828ead0808f0dbe808e96b5c48253cdc9ec +a0f946a3877a9a0d61c0ad150f50b186f841125a311d606cde70d36f7c03ae8d +027f88c6b92fa0f2d2b69f15a1563d5c76a3db13f43eeff40c9da317e8e0c93f +ead28d0fefb5a253a9e998ae1cff676dfd88f6d005b148948b7407cb24285302 +35313ae2eb809b59813c15ddc621a69cb03e022a71dc1212627141a77c2441c4 +39202c7f4b0937828648544b05288337535cd3d4d2b80a0b3241169c8898e4a5 +db36b8230e8e56e3d0cdb214df9ab611003063037bace671454a70c801aba2af +35048afeb620dc4fea9975bba58857ce16d2439633989d9306914bb002b376cf +00be076bead119370763b131621c4daccf9ee58226a014d05c428c70e28bfc1c +e9fbe10d94828d9510c22a7155bd28d6abdfb16e486322236b678978bc49eb1e +8572abc47de533c8cb98d80b4a529b7d05fff2302fa2b099efbe64f56186f14d +56771ff9802f23c1302732931a28bbccf8016aa68241da46b03c352237bf0182 +90f3afae514d05552932233857697a0aa8fe291d8ccfb8d85c5790157afce28c +a0d50875e4107cdc0179afe2290120c6ef96ee34bebfccfdc2d47de8cc301c14 +959a4f14717e9bd54454f382394d0c9d653357c683d65857be45c662e8468bb4 +8f916c8baf08d028e339e64803d910196d19335a65f83230a9e6c2be9baeb01f +9776b81d665f0bddd9a1a0ca31a0fb126b1aed8ffcc297786bd29cca18794fb7 +04231664a4cbedb3b41ec2d9066e6ca9d1b694a8d7be8973e9ccb799f79ed2fb +e63e114daf8c937e361d4b7e0fc4caac2b87f0c9406820e9448ea9ff98d053ce +9d5a7db9118707bfdda8f701bf6bae1021ca34b924185aab0526b046ea4fa65c +d4412f43cfcda0628f0f5790976cd501621f5ba7937e6c04dd6700f9b35f3a52 +62640ee4be7db358b971c2aa5df1dd7d090195fb4fe96c8908d24529228e7f7f +bfbe6138f00143a76b3c09e29f8eda3d5c630aed311c3fc3c9c57b48bd070b18 +b44aa15009176d0ce7ec488c945c51b26950d522bf80226251fde456d1c8399d +7fb77759130de5e1620a47f6e8eabbc2ad48129f32e97974657c8aa6cb2e7ee0 +959ff4d70bb8b307d2b6fabbc887c04a6e95a986ce189927fc97d8ca7db8febe +e699d3d193545b1937082373e930af3db6ec7e4eb8c8e1d6e5615b93177b9a2b +ce0d7616642da91de69b7ddb922a4f47eda748a71eb4662d7476ac5b15184acc +7bd92e2542f853d72f1259020f66b782f83727224470405099fdd181dd4210f9 +6e8e28b257b8444fc35053a7da19361b01bbc3bfe0f8600e582620d1afbc3803 +56359cf6e9f1964635e0e734d7bb9a1e4c7d704426b8d2a0700411c226e13818 +f739cfc023921809d6b1c8639eae19f014a519d6b71133c3e12451d21aa36cae +16f002286b5aee0bc46d5dc92ae3779d957212fb276d86cd0c6cec26c2bc2dfd +cc2c9fac9ebd5b4c7324352806a0d9894a1e809d8c9c2b1a4b56780cdcb7a548 +fbc3faa955088fa50746598b134f64f4d88e8599cc48a5d5f86f05f898f5c270 +18d50d256d761964c12aaab06befc98a84307547b80839f8fb1b7e6553d7e522 +c641db4ebd8faba0f24af058c6de88f1ddf478641c513423513002bfcba37ff8 +2336a6ab4ce3d926ca060a4084f3beb0073bce8b91271a3b2614bc0aa19013ec +694afdeca7eead2a6527acd348d00458649ac2e475e8349d186ffaa64f2f058f +a8c94e7202a8141f64ca347dfc8a7ce7ce3c9402072e188c77290563b766223f +deebc865fd7ffd4507e74a972bdc5ba05f1595c4603627e07871268392522a65 +93d3035b5f05e8cac3d90e3b6a8c8563baa8f13d4d8a878445d230f71c257ca4 +90d72b7697719b66b62055fb8581037905a422baa45aaf39efd0c40fbcc7109f +dc2eb4bd0f4ac59bedd12f12deb947f2008088321be00902d555e22391a9921d +eda8691ddaecb8be07ce75f459c1a5e9ce7c57386e8629bcfbbccc796d3b0551 +e207f6e0fa063e926f6c663d576b8d6069c022a51f9f9c21147c7afbaae7f697 +762db69c73cfc80afa498024870e3b7af96203caddb5520bc20db4b7da0f3624 +4b20a8110e753d6129c9dbba86fb5581dd9be7a021fb027f5f0ddb40bb111af0 +a019900edecabaf3d5cdf84981fe2a659cf9f95a7f1d5146a566cff83ec3523e +919d4a6ae54ac444e1e7f0a56746850186d8461721656b54bb784960b5251702 +33d92e8c89680f0c71ecdcba4b15152f2c933908449052c4b4ce617fea02a74b +b715828d499d2208d85ef7e45c08858bb344144802c885d102364e217253a739 +2f6442170b29f8e70b4b24bfa97c434038364a0c52084c204a09ea5d48873d0c +dbdc712312c582f9a8cb516a5aad8e30b591566389be57d444ee22bf80a06f76 +8530bb9cff7cba7b8374f091fa17ff0c1755d6917b073a2e167a82e381793592 +cfebf89561f0fdb63044f7636424bd0e406d622f957c740e6f0d3884702badd1 +2cfbb07a20558193c10e5cf372010a7955adf5d7e16e66c732ba52e3983026f0 +002b39b62b628dbbd44d467904e8726e79d79987812f07ef14465cbedaa19476 +5692fa39d503daf1f3f0a3ae881cfbf7c6a0e4ec54d7d0572d810f8861dcac41 +e4efe176c5219721911c8ad2b3985328d49e4cc4380892a6f108c62d711a8d9a +c44c46936b90e4d1e6fc9cb7d01a6812d11a5bb0eabf497d0d3b1eb09c2cbe15 +823ed1791d2199481c08c1f284bf72d428650319b881fcf79934c5ee86885b40 +cc6240cb1f8d80b0c8f221d8ca58c228d6da93de005b11c15fecd9450293e3cd +5005cf191803a161dca15fc2d187f22ecee8335d58f21f69d15fbbe3c1aa3d59 +5a142f8c3dcb7fa934830423f072b0d7d5613c148a28806085bb7c18a8c53c6e +43821aa5cff8497822b48cb09ab2eca0fff054299726499124f7b25973cb9c80 +936aece707b66985d7bc56f2980444cf3b1ce6a462a5b78ec05a036ba12e479b +cfad5953786ced3f29d5f6e5b33ed9d46901de314e87b831c376a21ff4c8385d +175aa0568b1ebc5f890a213483cd218194e15bdc61d51feac0401432859b5dcd +253395df487a1ffaa708a64ce045ebf6c6dbb4c9acc91db63a3bc1680a697538 +f342ae8b6e022b1a4d77293f596365503d5aa34712345d613e92a3b214cccec2 +a40d0e3a80e85caea6fa0145a6489e65a252ce407fb0a3e1f6ce12d4ff4737ab +514065a7a791f8d33df8d52849ff5d97bfc8dba6568fb51667cd3f0179ec89c1 +0d656aa50b2ff5305168af18f77a28ac8573d8cbd277f8bc08482cc0f23bbfc3 +c62c400c5f064143fc73b04fe2ea7d48f823dd9631968048820d81e97f2d6046 +992d89770073b795682fe2fa6a9356ef89cddbd94e66c7a61bc6d3a3fc629643 +2d576a90d30cd1fbcf3d511e03374ca758a245fb43ef5dd1dba49072a627e35c +10f831569b3b1d57f8857aa5c7eb7c0a9767bdc44d734d3f0794716b23f64831 +0af49c83e5aeb12dedf627af214c7c48f325f1102545981025d38fa0bb579388 +cc5c94144f5643dcb8986714082941d358d35d2c8d8b3e5f731a9c7940e81a03 +e3407b740234a2e20f1a7ce7f32b57d5f25b1788bc242f732540f0344950a6bb +6bd5bfe7d1d62b1596c7ac5796ad727a47864aa730e4fe4b0b36154badca57a8 +3651d37f4344a6520c67b41b3ef31444399933ef13f053627d361d7b3e5bd1d4 +b94fee21034ca389bb4a6cd73c26021b23784bfa0bb621a17a13217d3cda2b68 +284f41b869b70ee24a3acf909a67686eb95805c8e7ef912d0dbd5c3eafd377f6 +7f94b76bd18f35684f9c4fefaef7829534900b301a0eb3557a73fac07a977f81 +b55ac50a1386c7d6a4019a8c3bec9bac1d1d54e68e53e15bc58348207fa58bd9 +89a20e2f3396354723aa3c823a957a133286080fbc124a11a42f416207ae673c +0773c54007f9420f92c6bce228f5c93248e4bf7bcb85bb79fc6694ed1bb7e43e +219b996905f6501948d0575358667e52445ee9665035904804d45cf926d91828 +8f1398b668941950ac0bb6fe53bcfc9fda2945245aedcbd07cf07f85a7981b4c +e9e84139a46ddac48b8421fe99aeb64ea97f954b758175433e584d60cffacafc +915b856e26dd41e000c1162f76d185f469d3271887505811e12e1558d1ecc456 +2de5bf7aa4c26cab047001afae3c5d3ec9cee9dd0b5edebeacc765924ba00624 +ec49223ca7be92cac4583509aff3016bcc446e14b5dd7d9a39007b5d222f70b0 +a977e0192e6080160412b520a8e72f7bc93737e344f1c99acb3630aeac72d60d +344d5ca010e962de47cda71d704587d266d0e584e17917cf528623677da03619 +813bcbd6d360d945068e74f8eedb6aebf69c6e2d2158b050dc402d55fddf451a +d0c1a407154b04a5904b6987662af27231cf49118603a4e5de4d0b5ab40c7ccc +71847ea1f330b2a54ce9cf1abdd13208a6494d36c3fad5cbedf46d423bb07e72 +8188f9bf937e0db8d8566efd8e056acdc3f5689c8e19a27be166a0edb07bba64 +3ea6b53c4632ae33e0616222a54391b8cca32d7889f95f0039152b8dcce8ffaf +c0ccd4310fc6dca19b0bb994ee62e8085f3989737619c8c516f7a6a25f9e9887 +fd60a30ccea017e50ebd5a2c32c553d0188cfa26796ab530acbb3eb090f88401 +12f6a52f0ca684d55ca2d414a36228d88a20b2eec02d182392f0924987cf72ac +92897708af33bdcdb18c7437d103fe4a96dceef7788284878b4876333de5af76 +4617fcdd491c5c8095d19cd920dd3ad8b5b71a375f49520bbb6355eac3a188d4 +fbdcd55619ec3b6305f50d818f6ee5b5ae92dfe5a7f4f209e9f3ccbedcdeb78a +e0d055c3729429e9ed3787b52545d480b5380e839374983b6224dfc56bc8bed1 +47c1a8e7dfcb285aa1db7716164cb63bdab011797c1a9bc76e73ab86958f325a +7b7e15e987e90622824f2a12a220893f47737fe5b5496696e7772e50a8cada3b +8c826724115a236c082389390fbd27b6c3bb10684cc720dcd875595b39a47196 +058b06758e80443175359c3402e4e84ab850e42415516a19f6d10ba52369884b +e3fa91eb9a38d3aa07b0aa9294b7301faca79b4a601e92428026c70a7c6300d3 +ec7256768b257ffebb593eb497cde45d9acb4b44cfdc6452ac1f9f612af2c5c0 +be0952971025e5919fe3836a145be9e264a8c7c36c658f2ccd1acc9bb96a87f3 +a84acaad0a05f932907451ef8d050bef2f693726396152031b1f796103ee26c7 +0551f75a9334d8fcad954997d05e932c9f1f3a96e74c44e04fd18714a03d486f +1cf8ba0688599fc8e6524e4d9beb6816a4e2030d8ea06a3fc50183abad196668 +f15bfa80281fdcca6436b04ca4312e7feee8ce08ccbf90b1638b9fb57db07975 +5115f9fbc599449bb101a7709fdfba691318060f52ba610b818a849d50d2b11f +bb0d8b5f859ec9ed3ece36411d3d58d58f14827b14cd5c2a0ec4dce72a73c452 +0e1dab33aa33ca4cd3dfdb103c5579bdf0506853a7d08821ce69d4614d1a7c67 +9e9e9294526b50cc284adf3eb0cac4f6df491756f1216105e5c25d898c70edac +dfe0ade3d98daa6c07f6b2f04d3cb19d108d63b432ba6db41e68121250e5ebea +3d85b413afc8d87b934d14a663a62b4b18841b78f5965eb483631b4232cdf87f +c3159b354b6f70c2b595f46f43fca2a19667b0f91f5ec7a31972b10462a6e83d +5affa53f7c8e4b30436f7da31b6c41b831b30f9d98034708f1c5c3e34c451bc3 +9aaff97ae2c477748c7f96afdca8655c9dbd84f30bc1b568c3f9b6f495f17e18 +8ce2286696cce2367abcdb42e4000dbae8bed2d6d187b7e9fd616a17df7bb16d +ddad03b29d51489c5092e032b6ec2f365774810771e2b03ce94f5b97cec5a896 +086909f0dd481c8028a720977fc8fbf5aa62f6cfd91a798210fdf28b3df8f4f3 +937e7306048dda7c69aa5f4912e7c6192e72b1e9700a3fe380b3c9b63fb3153d +48787b1da476fd22e986874e123e30e532167bb3f17323094fc84143ccb8d7c8 +b5ef54126bd9d5e3eac00459b3636803a6dd2b3673ee865b1fc2828ae38b74fd +8c0e3fdac44f7c5111d6ba2661dbc47a0d13e751b10de1e1346633efa2607a7a +d1db1a062202c4facd05e829e37661014675f2df3775d88fe44e7ddbb3aea3ec +27d7b4bf413d54ddbe1957cff63a267bcb8ef99c27280879f5aed3b55c288e31 +2d3bf0c631894b30e0c3c8179f277cc63a395d98b66f99a87351550545dfa98c +ae027ee68d26c098d586537a2b3f0ae3de112aad1ea133adb4bbf5fec1f1472a +b941aa2db1318cf1dabfa8ee0a184398f9dbb7e6d29229830fe091b487f04d8f +f7d1daee5253cb84fbe492a4d1e117bbd9107f9ec521d924f115441f3abe6644 +6a1d4ced84caffd29e221c1e42c7379ff700abe131de0f363226a90abfb0401e +970dd4a2727eadb374f5e933ee1a11e9e85a9740e0b9a850f3eda6e904770f69 +bc3edbd52ffacc16513d4eeaaa948e533a8d693d184660dd89ff3f945ccd2d5f +602cc243ab739b4d488e2577e58648d78716fad157fbb814e0c7991764a3e0bf +9d6da3925e634a1fb3d6de50b563d90dc8ae3be33c6369a1a96ba6fb8c16f2a0 +db154373adff4e920c0b32ec6aee55887d4670a2c2340a12556e5b9d688fc299 +283e19469a14a8068efa9b489522e2f44c293278d138c732129aa7d97a8ee41c +30d2f40e8a7e241ce4d1596e6a1cd065e90167a52aedd2635e7465144df866e9 +9dac70f78425c9e68340ea5d19ad3d0fa0f944d2ad489911eb5abebd7b48bb95 +6e8ac0948aa564552395de41aa2a72646fb369ae9d08958f759afc10185bab4b +34349c12294abc6802bb1ebe3357f3b0c0ca227067f3768e57dbca68c2d1955f +5d18a7be0b9805fc2bc4b3287ef1a9d16350e5997f642ed6a9bbf46a68aa0ba0 +80102f020e5a331fdf8217fc1bf0da21ea7f20e9be95c1b59fbb458e4a5cb47d +b38fb3a3c0ceac39788794e47ecdd42b81c5f8dc6b6e9af7349babc8fa79fc77 +df3b5b303aa5dd5a2949ceac2fd202423a918f8355253f20cd86d49d8ac956b0 +2993c270fe41c6c7c4fba75b10a777191f33618e4158dd046c5ba0b145a0b04e +18a5f4ca5a7662bf6b913975d6fa9b4d1e6b71f0eca1029ed9440c91edb1d246 +7657d9ecfd8981eacd537757a8baa5318631c688d1d865d9645b4e52ccb9db3d +6549a792a1f207df608b6278dec2956a2b00aa3783630f6c516d448daccf72c5 +3557436ae09b66e0ef1f1156945afa125eae9ced158b8301f19efb2daa86a71a +fce1b319f87f0955fb113973adeb7f175590020beaa16db43bb361fec1dcf3c4 +d21a58d9d01f40b86f5059c437ecf83367ea8acb91baf187e03fc51cbf4c07a6 +74c5f63e7c7f8400c171f93ac7d3de26d141938cfbd6163240565995f44a6254 +c840c1b4bd66f05c2c08b55747540d267deeb6673f1ed54ac99ba83d15d6354b +1df05680bb93b9237883261a3a475b138373c573efef4011f042102289a50dc3 +1eac543df910695b1971d03c256f258ca48878e6c1f3170017e3ee97b9b705ad +2241ac927a86b4a44f05f37d260f451c0fb10daed031d67872764fa273a95c18 +3e9be8497c3f68236f32027f8c01fd707d2cbdd339b07dfaef35f9efa1d43a24 +5aba59558c3c0b172e30c3a64ed18c9eb7141a00f8862583cc9ab16b9184e099 +10ff30eaf0638988cf54d6e40e2a0ff8e5832cef7dc239ee90fd1eb079d0345d +cdce0a6d9ec621dc6ea7aec3eee09eaa05cb6505865b90274fa890bb64d19d74 +a618a951e3b6e74ae3c65c84cb5d48ffe4ecb86c859cce068c1665c7aa9d982b +951b95e10c6ec1dff747ebb981b380056d9ec5125ce14266bf81036a581aa8f2 +3d76432c7e846bc7d737ef0f3b91262e7cbba277966545940c67cf4feb14682b +f557e45e6f44b120c90862f3f1da74e9b0b35571cca2c2860168821289d2f836 +897569d072774cecefb2ceb1f55460ea5aeb252a2a9f653c8b646dabb7d1dd53 +1e1da1c098cc5e5e41893944ebc6da81ce44d8096813f4323e97badbf6c2a118 +942e44874e63004f7b925d6f5b3a15a42c6808062eed0880a8893c816dedf674 +96f49c25ca5f2bb1f1f49b178490c1ec6aec6bb3590005f40f339c7efaac56a8 +8f132f9943edabb2fd1f3b8b1ca97c90d376f5f62c5ec6b3aa6c88ea7bb28eb8 +687e8d24498ce4c7cc7c2dc4c60beadab36d50f0705606c4777be8f391b78560 +56c87740ed507a3c4aec3c115f837de4a620b2b8a028e9ce52213f3e7c425e0c +a2756efdfd243e55e094020fc74b820530051c414a32129cea783402238efa46 +b98348ad5cbf27b1137ba5d7ac1ea2d6e8df85908325f75bfc130bbf0b1056f0 +f1815bda877bf922f7f71488cd63f22107ab224da5af9f0bd07526df7b78ea18 +223eea608cb614bd38228782a8f6dd42d559a894b814f08f9120ba314fc85d80 +0b6909c98735b0bea839012811ecda1b5ac66974262a232eb06daf952b70e07b +b417767fd420961262fc68c7f9c4084fc324d1b7c9550db0c3aa665cccdf684e +f077cf33dc707a148e325dd3fcefb13b3d531849202f83a7909406c1f2190623 +658c0f9e483b8ec4379f43360f31c1c259f4a8dd369405affa2fd4ff1fc6bf7c +57be200df6f16d82fe62f9daa00d10bfb79fe0351c7d5044bb6e6ef64914651e +c046e9a6e9544e7fb5a983007a59dc78efacd8bac06dc49148d0df947b24db81 +551c6e8d05a75dbad023f1c600f6455eb1783aee8e2841b63659c57bc309605f +e21524b5b59865ec7eaf6df1cac0032b10b9736da197620b86125db8a97f6d7e +8e305f92b4912641b692bfd1b98193967d2847edf3c7e1efcee96b1239cdd35f +f4c843564827f9f5adc858ba2b911637205a9fa8312675d021b259f56342e9b3 +95d3ebf837e945c7f08494fc2960b92f7f6bba9bc2f5455b5582fd670e6500dd +ce38653d5dec5497726c15f3ddf885302a430f9b7946bb9ab2d9efb3c3f81ad0 +2394aa54141e3849b5ed816a717044bab44eac003a8095bc03e6b6b11cdec77e +979fecf2e780afa121e03278fc99d25c0bd241c657558ad88128f0ba7fa7482e +e6f643bceee670e0bdd932290624086df2198ca3bcdbb976379edc7204607f8d +b0f6457b3bcac7eba6513e9b8dcf6a47c075e7418b0cade13c43180970d4ba6e +fcf574c4f9da83b289a7a6d2a495b6ff32316b905f878579ed5565f7509437fa +02a28c87083fda09105649beeee44fd1a80b0092f064f7600d3bea4c549e914a +d8d595d8a278aeb78b5751eb2feb3b8099ae0495eceedbd747361df15659a9c6 +4718304f7780a881472317605a38a9c3f7a39e03fb7169390a5282acdac387d8 +88fa9ac46d3885e65be61519c131016d65f85bd2d1d6b321ed9bdb5f7210c4f3 +62254ceb44ce75e79d8aebb96654a28e96be766c19439e26ffef7f185bf62856 +b0fde276533cc68618b17221426f86406a5b0c999f7468d764dd92a632bc5998 +ce34724e7ddebb53e9c125a2be5b2712d029afdba0ff9826583fd261c85a7951 +7e0c89058d87e2105ddd8ba7e277e9bcb1cea56d64f2ddb3a3e92751d718e18a +e8eb8d55d1a35edaff938c5f6d95ec089c727953c3ff6de24f7fcdb38cf73ab4 +1ebe06a67ad901ba536ee1d5b208b86e692498215075abc3af597dbf93aa87b5 +84876a167d593c5fc0c487235b6cd349d3edaab4265da66f7c4ee4967768fd89 +c7c28a64c97e20c3a34973b9142314a1511a6fc6deb13dd451ef69710513f18d +d1c960e712d73b1db1e8e534096c255c63987ab4d32e1a8bfe145777fd1ca548 +762f7b4f7447d03a61e770c12ace3860c6189b3d0e41f0551cf722cb3dc09073 +f0567d0be9f39e8bfb0f338d6efd8e1279cbd43f6c4a063819aca553c54aa234 +6eb9d433c5426bcb9b81ce88b557a2d59bc7863397a9994dd6bfd6c7c7faac38 +0b128642a86241bbf8a4ffe9887758f94a153d6b2c138442c5ae670fb50218d1 +fd57d841af8f328b33173e4b8ac9b6db3006741eb323a502045702eede107dfc +bd4081770e3d07dcf9cfccb7e56e3f0c7da3767ac373a12f3164f81b493f12d5 +49ac50605430dafcbd4a9f49edca82b594ff829ed3bae596a825a618d49a96a1 +6b61f8e8b0e5b3fa032561747b96fa1935d74d0130ae01accb3da668a887f6d0 +9741836de17dabb950d84738dc5ff722838b507dfa7f4a88de4d9aab12ff9a34 +1db27abb24fb8686161443341a975cc810ad1a7e352037dafc33682a5556e6fe +46bcd08277461c74caf2ec1ca2db253d82dc72ffcf5cd471900b7c0f2390aaa4 +eb6196020e305edce04643a2faaa4fa9df91d3e21121da099ce25975d4c950df +f59f5e4ca3f426af7b33b958ed1ff3e1d1970eea0b97da7212e8a42124372638 +cffdb6c5dac17629c3d04ff2344df5cb39f6f156b6b8a4bf38c77d421a26ed40 +eb2e4e1d274ce7b5934c69506c1705ad076c58ccc5e27c580ec2dd978dd1074d +286163d79baf91e3ff30a507cf1c1691f60e28c780b8f2b2cd7a66e18413094d +d4381a15cc3a2b8ca189320df07dd3a25580dcdf91a2b33b3d8fc89ce71cc087 +8c0d5d4fd12545bdc7fe4af1b9cba1652dc8c076df6dd029ad8b09d75631b4de +63b3ee38b3d133d0d3b7d6c991cbae09a8aca77ad4e0351ad54d2a4a1a2c84b6 +2a8dc9646ea4cfd1b66af0707eb5fcffa78223898c0f377ad55e5657661bc1de +e331cbd9fec4677181d3577978ec08dbda4c684cd0266ce6d1e487cfac64ef84 +62873d034ad7d22518a7e767ba80e8514317710a71a228f76a66ad59b345c4db +f03e056eb6c9b2c444f2199c8488c037c37934d449f0049e14c588523d9acc78 +50538da9ea98e537418f811afb492818c285bdb80a31987b41a1671a77ab530e +be57d8b71b6f9c95f7474faec60705c2132010887ad668b1d7d53e26b480590c +28367553ef4cd87ee973a99346fbd55a2ab67635dbf2df12d4ced638b733a921 +4da2b898cbd41632807b34fafda648b3c1f53d0e5c835b0cd3803ccb34a447b7 +6a5bca240cb0b1db849d40dce5fc8f2e3f711ff47e7b0e1a71cabbcb4c42e265 +1f482c194c301b4ffde9f787f9ac37c620ad634e7d1bee6bf1dc92acb38c1e6f +fc4f531f5e8959e55c5d6a97daf9b11841ee4b14c4ba58e7f0dc9aff440e2a5e +61b046b0d47d4ed606b4055077bfc0d7c033b3e4fb817a02be0891fa360b6205 +8cfabfa60198f426bb7ca31877e4273912547e1738446c2816ccc6b796898310 +ce86f1f01654cf02b7e6f647e9a884041655a76d9d646e2e0098b15123de9ece +8580c5e8b36946f2aecbd1922d21d15092617486d2a7da0419c430ff83a76428 +d183c15d0520b821c22e0aa806eaedd6df9392b6dd93db8f22072044883f7102 +dc2abf3ab094b1cff83bfafdbc0f115d1ca965885356039bd90c76a78bff2b7f +931ec1a762b750146183f4080b7161d9e313c90a3d0ba031dca89f5155ef2c77 +d1e9949d07a2a318ed5bb9f43ea2df854dd15c45c09595450b0cc355db139f6a +15792d516ffbf05d2ffde2ccb492bc5f8582c88695eb42ff075f1393d04e19e0 +5bbb51e286f578ee126792068106db3960ca7e7da8838c52381d1853e731f46a +fc759825cdfd1c50cca5e63e1a24a9d3eb21a032cd4333648ab4b6725ef7ee64 +4bc1c07206312e241ae8c4206f8d211752ac7cb76f2569e2213c113a3d4f2277 +2fb6c2df9461da1b36a0860cf2dd52ceba0cb8fa5134d94438458dc4ef566166 +0931f0a13a88452fabba8805471b38d776fcfc616c602f91ad0072b92a13da58 +08f716287712de4f6acc57630b3c4343c37c5156fb610f2455795cc9e6804de0 +c7b6b16da5b274460bdfaa1a5249a3219caa1dbda045ce35c3b34d628d0a6e04 +3935f09635d6063592dfee4e8713fb04a74e0bbf8bdd6efddd86d6eab693df65 +d7e71b96d3ab69d78763f6c06b6ee1fc2b8bfc274d33e58f7c13e46f884f64cd +2ff2091d63d8d0d2305704d42a18c353b55956f11057a920dc00a5c78ee5c61e +0ab73272866a3b5c6a46683cd4f761f267fc8e98a5ee0e55a9d8cba48cde5215 +c96d0fb18f757705697c13055d7f2af893a097b594fc5200a1fff0d231487f94 +c6217ad21609874754afb8de70a84f92eb3999ad348ee6baefb476097ff1cb8b +dafce224290bfaa04d3184d02ea2c8525232b1f62d8a3ebc5ed8d2aa1f7b009c +83d427e281551583ff6d1690692648d7e65e7c98b67c8d181ce0736f1518f150 +9c2b13ef0135118fadb78e58fb01f90fd846fd9e7fdea4a8cc481333305b1e95 +4d0037fdfb31d34bdaff1e1c0ad0f30683bfcb8510c30eca21008147a17589e7 +2a8b2971c2c6e8d45259be84e4884fa79791f7bc3abfd138b8b4556bb75e4f68 +bb934676f740e015396c5ddcd224834f53dcc17fb33bc79e15374249c1d06a1b +f20f3b29858ddb1cfd470449e098195aa1a64c187fbfe6488b89db49851bab87 +c77b617543570e105c27e7ac73583f02d0541afd6139ae5ebd8382464456731b +6779788412dfc026575e27a197c5295e3a261864c9aa91442ed12d3024db79cd +1025564f9cbf5686244000bf2caa92df14db97bd2a10535891ff3a84008209d9 +cad7566b8800ee7287ede867d79ecada749aa5e7ad22b01a9f211ab18e5f755e +6736bb2fdb47e4152aaf887aff350a7a74eb69430287afc58d46e2c171aba4cc +a01792b0dd4b0a67624d82b71b19c331e355a909eac5bb94802233e6e3310f97 +da3c5d40ea74ed3ce0d283233d1c5907fe29dad678a9c3309402167881d3daa7 +4e3fe4255ac1a73f15f90ddb601d827332115538f1bf93811a35b441e4442327 +d7fa2dd901f3d66b7e79e09f83f9bef5f5fe1c01fee76381ad3394861155cd08 +fdf2ec5778e4cba57acdefe6a35191c613cf12c946ad8b2b40b6026b5bd4b9cd +909d1779782f4af32d295b2e8f881a18d2cb0570104768449ee2e960f082921b +e9ad82731065b3c3ef18aba3f9beee050545d766b4bb012cb05e36c98916000b +22f7dd0d60090fd5812d9c7e0b7f109eeb4c225c9b6260f687a39429e4ee4dcb +2b1c5f8cfae108e005887b30a949df06bcfc34700b69a5103330e400e4666a1d +5c758b6d5c2ad8a733882ac3cf1e6a1395534c3a9300371d3992436227635313 +531d453ae6142bc47f086f805faae0543b21d52962343b25f64bd46ca8f63f25 +bec767324d38576447056a6f508efb68e491af661b46f7ba81da215fe797a16e +f03cfa53db0b51e39a7c71897ac5ba31d902964aaf3b148e7ada10fb7603d4c9 +b1585312db95625d45a286228dbe2217d6bba65c9a7dcbbdb7bacb5beefa3c8a +43f848f473d9bf37abe92a2ca91d26707ac230f577f7a1618a02d2dca08bb84b +3343f9175ebb3e89b36a46eb75b83b62df50b0108d6118f790dabbde765d53b2 +7cac6abe7b5440325adee21be51b9367eb9cdf8fed87a081679e7ae6aefbb6e6 +589cc42556fd865f312b54cff53284cdf8b442c4b3326eeb8d39abb1e0d2e95b +316e87b7615b0c37e908d4391f1ad9d2715e94bf8de57a1c624512c23fba4d51 +9150b26a4f13be2e9ced538d80ef807612d561dc8d3f5b602f4886b8c9f2466c +5c948ec6dae5b87d00c03caff6c7c241f4b965a6c6368a30013ee2ad5e1e5000 +94308aecc238f659e736965842b290ade6f05b5152a27fbde7a90fd97cd59509 +f5f05fab13461bd7374399bc6da554acd718e4f67d8696718facf56d5ac10468 +cac7833ba92c74bf186ec50fdbb043223974986e2012c1d18df40f5a9c52fd39 +97df5f9e5f3a827d50b6ebd6909e7a0de29fb97920a03e32422cd71d66bf5c52 +357a8d8eb241c6c8be42b67cfac2c3777a0fa43d2838db8250e2b5b8efd3c367 +80b19339332f67d477cd3600b04c05b87b7a41d0def6bf82fada771804a5a756 +bec34265b6fc9e11790f8d1306d36c0514f6bcc76e93b584bdf86384ac22a96e +31549eec68909fd34bfcc467cc742dfa628b15abb7aa6a181dc3ac0fd08a2097 +9480abc06fcfbd81e7d4ea358839db58c30c3a7eb5d698cca371f7630939149e +b897b24f6d957c084cf0e2932331fb5c0b501068b4551812a9b9abd4ec27df7c +e824d672ffe6e5971ecf816f447482130819902d26039390f84fb513d2d89662 +defd5725eb153a074c84dab1d4d666d6e1a4ae2b078ac16f80caa6314a1f63fb +6d7eb530ccd833ee1f4946790344ca86668cb3de69c3013c73c971d7bf583095 +539dbe02e8f18e2da3bf9fde9cc5a5e859f9e5bac8721e36a1d50192140ed21f +a6fcc212ed167a50e940b38a0ab78d3053507500d768d1ea9c7bcc7b3100a05d +1db9350ee33c7a492f4543b45e25740aa99a76a1dc7940b8b52883974b07a407 +df7560cdf1b103c75746fcfc418580816597424c0aa36e0dd38eaf524e593512 +174a0ebcac0488958b01c1199d786f93ccefc14d219b2dbabd5b50c57ac6c195 +fe51a6fac81db1fae5052f21b3af4ce8280bdeb5f27e15f069ece57b0b628858 +947ebcf41c69d0c023d67cd21b9e0db1366ba5abebfb9c98752a6c63cf1c8333 +d7185403199b82e9e5fa15d33e646e63459352f829fc039ef185e004cc63fe21 +bfbeee4c8102cef70f56aab4e35c4a7ad51c85d985f42d54e4cf5678ba7ef4bb +3c768056fd223fbd6ae0a390e0e7489f5582d4ad805a6ed2e5cc0502be6f58ce +b1e3de8cd4425a053f84ff85ca7a1b9c679b9b57457f91c441d9289469255452 +34c45d58ae796a7f21b960c8dd3195854ff59e6914dcca262af6e5db7f150976 +b91527a1f0f00caa0953e082f5dfea46c0029bed4eff22be6a32a9bb591334b1 +68da599128f4b31034e20c0efd5e532b9ded85e5633ae8631e83ec1d6069ff76 +aa302b99f88e0e4070e4b93e1cfe528123928ae67733bf6fe6068c22328f16ae +3fa5b130d9651b531ea4e197ae3d3c16948503f1842d967eb3c5504e13986933 +cc0a3228269139d68aaf3480875149e25acd6aa8e14f5c21fd12096e274a1cb1 +223159ae0b531804c1a8f8dbb9101d3d0e435292f0452990ac4a646058651025 +3ed58cc6fc71eea6ea99c6f96f029b65f1c24cf911a35076564cef64dbbf82f8 +7de0c4f2faf3e56a1659d2b56dda42a3f63e277645b9bcd5c92c05c8b05adf75 +35b3aa4c341358c7c7927b8e9937c087e5e142b14dbe5e5f709634ae97bc9f2a +a82a2f3c3dc16b1abbd1e3f33559f8670e1dc70a9e3b0b717ea458518357740b +75a9b2b9cb076e81bb95d786d4720dd59120200dfe860b6e40f2c723dadb84ba +e83a80a7c874b9d36a1843d3ab1dc330eb986d25d6e036940f89670cd41d7ff2 +0a9e19ee36a1c334c779093950bea2854369f4ef24dde7b17e4581c9c2f5e5d7 +49bfc7a6a9433ef9dc465362bb2b252d7505369b40ab4ed1280c690599765d3f +6c395d4f3955dc9e7adcacd0f85b34e33c1d5b0da79e54132e115002728fbcc9 +def9ad99c3c72ef5fb77d883f47e417bd26cc8a13824297bbe6102cf7f60013b +3410e61d06f4d9afe6d9eafc92b97459a0433a8928fd24240f6f3e388373efac +1bedcb5dad56b55d248dfa546329ce77f4f94c388362e836195638066d636a1e +9de34a86088831a498a52821e2843d704bc01d386e7f268855af107ab35982b5 +9a474a271c205b19ef717c66cdcfff8e53e207c2c1fbfb8129f045f0c150a053 +33787d5dd2d7322b3ec6f9193a891c3c1b414f27fea3635a1c1d88c21c18cdc9 +1805f3214e8536500b67ac22ee4fc1aaf6a12be4f8fe82e021a734937f0a05eb +3de81d728121fa862a4993320c1fafb719ef1851929ac2efbe7c1e8d2a3e35b2 +5dbe28dac5ddce834663b196e17be78fef40be1ff3885293dc9b6db2a7973408 +0730556c0b64d66176078983b062cb073d32000e12e8cce47ff23f877078b5a4 +2207a050c62e39733bcdf87f6b71e39758f531cf55a874fe76548ccf8ecd227d +9c0d76da8f0ea5b1971e71559203f2c731bf31f9563a58d6d110ea507bb7734d +3baa443805c67207f3337ffe88e0a052eab7b73296e7011fbebc3984abf53382 +1f38a1483b88eed29606b25619acf5e21e6764dfac4559e8ab2e8b987c05cb3f +23f7a9b18fc54c10e59b1dce3e3bee7299f9e98cb58df0fb48aa79c6b87476e4 +bcb73de1eb9603cef10b6ff191174e23741cfc9711ee68311a8e739dc52a1b69 +b6bd1afd81df4f6b1ae5df916faf6c6fa778f9330059fb88b5e97ba8b864e485 +b2747a1a7cf32e259ab7737530e55b2fe980ccc088c3f5e2815e960beaa9ecad +530436a2c0b86f3c3aef098a8dd927ad13f9ff34b87a1a9f07f455b913cf1147 +270acc6db471e53dc3715cff25ac42d6786c3e9d90ea77873b301cab084b1472 +71c0cdd6e088bf710114ac00e1d6d215e5445605034b771390d0ff76d2f7dc34 +1a065f905f258d223b +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courb.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courb.pfa new file mode 100644 index 0000000000..795ec5cea0 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courb.pfa @@ -0,0 +1,1966 @@ +%!PS-AdobeFont-1.0: Courier-Bold 001.003 +%%CreationDate: Tue Sep 17 16:48:30 1991 +%%VMusage: 58156 77080 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Bold) readonly def +/FamilyName (Courier) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-Bold def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263788 def +/FontBBox{-48 -288 746 847}readonly def +currentdict end +currentfile eexec +f0e992e2abe69f26883d6a2f691cc4ffeaadae4ed96950027b000a0e04f88bf3 +07a055997fc4400b46368da1c0f572a6e1e58371f4770d8e09ba6f39d5948f18 +de1038883553c352f8e6add2a9df060927fcda05454a5bce5badc6153a92a950 +b91e671de818c860c77eb6b93cabe55b175ae8265971df2c78d5dc3bb7a23a3b +5eb80699e4f540d2aa0774262097e2f171f03b3f8143143f7f192c7c3ea4b3b0 +d0bfe6893744a6ef8f3fe2071efdd77eb2ed6a1f8365d33ea9a2e3baccbf0886 +890dbe8fd6ec2d9db9b8a11d6f0c2a5ee4b84b2ed02498706a8c6fda02e1ac8a +e43fe22852111c257d9da8a8d69c9fa405341c435bb91cf627e7ced2e96614bc +ff826d0ceae4942a5c8ca794b11bd2bd48dea7cea631afa4f7c52cc775c70f17 +4c36dd977c5cf62ef80ae874fe87bf798674a7b32d84da7c9557f87c4c8b7b6a +a061b8d1f83190fb4df552d2742fd99986e3e33a9a4c578d90637f42d84cd9ff +0e866d419216ac5de7308e8b98bf17ff95383454d45ccf07e90cb1a0ce3b51a9 +dd88c2e2b3dd662cc745bb5b4ec33418a1e4cf6c9a528e6c283c34b24da3eb52 +4431c4da3cb34a43339c606956778e666815be262bd069b1b5103abcb91f1524 +5bf33428d6cc1d3e146f0c711336b471bbfaaddb4e1951c8325801c2898c6dbe +b5d96418513226315c9c8bcee2f3ebc1117d5e136d8119839aefb2c76d8c8a37 +cea1d23467717a8398f2437f1e61a2dde224f07e835e67950bab0542fa635ca9 +9c457e420ecfd17797a5ac7d63b003e4bf6851400b5a9431d9e4746525107c4e +4529224ad6f666c7b4e8419a3630ffddc5eabfc0e3f1c089004b79b6ffc45d19 +7087ce92f5691dcaae4223416a9bb4836b5e4d3963dba28445d81ffa93d59c14 +96a8bebb0dd93230a8fe36bd1a4e31d3be4818c99815e7ae26023e5c68fbd21b +334b178ad4989c333c37de8f821bfbbacabeaaf49a38e875a6fd13ea6fe45235 +c96be719db5725ec6e507e1a64daa56bafd017460730b9befe29bb27115968b7 +241f56bbe5e1c787f3ffb590da9c3965c184cc5f94aeff1ea7b0a013caab3bd1 +c4d41e2f61ab5e2eaf1e9c075ca3dc040f988ffcb815622c7e0c31ed670a9aff +3833cc7707c2887f0de43a590344a70e014cc67dee79bedee7ae796448e61c74 +02f2f7e72f5db644c2fbc093f5ff5d6a787194de10423849768a48d56103bddc +598699a43094dabd1934e8ddeb284b9651b9ed215c9e3b5a63ac766e29e7f0cd +2a4f010df4b1114115ce819af6706107be602a21d002e1c45cfcdb568a1c617a +68c25f2e3e0781192c7ed85f449b56caee4ba991e1376ab43c1c556708e65797 +ad13dadd61ebfcdc57dbb59771fb0c8f0b4b829b6b4a575f17da658fdc2a261b +87fa8d8f39540f3b9a0cf46b59341ad320f37d71a8a9811f5f24b307ca32ff6d +e80b35ac8262334afed2567d691d0ffd933b26b977ab624d2757ef20e9ecc3f6 +8b0bb17594fad3c27fadd8487b441fd520c8feae3b22646d71073bf43ce3597e +6063e073db9ab0ab98128b97a84482edff091bc809452f0b2a37b26e5f9963f7 +118dd4f78d097efb864a5495f0104674564227145d923fbf39d1e85c78c8f92a +e316bd6b70231733d39c10590c070d173c7a4d10e08e63303a77206dcf01746b +1f78cdc44e06a26191024686d64436e519ad103349fa496e4159b3a436bde5e4 +20bcfde3d3cf24f50a1a625ee6274576104a3ec62c0abfbb14bf6dd280559160 +887cda1b88edb9dc2496813cc21e7e26fd42fb6770df364096d34cb66ccf8a40 +af4530facc5dfc5a672f5c893ee33e85a88113f2f19d1a40dfdbd2c1f7e132ed +3a2607569db81e7558b536d131dbc71f55cfcecb31137b0d807cb90b2df7eea7 +6e7790d59d7ea4fddd66247058ace1d33f6d8cbdff99be2840fca3727307ef96 +3e19cf0f08e953c85c4141bfdd8b6f6d942389ca120969c69f35c10738f5bda9 +b872253532604e5058fecc5ac4b911b3602546ea3a3b5f84dde99316fff9c1d6 +08b59bad54015883cf8cfc01f9828b9ce335aa26dcb5c6f445770d0fde2df51b +83a128c79d7a1351e6da950c256bf97c69f73e7161692c192778d3d361149c40 +9c27e97562b7e2ca2f0a498818571fc7eb9552542bf56c93862aa9e06839d169 +ad983d0a370b0655d45260568ebd3cc272c344a3d0697e05e27641fffbcb13e1 +aabdd1cf7f24a5d550700c9129b392746103afb0ab72e0f0305ee21eec6d54ca +bb0e5d92b7493719bce7ec85b3f683ceccee4fcfffc7d127ee6e8f76e7ab578f +80933ae97405f4e25b793eeac86057448882c70e3497d430f8e6af1246a38a42 +0231a4f8bc095b87ebdbf6b6e5f0e9e824595835e06224fd549b55dab5d72511 +a8829822fbe050dc7b9d952a1a8274eeec665a7cd924718bdc21747e43ae8cd0 +acccb305a78f6c201916d5db4efd23a890826b74b9402f141de37d254d7656e1 +093cdce592272ab46e2c9dee9c100e7fd1f3a558ab7eae233b167b447bfb56d4 +becc14a403850a481eb75b554adddc89e1e2d0c1a5ecca30f7c2183cebae411a +28ddbe48777e38e16bb02e1f62d1f9a090427f47a5da5bf867c04ae679617439 +b4674e92d80f659734b10d62ac5fcf1d0aec16297c11ba085eeab1c4a7017cb3 +d9653f6e8f77056074e3933e65ffa2b08acfc8b90599ed85f5d91818b80bba55 +6c05cd944be5e6d76e00f6df048992c4b293b83fe275cf4231cf0648f26a0d28 +0593ccb41a92b97c24a39de7886ba7f53924743fb66baa4c01ee21a16c66561d +4fd8cfd7a7e7f4386cb6d818277efb779b2b219adbebdae898083d26d561e797 +14553ff7b1df6523f5c50c8d7d4bde22a4c220f77d9c3416709dd5c4c6a2baef +71c8a7f65eec53d15ce0112e745418467e49172fc5cb0d5df2c000b3da184ddc +9a3b24e4e4c919717c9e348a1a5665d06ee268303c11ddc16078fa8424796663 +eaa26915db69cc77126df2d80dde5beeb879b9c23ff1acea4dd0584f45ddb29f +bca6f48dcd420b2fa5e81dfb3be958c18bccfe7c6a61016614017745a0f10a03 +ad4f56e670ce0a98a227feb9fb28b1b952c4b86bafbd9210ab745828533741b8 +4efed05f94d0aab602b37d7e9ea944138c541463621ce3ddf0ff99ae36f8b9e0 +c14ee7820eee3a45b8d69e8f65fd2288e6f1b7eec5c2a45822ef46148db12390 +e87c7a2708cf346e04f0bf81cb5623a92d17405cd0430df9d3b7cab3eb6115b1 +d18a1e8f3b56f1b93322cb091f1ad75e1e12b36f052592e6a0def7f5dd9e18fd +2f52ec209488ca7a954a04eaf4c6c50d2175657755512d43734ffd5a545cfbc6 +f9b1e740cc0d3a171f46d0bfa29a55287aef25886ff435f9921b714c0553f566 +fb8dcf761180c167b014b57ae4428ba4ca642c0a88226aaa4dd86f822e93f19d +3ddfa9f26b2a1079d87cd7b3c571f989b92ea58fd6661200664b36fdfb4afa4b +5169c09ff2182a2c973b8fd3db31d1eb306957cfc99b6ffc9c060cc2c77308ba +7f09373339b2a28eca14f263f91be194705f9b23915e2f6d68ffebdeb9b2da73 +ce80d19411dca457ca50870929f48c8d72badaf27fd8d64cbe2c1ce900cdbc35 +cab95fef9628f6c87fdb6c45e61e3c6b5bc15fb2583dcbce919786278ce3b691 +c0934f10c953d259848784fb9f325ee140f1c421d6d8a63ca4096c9c1ea6a5f8 +0476a9c4505129fde53639673371e803e60e3d337de079b2377d0bc9677734b1 +1188a98bf1d009d0e82d8e3d8817d465d568011a7c59fd2ffaae8d93379d124e +91b182018b5e50b8b7cb0cf1f914edc6b44b38419caf14bff525a4a5790e85d0 +0b7741cab4dc8711985ae161a253f878e51a453a8c4b0a6c84f533affdd0aac4 +3e6744f1e43904c009f4bf3d8a677d66659108b526ecdc0ad8a51d16de6f8001 +4efb474aaefc49626bf733937c1d25f17f3d30abd35e074527e26056b3b4e0d1 +d1787939b0c8e14edcb4061ea004993463249de82d73912bc435c4d792fae794 +7b99b3e1ab7e5e1018fbbf1003b9fa965d43593fd0aa1b568b593d9dae2f6acc +4a8b8d6d8b6b5d5fd2aecc392c7cb83588d250050dbed3b32df79de71ec1984c +e841adc77597be223a79a37ec8f5ac91b45f40943932bf30b77a82a2c62d874a +da8b86f910f1269ad594d5ff033724d3101098630d3728baf72fc281d13cde34 +fbdb8087c23d86fd0cce3ac530c5ebc086062ec32adc8fc2e5ed66f38d3b5a07 +d1f41fe240b3065bbd5f848d6c97f8b2ae149d07502166425d9285f9b9929100 +cc3b8c824c5ae124157f21d63c17d75990740c8e083540c0fdf55ab6a6128123 +894e6846d8f7098bc76ca1f696ecb31cfe5496ce20ee4859dac102bee4e9285b +2ee0d97409fe5fd5f7dab76118d8394d3c4e91fbc3a0bbbbf314d91671ea9206 +598129e121977b36e97a9e7cc3949bd6aa7e92e58ffdbecc7bfa8712277d2b8f +8e0f6e402e5e05b70db4d4d18b82a92dab7e712749b5632e62aaf26988f4ec20 +9755e47826073aa09c410741a8cae9ac19f0695f61db9552db60bd1d8dac78a5 +4a649f77461f7546fd35e33ae5c918d65418aca54cffedab20a86545a7d7970e +1ab75c12d09714a37fd516613f1e9ad1887aa3566000bf8a7c9751ae22ec3be5 +5f7e8c58229da2944051ad23625ec7b1c26e65d30de52ab5fee7a5d3184cdf0d +4acb0dd78ad3f79e2d6eecf19d8d45a18848611913336d25267ead7b1fae93a0 +c123c0dbc44f0178a8a1c31b8ca54827b34925b7b1432a029380e9571442a77a +aed4dd342f6bd1f1b773a4f1ad1c0d4c955a1faa001e2ffdeeadc86282e09c8a +ac6b9d886ffc443ed05966952482a7ef206e891c90b9dff910884ffee5c78de4 +ca40f6ce31bf465859c27c7b942246c43ca286dffcbb08ce12842f32175bfcb9 +21d324e0746ede76064849874534bdee62e99b2812d07314e76ea833e491b01b +7dc009f842e10b4876bae3f132f8ae3ac04304dbfdcb2785557e7b48c45d940a +45db8cdb374097a8c745ec7951e6e12ff3c51f0e0c8e7a82d3f77e90baa09658 +311167e0a688701bd62c3a598772e12c107deab4fc6ae3ce2b81659593e63734 +2bce989299c0cf8b815ec475e6b281e5d93725ab50f2881cd14588ba1cf800c1 +4656537f35711c98bd0d0fffd6fb6a1dbb5b8e3f3047d0ec60b902a64589594c +904f9e4ba36837f774951fafd3b9c99b0a7e643350fa50fe0d69723493507b57 +6dfb9c9befd7dad68d2a094abb1a7c19d8b89d6b5290af2f774dec10699beb25 +9fa0bfa8d76cffe9ccdd9a56e20dbd043bebcd61b4f8d795d6f273705ef0f664 +02ca640413e2b97f721d16ffcf103a49ca746d4f166b3a241a9d35edeff5fbb0 +19af2ea1e4ac319ed01a39ebfb2623dc69470d2c7bc38e876daecda4888ae494 +28e94d9377c2634402dc988423358bc949db18d55388126c982b5965a9ad5648 +c12f46f6e5e6518e323d685011fbb99c0456c4566ba542929d767c7bd154454d +75ddfa96c0e5a79c6bad3d0020556bda8b74e6199f327b0e17e5c3706c2adf05 +2007f91040a0f256b4d9748754638ff019afc766b12d937551b1814f28de13b9 +78344ae18668bd5f2792f7f12617043e40603d7474677f0b05967cc58a0ce610 +4c7e806f0646e6a631595384aba225d071848b176eba2a4232a2af75faef21b8 +cde74831d96c4682bc4c285ec5d4e1433b2750de64a9f42d0ee379908bccf699 +6baff1d5e115eb31e88aa4f123f4a9ab2ec71f3458001e53549a5bd512f27d50 +2f75d33db2732674738e98fd5562107aa071edf740e6fe4c3581f7f1a6bdea71 +11878ee1514d2a764770bca4a1db912ff98d26b7540915b03811844bb606fe66 +3d5de9f1b8ac6a46cb328b66151d5a7aafc5dbbef4931a94409ca6fa9b26c970 +f275431fbb91a35622d948fd939e56efb989f007b0d68b012a045ff725cde14f +9acc5df8b491f21ea3fc8b2b435eaee1ad74572cf52f1e913d44f4aef6df048c +00375d6734d0e829c0fed80358866c1988e3c09c7ef36f5ecfc0ed411e0b746f +6b04d7cb5f7134921969a2751074a3e33e9a7e2e68f501e66b71d3f68f7d736f +7c4cf241a6494045d87f7011a4a67279ac40d5ebd644e9fc56a97d5cdb31dc2f +f047589909a0a4517d6057e668f3594fef45bcdf30c854eaba5c1baad26e647a +097b4a0ab8538459ac97d822dda5827d96f29387b40f4b673bf3dff58b6845cd +3fa300b8cf4acd3e6301f5a47f1370c8bfb8bc8b3a961204e2fd696fda87c16e +30ac81f9d77634c5e8b19eeeaf9ecf43637aca16051acc7b63cf5b4fc157554d +e510d2a8f1c65369ce48c3233c445a0e4a81df26d68a2dcbdeee609e81affc6d +632d584b2d1e5939fb0eb3c6a7880ca593e99bb4d530445bf552e9f7fb0bb25b +b13a151832acb776c7768ee9bfb2d320c90d746df806bd755cf8604b2b0b8786 +052c5e8d2cb2f96c7876dff63f5ed31634ced7a1098d754895ac6f7e8f5f6a01 +494770c3a22cda0fad4411cd76fbc92b0c76335a9bb5b3818259e62383f6a1e8 +df4b1ce43717a343df9f91a5d2df077af4fade7cb9af6608804c08808ee2ac9e +dc25407c6e3ca02462b5d16e705f90b8fc64b7d8679f7d0de875b72f7c9c6a3d +b45e96e0ee3ee6f8cbf4c85f09746745ecbcf39ac3b7d6e52f3c5e79af0962f9 +91935435880d10ff0f00dcd7cf994af8c776700df9a07b6161f44d9d803300c0 +8fc227bad040c6658beb8bc4a51bb0adf41beb908d39a7d60137a43de5f1d97e +fa530897e71be24647b015cd2c76c0b0d1bd0f941499fe00ea4e09dd82910861 +e671f2f0c56f5d4a7f6f19999b4ed50426ce7085ff5ec9716f7393d604fb7387 +fe09bb5346a8cf2d054a7fd817e075e61961cdfcc9ff71d4651822ddc1fd05d0 +7d8a9d8d76da5391bd75ac047af65a351681baa87c9a6de0f1027cdf5266e68f +48a290aa2197ba3c66c575082319700a8527fe308c78cbb4d1e3a2543f9796dc +7105763fe7e57106179e22bf52aa25d472d6bffb0b906d24e788685b93211546 +0b97acf5adade19cd7cb6d9a5e7fe5012a3fa15e6e1b85648da877c1e3eadc9b +630d2b92f60189c1fc93a8d49b13c1b97714052b1976599f98dd697b9dd91a0a +06510ff600658fa9979cd633296db2a67a5d2d9c42fc530689167b7dce26ced0 +4d8a509f04a9cf65eba06ceac4c5e3644ca3280038626245666a2e0c19532c8c +720afd6d43b436a7ba1181ea34b3ac852481809ecebb4ded573b688e896ba021 +8a08eedf873e331fb7d57c2fb132c53f1fe70356eb0e8bc41368f966b3cb9272 +fb1f8e44c76f0b12c3bc79d848fbf93e55cd36eed1c09e800b2b8f53ab92d8d5 +2c6ef3fcdb64195f74eb7b8e7f2052affc111c48818d1e69fbbf38aad47e59e5 +45dbecd57c7c9a42007888fddd7dc740742d3ce06aa6370d8427a3924731ceb0 +6330390afe0853ab4646e48ccb5d49286ded1b38188a881c8af0808db19d39a4 +b3525226b5cdf3aa901217bef8a5392651e4fb4e8c1ef6dcb8faa406d7ba1d77 +4d13f87ff0c0064ff0fe0e3dcca2e79c124ec86ec13762b49208fc35bc0ffb92 +9b8a38465533f260166c6f488eddfa0be4b6d15b8b1b59acb4e8827655eccb02 +559e8b90b384d0f0115f7f44c7a6247f246500aad2fe475a6aba511a10d70650 +7e8035d4f83e33adac6e14fe40ecec89b632c06996f1d68e7a1655d69ac4f6fc +227aa5966547791a16d4416d785836b5a3724146a34324ec12a09cfd7519c05f +d395699da7086d56e701539e0363d71fd9b279027252c8ccfa7a3d25a41a9644 +7d4d92b7fad210143afb526389342e18b790671676367c6cb41c3417d75522f7 +2187d83b605bb6db3a695d6cca090cd353e23d0512c06e8810f0fbda1b19ea83 +ebbc1ffc7f90fdfd8ef644874a7468f121564c9b259ebc94ad0b69c83cca6e20 +11f4a698aa690893a2116e502e847f9b9990b5a4d3f533bfe5ee1b5436b2f692 +f6b5f6b779b4e59697ccd5c04e8c0464009c48bd105482773f873902bed5ca6c +b13a0d90c4ddb6ccc416b349ce7e2c8f91dc5219011ea6df871029ff22c7d10a +fc890880b9f13669c7a6a60da0f66e5474cc30ff1e12ab765aaed416318a8405 +15ac5c30d883903bc5c04fd20ed977e22482591a46c63ff11ccf18756c080377 +b4f72c4fd3b127700dfe7353adb29431a50ba9d0ccf764a450a9a57668095392 +d9f924832309bf16b8d17c0fe2e147b9afd086c605ed6998f9873b9136575722 +ea03bfe76571ddfe0c86a1b5ee8b3c0712a81b397b5e0e6068810b0ee52bc0cf +1ff6df62eafaca67e1f553316a7bcfeae787ac7bea86056fad39696b222e887c +b1aee0acb9e4093068661a6564292808535ca4c7b9271165c73eb89757db9438 +47e609ef5766f00c21cc5696a5872cf39ae59e79ae9b0854dd3b6ea7763f59ab +b4443fd1998d1c784d815b4c067c844d942f935123a0ccb76532f18572405458 +6eb065f20ca9f301fb04a0f05bbfdb167ed497dd191a06fd43c060fee5be2ffb +b804236bfcb6c81abfb5ddd864a61dca262b97c5db8332d049287c39e0fc8532 +91bd8e2731532d461bd22f4fe65603efbbd39715f38fd06fce91a0014e80e7dd +f80fb0f27dc96c6df12881a7c4f1c47b2c7b2cb7224960c44dc616fd8322efdf +1905121f598b6e0aef30353763662ea6687ba0414cdb45384a729d1e903c51cc +da599e566012592aa78c55e45808cbd9952c8c3b2f21d098370af67c2270f32e +1dfbea8d7fc0b88a491b4a0101ce1d74a10e27c2eebe19f361b2fa384fe946b7 +c9720e9ed02b59cbe30062e902fbd01930e66400d69c274ca8ea0ff6f7580cb4 +54d3c3206477f7b0dc20cb80055d470383d137d226be0f9a15374e0a0112b04e +f25db5ca9ee78fdf7fa7a8b3867f599a61e010d6ed3ec8b13e1439d3a231a099 +2179d4deaa4eefdbe467dd077fa49fc330f9e06a6aee7d102a3b55890e0aaad7 +e2276183ac7cd1259350ac2277e89bf452858d9418ed01a22919c9012daddc3f +ce9bd052032c7fd79148000277ec903093c227e52f19b959a99c7edf0689f4a1 +9d004980edd98997da23cc1ed63c1cc0f1e46340d3cfac421df31a95f032f297 +0c397915c5dbb92a8596896d1d114a0964926be4dc940e857c5a53cf8fdec3da +e2958089db083fcfcd3eb090282a7c978f3f58e93544c9173382031797bc2a44 +b5aa61adec96086af8ba5fca90dffc8d0f4d5a8a22013b2ea06675eed2641fc6 +03400edba05abcbf6a8afbd3c6319f23bde069c6721e7679610367ce47d40ff6 +9c018e23a85e2971e7136280bf42064fc33502e6c7375e328c32f03f05e1e3a7 +d35816e5862966a1efeae1eeac4a4c1a24cd89467bea5e9670da181fe333f795 +b6176f94702a496f8c4da01916dd5859f41fdca457ca50870929f49341d06392 +715d71e508f55416a59ebe5ba3c093fdadba2ac413b6238314e8eed5c7b353b8 +b09492a35309b3da82a8af47a2378c2e4ae452b5ba4d706ac27ca5107f98d4e9 +64300bcab484fdc8c9c967aedd2f351b54ae0ba150334ef42fe7d57eafbf1074 +cdafea5358e2239cfbe0abf635778065e433b9f1c17357e67f692f5e98641723 +24aa6a462c0334f2ef7bb30fef10929224ae0578fc49d68f7f48c91655371e99 +751c18e5f4c375a734404e533dff279c9a2692956957b07d11a72ce6c7ca64dc +8c90eca4cd037dbad39a5e6393ed0ff2855711dc7bd1f33f122eaac8fb2cd4af +ab6a00132c1300f152554b81a5e33e864f7baf93c2ae5d9feb5e2bca4f4b48f8 +c813c42accb8a9b1eea5a14f5f9795257d70d0910cb738a9d8d47146cdb5c837 +a74c0402493a3b3a849306cd997659088c8efeb0050758e1c2d8742f34350304 +8f80ca8cc9a9aedf8008579dd936b29e3f8495b61f0e416f7111124e95e9b0b4 +9c69063f46a9ef1f2ae58c57392ef498b1e0b9980f274d5d4504b47f03261e57 +2ce746715dd521d6d2d9ba1b570ec8de309778955e06f065a3d82ca42d0b8ccd +5e635b1165478acb9ba24f02e429731c315ef0a2cdaf185a142654aa9dcb56c5 +c82e44a81a57ba271000597a99f7111e25f7a4247d40287bb78478b07f2c220b +a4c43a1f1a87cefdd179447e9ea9cfa41aff4ad8d03eccda89819f0039637e64 +2a8f3de1b7182f4237c27429114ce1dd195f546b57ac964d59cb821b2261552b +c8498cdc5a76879dc4de1dfaf3dc15505c0d3b4cda3ccfdc1049a9a5c48fbcd8 +8b74208e6c99826053abf4c2b0973277ddfe6505bb9f77e8a84957e144516600 +73a0e3fcad8c597bde3faa249d2511f545c051ce6461e3c01411ce7945ea829f +d7f4ffd30ccdf757e7039df7deee4ef47a38b6f6f9f7af190b038e464ad3863d +20c2a06954a7f29a61cb9b7daa437bf06f8b6a34426e85c94c93b037098b9aec +5ffa37fbc51d19ecca38b26adce6704cffe57973a0090951da23385cbfcfee4e +4c1f040273247c1f9ef76d20381ef92c9f7bfe723e90e176a34990c19df2ba53 +b2d0a21f64d48d0f2198444c945084f568a04155292361de380eb864f8e5e452 +b37db08686546417a3b87dfd34686c1dba5aeb055d5841c30b1c8c1a182eccdb +876ec9c6a49e02e7b249d3da4061fb63a0342729a26838be79d6939fd0460f37 +fbf36c6a6a76c6a99478551b095c34df7d754a414ed5f0dd28a99519226be1b0 +da01e883e0d5b34e0f2a1a0d23ecac458f135173b7ab3f3c1d9441f8dcfb2c8a +bffbe97cca66b4a1a3924333ab8c79151393a21fa0a215577b808f76b31f5065 +43af482160fa036f80f8ac65fe25d9cd2963ca14ab51718caf8ae7d636fb442e +2e414ac7193fd67e408e86a034036f4a7d1a61557c11ecb9466a403e5b744427 +cf75d3be6081ad827b6db779da50626390603ca0f3adc54afac1febbdb78d6db +776a4fc4bf7e1d0edc29b39fd107dc5974d03fb34a84403ce3b2f603fd30703f +4d0e6c4fe5607dc36c530c88f6424c5ad080ed6b949e968be2b3d3cd9e719e62 +cce1dd547d54e39521e1028ee429689ea3bbab05e117fecdcb93ad8dcd04eddf +f5de8dbecdfbbba43a6f66cdbf3c81f572bb1d4568311224685e691cf31d5961 +768dd919a400b000e74bbefddbc6c9b83ea18c82839f55a3bd3d8b6b900460cb +b62526b4980837609d173a5870465d334de87bd11eedbc2f400c687e2003d74e +605733410e790c0fb5a28c57325916a11f92ee2b9c4124001af738fcb6e6c588 +d75fd336e5b30da46d805767468fcec686284c953049f3d83dfc986fab43eb93 +bccb55c9c0304300f81602a9b9d8c2233baf519c7d72d11a55a2b7260f763437 +cdccdea198ca7cecfd9b5eb79da4772e711c74138a778d6a120fc530fa5ad085 +387a944223ad6cf9a621052e33fa3b64f60871dab95423565d806a64c00b6ed7 +375ef1aeaa10ba8f0843020e3fccdd5a830d79039544981d55b59fc6f2a799ee +124640d4195d9db251984dcd0a0343c52f78904b9c688d2dad4260e7d4967517 +194c29b9313ee2c54939c329da64d5920d26a0c9718de120e577d92af78b8a71 +32180c1acb34d07b0846a34fd494078c06f3911a0bb4348825c3b5a0ea559449 +7ca555e36caea15dd36f778d8bace7f154f8a73535a845a9b3c97ab136eb96fc +276bcb17ee7f191e8441dc025b272c59d4f454278a75f64925e441e40ff9435d +a012b8f2a7686f6128346a5dda941dc2c5b7e8792ea8379aa91c38babc76bab7 +397661c8bc3162de6290736ba23fce40cb1c3827d0c65b19a9a23ce1b5b9cdfa +60a7f0742a4ed69ee7e8d2dc8857cea1af870f7998e6fabedd3cf197130cad2e +7c6d6bd75c1d24aede7d6e0160c67e138770e8ad4ee8822a8782cdf9e5e45424 +7ba28985a01dce99818c05f187e431d62e107b61543a83ee1f040d6e46b36a5f +223a0a35418c9d328c5ce67bfdde69edc88c13995d52c93483abea8c80e083d5 +a384b35c8d2f87deef4048290b34bf3dec299d16f37e1baf0b620a72acaa04d5 +fe4731f88411c7bb53c4768f85ddfdfed7e7696ab17922606163852d79e8bcea +e6c9d902108c24b4d83b5f325eef14c818bab38587b75532b9d38edee82204e8 +20f956e4f87cc7d033d68cb0017a79638e2360c4ff07a81706109beca9258c7c +a60d52f07d102fdaf3cffb1ad14b999234d302fbbe7d3af784bd5fd9d1dacf05 +5b192654b7febf7f71d88277b3990af63a98520f27f65758bd9b2e5c1fb4f940 +b87ad3da4c96f4e1d38e5a7ace307c73e82d7b17c878fc55c33a3699fad5f841 +f9e9d17d92a4216543db45e9f92ac8f36cf01f220e295e1dae16cb50986ab0df +cf7c6785742bc5e04086de192efe19fbb871932c8d992b763b226bf4f054ea42 +8ed3f6a580bb12a1a93e367a505ebad742ed63d4a9ef7c4da3a8f6eb55eb8cbe +dd59afaad1e24a8b87c17f3a9c245dc4a30dfd8b0eb424d94266d61e2f47addc +0a52fa4db7bdb7431e5f80604e95e4091aacc7bcea215e75a7eea59642ac0495 +6c08128c27c59089db3fd75f1fc8043d9636f4c0e3a29e2aa5f726d37876e6e9 +de7e578926359f3cb67ebc2e678267799cfd41f29de2cacca067715e79415fb5 +a5c06eaec36e4cd8d5c818312ffac88ccccad7fe46dafc3270ffcdd78c52f205 +04368ac9f622c1cb7ba8fc968378cf54cb42ebc9330062a9e9dcc466b674a9f7 +c455f575c1840535782c9f4106a47d5695a13f6fce147dae42e1b05784d0b66a +a0c3a36afb3b58469be79bf5887c606490c7f9bc66aa9eb06aae67bc3f6b2c6e +b1abafb3e128ddbd0985505adf6fdb4f85c84c6a2177e9871488885682125b3f +d7ec6d50dc6886a867e87122502d7a5ec8101d81150b7a7c7836ebedde05b5e3 +a2b6afec021c3edbe2911bc8ec445638bae593b0443e3407e3218d59eb85a34a +aa02d5b860324f28b7e8461cbb576fa71515af67c0f061ea0426f9b055f87066 +cfc94c2594cc55caf2be5dde04c6f36cf3261a6f9ab826134c9c56e6c9f76a9a +c88734a060a0ea4463ac6ceb6a1c782dcc199be95860539cbb7b2ce5fc5503d7 +51f0a495337b94fc7118f7101b837651776ec0d40f1c61b57d7e7e16a0e410cf +da4b0dff5728fee5922640e5faeed1e0d6b1e8b87c87e72feb3bd2a7ab8beef2 +c6ede873609fac5274bc1620fef65c7a9b52f8ed233fcea62d37f606d79699d5 +81bd29d2401feb3a9c32a34f15d0ff1ab299abeb05fd27cd6d26d8dbfd91fe3d +dc8dfb290df7a58b72dacb7c24b4067dca4197f298c43ee8f9cea520c2055cd6 +0bcc95e3feabe7e6aa0abbd41dbf4a26c69bfd5c7926c5d4ce1e3c30b3165514 +5258db44055b68401326873a05ab30f645417706cc3fa6522098cf253a851e93 +92574758249035e3ec5e7b3a03f81532d871cbdf738e66261f51b094c5e3e8f9 +480f68e8f26f68348ab9afbd19a49653cce7ffffe8911ad8eb2761696a0c4eab +39e268e261003e4cd0cb15fb36375ff4b2c39bd45710ed4396c1d89563ef8b6a +4e86a73b8d36465b37cd5a50af5f8cf613e7c5fb9db895c6c9827a6e2b1e681f +461dd52b5719b4d048dc63e47fa3aca8c8441376318be1358250f676bb9c4f8a +982d971649a6e687c43b3861050bf5d846c24ce2fdda4917077b1cc4109bd764 +c650199f51dbd309877c268e750230d507e1140caeb2cdfbe1a03ee1d0f4906a +645c9a378691eadadf8b1f291e32448f930e74133183379208b442988ae5da75 +22cfd3cc728a5dfa50dc4a708f25cb851fc94f5d82ebb37b08ea28b43a882d85 +b4d454ed11ab74d0ed50536577807e736fc6cb07a890537ca45e15b3beaf1c98 +07941b3a172e85c4fd7dc90195200036d413cd408eaaa640659e9826d9ba553e +215ecaf8680b04cefe02fb8c0642c028f530815b2d2e4dfbc600852a7412b963 +bcfa31432a96e066ed29ff731b75dbbc801442f521ea3f4306cfe0333b4efb06 +840a81f213bc075b113050e6ecf2c18163f3329898e167e36729340f0cf89d20 +b34019ad3e8183ea5f666cb5387ec8ca8a6ad62b93f3554fd43b6b1a21dac8c1 +75299570f4aeb3c51b6bc7cc3cb80d0d2789e99625a37396aeef59bb3c661761 +47e02c3fb22c4199da98552807fc8ab9457ce81ff4ea010a36b0e319f1e98bbe +a63056668a65b1822cb57a82551b1ab33fce67bc20cbd56e559bce3c2bdbdde3 +ef5d1f232eca045018b639b7378fa773c7486db53e1947bbd02f827a7e19883c +078778e5bc7697a9e474804eb33c2af722dcaed37cd14e8ce92d093b83335eb1 +a25a6d99c7e286941d682ab64f098e93a252f959ba4e9c3ae26dfe3ff8a1a3e9 +b78e85efab7f67e5eb32d1f517d62d35563092598b0748b26c9567801223e93f +adad3cc790b8029939db16ced7889de68a1767f700be22433b7494a079d6c85d +b3816641d6ff42b5a99e575161254ce929120b78f489a76ca4f3b2f1ff4eae62 +16c08518955fe8e4e8efa4cf3dcbdbf512fc6be7329bc046d61acbc6b19540b2 +52ad79177053337ec4fc094c977cfc6eb036b5059e14b7f92782299a40c88209 +f7021f3d155b2fc306e7edcc98f9e93a6593caf8b4e5561af4088ac9c2ece955 +1b15f8b538d7f41731dc09acc707f08bd8a59d92d7d7eaf5764bdb7c5e85547a +32743157dfeeaf3f7df8192a0da2cef45e1ff911d66cbfe005170cfb933d8bb5 +85d93708c87e51efb522944e2df9fcfac13ec7079e1af32d03e233af8ea6604d +4d906af71dfd8abee459fdeef767a385b15d0e677b5034c1bc91f047b46f300b +db6092c34dbff505b0897ca086377772ecb27b9ac70019cac5333d10b67b5b71 +482f241a91fda05af2a4abdb351c42672b580a25f01b79b8fede4c01051eb115 +c64485e3ba4fd9478f9172d6cd73198c318c9db59f71ad709b9d567b4e31e2c2 +8d0b93a1d24c82b50f01a070a952a079e1e7f9c2eb4bac979388d99a25577f93 +57d9179078aa0d2f7a8a65d58b8741244e3684285dda86cf3808e68b48accaa9 +5b3a91fa39542cd3c80bc5fb5d636ca5ecf506fe1e4e645705bdb10f9fc67a56 +7597dc5c9a1adc7b47c404c06ef16daa37d8fe6c952e06d056dd15008ad2e796 +15858275270c5804432e91c7adb467102e1e7ed962f04f3f6d39c6fbfcd93f21 +d11016f5e65e9945c1442ac63b535196d65cd3990d94128f3701fc32d1079668 +12749bfd5c15d965c3174221882914a1fab5495b5fd0d7a7fe3b11935c3aa6fc +470ab52a32c9a9fd1ddbe800b60f3f24d9d9147fa86d0a0925d7140b5a04a493 +f3ad02d6c352a1f6ebf7ae326f6ee88d7701ee907c88728150e0a2c214b13f12 +e7d5d83efd62cfaabe68f02fc23332703c02daf224cab53c624dba61b5ebf164 +0205dec482b3a52443d207a11d4b4ecbef3dbcf17d48759e7e1d69108b4cd456 +d263d15d719f5230cdcabe96dc49df253b44aa047fcef75ddf931cbd6f3a2a52 +c23eeef852c1729e23e3bee93b0a5085913f64b7c3dc650432ef005301062a5c +90c400852a7412b963bcd035e6942cc8ebba9a1e3d3353b26769ada213428979 +78a9f549a86210d53598cc1da57b8a7490ed6b8368cfff93578f979d16c8819c +80dd050fc4aa8ccb4f7b2681245451d0d13403841da091442013a6c5609c7d68 +da409a41e4d90f36d0acd74368bdaa75e618883eac528cd6cafd20754cea601b +33b0a58b33669ef561745830793f5a06e72c0c8718d24de9f64af17c50beb1f8 +cde6ed0ddc136eac0fa98d9f0ab9bab94d18d86a7907c2bbc50d69d07e3fa905 +68145b3c0acf303db053c8a0cf1d7619a215f6753f804c6739ca8c1017f553f6 +48d857f926d74d15812215b7fd87333b8f00e65c81fdbc856f1323a342bd0507 +be91b5c365d7f895e9c374a9b8e0d1413220403e4b5bcbfe5a5977640249a233 +fea8f1d22ac9f6e506801c4a68e9f8108af7ec2aec0ebefda8d1ea7851c0b226 +b3b8a76d93736c746a351ac265d9de903de0028a2013af8aafeafbaa8c2d1d54 +523925d4d606b13bd04f0e41fbeffae0f00d89c83366a1ee1e5bc0c18ddd134a +ad7c32a0a25b921b33d91846fe945d785888091c558e3cbdeb761922386ca63a +3ad37a2fae3f575e40d1223b416c798bc3732c6dff964b29a02714911858f156 +9c87d427f5087455da19f24eb75712692f3693f1d2ea5b3f40e9f9eeb0f0f8a3 +d00a0959ca4e3bfe8c4804a429ddee8d842c8de8312610e2cca9cd33c51a5145 +e7f8c8b97df06a0a023a43db46268c5bb2247df3993dd4536837eabd9c0d381d +da84bc4ee58e730442cbd7966e070d8be71a0b24b871027bb3d586d8cc2d6fdc +917ffb3e85d5f32acebd3093e53c83bfe41242307d774cb3ebad79ceacefd887 +57a0ed1ec8adf7cf1952411601ed59f4c4be8ddec78dd26a10c083f6f04fd83c +705ed42a0891a5398169c528f7911cfc467cc6df8bd5c835494aa1a7c5bcb836 +40e6c78e60c19dfce997ed6e0dfc88fc01b0349e0455d4f22c06c16f7b9ed61d +9ab3d5a4f6e2fa2ef4628431cedf579db02dcc30a54d6c10392ee4480af0998a +b823cd0f9484c3579e90dc412967faecfa026bf654602f3bf6b7a6ec54350be1 +c836493fc0ded9384aa53b770cc0f008329765ab5bbb896c3bc12d21f37733e8 +7c7258778a68ae72133f40defc3a817a72c8cdfb2c2614bb84fdd568d51066b5 +5d9b4dfaeab9dc73b2d489cc1cd29461be050cc6e72b15bc7fdabae2b7792d34 +427ac97a386e31161bed431328c0ff34725192b95bf911814a98e09faa5620a4 +0af40530e9aa937d32facab765ab6efbded9066b7c6a031db5b0f34826719622 +ce9203e7396fea2e7d5cb567236ba11607ec8579e01d0741a5dafc86a49a3ff2 +c1898d961bedbabc3bfec4a4dc1ff565ab27805c0f27dbd4db1184ac8d13a66a +03f3477e9303aabbe2e8f009506fa8e03e14c9cddac07b991db50356f7fb7a09 +86fa0dba919eecb006dbf46b9770c52bf38c992c1cfdf487bee675464fb41020 +70cbcd98348f290bc9f8064271899314f5d53cef33351b85a9b2782d891f4fe4 +f0dae67dd58fd46c7d2e3451ef0e7ff93c38e92685ef30660a8140aed73a239f +1adb9547e33369457d849e1417363508961ff097241ceeb0bea7a1b8e350f680 +f5194175b51793efe0ae38a9b930473ec836c99e8c9fc220700f0f6577b77fc4 +5d69bcf32455d506629cf1b15af57f244eef2bb5b824957ced172fd621618fe4 +394a3b3f1a72836c4dceabae9190c3de48bcc34945bf21c468308590e4912896 +4f331cf48a1764a4f828cdb11fd36fbd2cf546afd8cb3ecedd7c0b9ea5bb0d82 +8bf269ecc868a9dbae49cd5173b30d568ded26e6c229b09868ccca377bb5878a +390e48cb3d4d596e167fb5af544d01a429280fbce6caeed0df852406611e3f67 +b1e07a92c58e9887f39aa3b65df90f27a2f9ad203ef4923009a69cca234dd41a +abaf30cca6b13d77e38626a228b59dee4c20279ddd3fb7e47f3630c69ce918eb +0af51da83358654b2b28c0bef8ddd7a22261f873010e35adb40f63bd5f6febd3 +50e44cea34928aab9cbae1e6ef35e713eef769ea2e06f1005235b567cff130d0 +8b6dc201eb476bad95426e3c9a7df4a803ae01b5ba4a764dac131bd273f17e48 +c1b0bb228d5c9ad4c39262c4ff6d98547fecafdae4ec0cfb0c04dfe7982490ee +82ebe0e712cac8b2ad4161c88602e87c68c7254fc019cbd98d1deeb991962910 +d44a6e8d11c2afdf94f140f4a94958b0189dec2fb7dfd7ce510210cd76a88254 +b832de6879983ebbdad0220c8c4d5f7c37a55a125ee681abae550575100e3cff +f5ffb4e64a8d0b2e7bcd2d6d016c598c6baed2951e4e5110be8b5f4c95ec5583 +44cdbfe4d78f21b0bbf5562a9325fc8c75dda43d30c33c3902821b9a6041483d +3f4346ab4b036e583674418db32c71d2a511103c105490b6fa774b61b7e03216 +a466960ac2db48d0826034e4eb74f2a95e735d9a2a048e4eb159e7d6702c28dd +3a1d5a390e4d69e0da121673719173ffb31fbca5b59b86f9d65edaacd36d5e30 +bf872cb7977a3894802498d20d656d9d9ba7c997450b2a3f0ea6017ffb5c2a9e +dd4a6a415c6c6bea9497313478da8630a9417a3a77ef6d1df9aa2ca014eaef96 +8ee377fc0b90c42a64486c4145044c72082e76fd9620d2335c27f87e169f7f9f +b4962e06d98165ab1017436ccc68830ef42c904ff8d738ee2793526d476dcf19 +b51db620fafb84cc7b2188a293f0f7669f48e1d6ae0d12997432f67580c4e36e +5ebd336638c50ec777965083dd485be6f550f9392441e53a78068e7057a8495f +25406380eec1548fdbcc215d2417ed3a1a2db029f9ced3c0497c042921c72b8c +566fb204a2f3adc54a88957260553c33301bdcec98b8797e1ed36d21a22686de +2bde225886c16ec5d132ac0e543093e66568332aef3bb15f85cd442a8245bab7 +681458364ebeac7758c2c4b1e0f6c9e10e5c1149cbe99651944c29f042483440 +af0f3c88e181722940dc1a8a772d99f2dc495c97367126b14053de51a03a7907 +a725b1dec299588f81bb1992ebd9db972aac396c47fd229fac4becd1707ddf8e +8733e447b03c1a671dc33557daef6c83be6fab0cccdc1eea095e9996131eae50 +cc9831922dec49ceac282b5e1c0542a01a71bfc28e91bbfbb3198d33901162d0 +4285a62e07f82b95d0e0db1cd8bd664f1a6603687705936a87269ed00616b505 +dfaa558c8be45f0425469904d42239b24d4ecba5efe9b29998a30ffa6722fa47 +5c5c63027d3349ff581f3cd71c9e948b419489485639c46ee6a62eecd082d89d +639ca2a26d58fb3789e2dc853c4b6adaee2a45eda123a1620204ea143d2926e7 +049dfe2de7e1b4d14dcd6ad90dcf1fe26413ecda2008dea0d7b7409b5aab672c +40c71aaf8536602406bbdf5ba17970341c90e60db0f8239f5190f0a46ba0993f +f0ba8eaf9c45f1ceda81d521fd353072b694334473fcf3982b147d22911a76a1 +162fee53f301906e20938bf6f38e0886b9d340fd23497c52edd2b9319e9b40ce +1e87a94353d01be656952db686e4fd9d22c0583d7c6569e46445c01d06ea3cc2 +6a564f0abaad453d006cf3e868e2bb4e23aa6a93542b0c4e06d839bccbb64470 +e689f85aae9034fe57c583a30090535a89c22fa8336ce9cae3855b6f3c80f1ca +67db3c3d9193747dd24fe745496c12d951180e7a24bec0cf5a5ffba06b925895 +e2463e2046eafa6986b7299507002ce55df328059434a08817f76e1c0c6fe864 +c5d39048e042b01e35a86b322ccb2656474f2a0afbc1aae14543e72548dc927b +d1fb32f689da15497868e14ab927ee6efbf2c1c16bfcf698b77b190b57ad5f48 +8734baad1e836f0348458139a4fffc8f9334552de099ee80c11e84697389c795 +93177a0e179949738c19d83b36986a769ce821736a3f2f69ec82b7e19c2f25db +aa99e888592bd478b2cda54403af0786702badd1cb8e7af2cf44d98d142fa824 +9364b1e82c0bdfe255739c7aa1486de001ff336bd84d58d845dc77e573092b54 +9b2eb4d4309d113be1cc36c3e3a1a8fe6ba813e147c0ff6be1358865383a3b4e +e242bdcdd2c4916d1eb595b6a6ffcc1532a60463f8e0670b96dedb7540a0233f +a05467deac20d5544fc026e83c80fcd3b4a227598a2b320418cb2b37f132f68c +048cc26f58904d1f6d0bcc4c668843a86e81fee25383a35514c6b18a0ecb0b81 +514d937fd90e3b70f3cb83a8d06a9bdeadad9763a34098a306a7d38da2e2a32f +fc202db1b3cecd7a99d4d778287d34a1e5ddd3f6aeca5ddd730facc26899f838 +06dec4d2a4db94abdbdf46b10b4f2d11b3c94a8686d210c350759d479d995a9d +33fd660b16c4ab555dbc247cb559d6072f44491b32423ae4eeb761e271f304b4 +dfcbaa03cbb1833c822085dc6d6aeeb436e24bc0639e5cd4de306a7301f3c077 +2dbd3289cc3fb7822f52b450641a345750ebbad08437bf23331bbd6ea4e210bf +b81fefd3d410330fa1d2ce93a534b3772f4bce4bf5335881371940a8bb302e89 +6d5043f5c69babca785c3984ce2ae8128d861ad78270ff78b7dd3678f4a9ddb4 +c6d4442d0780dabd78e652c2f30bb993f28c669fe05b9eae576c44d9a17ddec5 +6f49682da228f917c955fd75194d0361a30549f677c8d4df6c215281218227dd +b5893844ded6a908dfefa52d3c80a46f92701b8e41ccf0ce82195cb1584dfe0f +ae4f282c2f0702f93f9f73bad96b899ab06604d48fecb0f4c7436dabd184d62f +f3f35cea68bbaebaa8473f6278321982e1bccca10dc064c463e02a4529d9047d +da5b65ad3fc13009db932c0ccabf8318e4309516c19375ba41440c70028f1773 +f4aec7ccfa41b60db4a624a735d27977642fd8a9061195104d8ec81f0c2a5534 +45b3775e1fe556db12e0b2785f3e55ca8b8f8bf47bbfb555d0cc2c4d2ed879f5 +4f4efff486b3f21a12f89228b2254c937a7f6b4cf97452063194ff23485bd3f4 +c106a3bcba156b42e806e6238c39a0ae0d06557ef260df0dd1bd149caa76fc4f +b12b7f2188e627afe0890f16d8a5685d5feb9ae8f0031f165f63b5df63f65aeb +2ef56f80362ca765f6e24056b6f0f93491f6d8dd1d90d7d4237158ce11fa3102 +b40fe936dd641afc1d60891acc80967b02ed9d83a464be8e07b2f80d65e3926b +ed7a2075d5140f321b8dfebcc4d808d09f80311996e7822483ad59a870bf8f17 +9b376d66cb785fb5135dc1351432370fa4060345ad5b69c7ffda0f2497c8c12c +e10396ac141575a04a9a409d4903cf36cbf6602e09d0823f9498d19fea36330e +bfa209fb096c09b1e2fc8491c0124246be6e1d4ad452e43e91b30d938b6e7e49 +9439ae5c62f36ebae128821bb90753000bc9db92ea04ff6c7e34343348a57af7 +90fcdb72efb25a14a687df7dc3b76eef16f96c649611b79d640516a2f9e81874 +c539df496f9a9c14c1ee4012f41c37c3a3f2189d91ff8570899c8c2e07017bef +8d2ee37c6588f896914bcfb8d551bb15fda56c856e08b830956a01a444a8d2f6 +72b6f8ebee46542bf7a9f5a6c9c84418f840a01acc612c65231ae2f4794ff8d3 +c97c4cf224c3d0c26355a424cac0f2d17a056d203b523e03c60c4ef8a715a3f9 +5d879a4f344e371af8c675ccf394957fac75e2c039ce7708a6c7f5b46ce6e34f +4df11daafa6491a63a46b495805896acfe5034d037152c41d9997a02ba58010d +c338b23f185b3e4e3ba1fd1c8284f904a112475a08d3b23a92213e7ce51efec6 +297850850c99b5aa0bb31c15c7fdc4aaa7564c0dd664d334a17fad333927a616 +21bd7ba42819171e14abe2410455ae42b2a0fe9db7693ed36ebdb6305da51a5c +7cab74a7d6669bbb23da061c5d641997b3d0e55d06ac1a41d17ac326b874b450 +88881784220f0829ac2077e09bfe9579b078f08c250f94931824ad8157402a49 +45847593275ff352dbe59296c2b0fc96a2ed97dc6f79b23e3796dbb309145e1a +aadcbe232de323bc2a55b7af043c39dd4113d560558677e8a202229b3ced466d +e37abdb7473b21261cf96e2a2affbf7c6dbb3622de6661a90bad85825009ef2c +ca808bddceda30a3ca8aec87f960fa7c85f215b393e11e09b48db55f01cd0a9a +aa33a40ec2dcd70df052bba543d2c22c9e93b384bff9055b426b1cecd5f90ac9 +574dbef0f9f43d7005b2a9be95113db7b12520811d99df5e4e979a5adf762bfc +5d0d4c3c8150715b7f319d35875a7adeb182c37521ee80d994054e902cad0489 +9176a8953d4b6e28f541d608ce5e3bde32099520fe617e9bc9496df113a43d90 +7e1b212d24535290ef66c9833a23fa7a66e7fa11462bd210456b6edbc16ccfc1 +70c322b65330f4251d6bdeea11a8a0e58b2d438d7f844b2216aa53354464eeb0 +77a06fbfb0b72f8ee1f0bab6d0c6b27f94965bbd6260c70dff6c08d4edbbc4cd +5a8adc974b690fdb53b51ce295e6b2b40c784651c0e78ea6b33c567568d1ab87 +193d2feb76ec18f4f6394fa5508ec4d6f871101e26c122b7fe132cff7f115e1e +22b3eabff49bd9deec3fe09317e00639fcf82f835e6ce7ca9a65e294e869e700 +1c85a71e1b3cc1a4b9716a4a2dfab2986cac085e176dcb45091a01ce61dac2ca +b5306da956147fac8a3bc131f0d8f31953813f52748e70b4c8d94a82c17d83d1 +a8046f80956defe12693eda56512d6d29095bb1d42e36466f6fd2b7ba7c70bbf +123d753593f2b6373bd74d40e00d59b2be8ea60438e42818821515c417e69bbe +c457abc9204f0a8ddebb88c44be364b358e2dfd117072f125c71bee9801801e8 +ff5ba5b44b0115ffa676f3bb99aaec050641fd9f5b6bb095a682b52c64ce6a75 +bca3587e2ee13f2ee022fc905b3babe03f154684ff226990c2ca27ec57100cb7 +dfed37c5f5d52882eeaa64357be3c9ed5605380445bdf2bbe0dc4fd5af17a3ed +784a20539621e6e1b889e75aaedcec08db740396cb01aa753130f4b0118e50a9 +dc10da6a1059f331df49a25e98103e09473304e099d8578f2387098e380ae9fc +f91f9ea36c0d900aacf7fa9dc3ce29b984e1fab13532aa4cf1e19a37c6b4f78e +da75b81069ba80e1ed4ef2b9b5084e5e1dcb8f01e7da8ebf491ec5924a51294b +81019480bafb622cfe2e500739bf8f4754e7e3e85e04d4932a71cfddb8d3b6cd +0bc90bb7b839be6d8c052d1f0d93c833811b452403874b2a5ee226631207b6e6 +6492248559db1ce609e516e659d6107378a2e6d51021473fca2f1b87dab66d98 +39f607dc5eb0c03df892baaed0345514570988eb4895e7765c5bc42d1e76fee6 +b05bf0c77abaa0d7c5d6dbf2f7e039f04f9bf3b9a71ec0ed91e3a00f725bb1f0 +c74deed454f903d2c96cf70a92a048b05bbb624c091e3181c607ddc2477ea47f +e76824c0af0092a62aa367448a10fbb6355354c5ac0737c69a4d641fb3f2d80f +11f64eb4366df7060b4e849261faec37ff325e7f583ba04ad4fb37d6cdfa99b3 +0d73c662d1ebb1af64a2ed168dfaf80fdc284dde297efef48134cd6483dc1bc8 +e46b1c3c45fd5d4bcef85d9772000144ec49dedb9cf161792333104e50a27b2f +1add3398c121814015c92096fd6d3b1352cd41d2eda7f3729d45c1d288b0f560 +17059816840217f1ffeef482ae49ca6b376a5548b0edc9018cae5eb6b1c33c41 +03642f744cffbce7898e525b1e8ebdf8cdc7645516fdb1eba4cef73d18fbf4af +3517a140b206119a0d1dcac28577aa115ac29be7de2f9ed1f679034929c48870 +a6d50c8fa1779560b1f5b760450db3b8b350ca3b2890d04d3b33f19aecedf0d1 +ac01c613d992b423891f9ed878c8840937ede7d8a1d62fee5f92826620d801ec +3c3edfba8445cc52e5f83e01ad27abf5c205eb022ae6833c2aae6dd550da4a97 +f10a7e363afc6d53a274c0fe41b83c171785880b637434b2c8c4348615bc9259 +8d8508c412d17099971aab2bf372b96b0b14ad90670ad976714d000373380258 +4b6462644a34bfa6f5b746fc0db76690d52b2229f7c79172184fadf2b5a9983c +573dc0f5c11aa85ba845f6e4f5836e95636c8cadafa8671b2632c84e3d94ef2b +ac6565267518e2f747127c6f7b13b4aa888a5ee3869119ece0b2b447a5343edb +f0996b80d9437e62546b137e22735347a684af93cfe80ec102a50516092cbc03 +b0e52d5e10b06e447c118fe2bcafd3ba6babed083ab7d423e7bc5c862cc06dde +56801534f09260d1f246d070f094f57219407e92769952925bbd0cfa29a523b8 +fd3ab5b278b2a2f12c89e6ed1dc2bcc4ba69e6452869b246596f71a310af0867 +c9aafc6af2c88f1edea2ac2dea51e8fbd72eeb0893a18706e16ce17a8ac44545 +ac68951c0f284b0149b71d924330201362ebbf72dd8e5a8a986fbeed97e5ad11 +cc913858ede949d8f732f742b0d73ce9c8239c077ac9d24a80c03c0a7daae558 +f17d2310822d33918f75aa835b5b4f9fb61730fba8c55441218fec3c4d1f54ef +708a05f6fcd38a51d287cfbc58d92e5f3793da39c0f55eb9fc03b658567e7474 +557de727bde7afeacb94c90d0b38b5e9f9b19a14d7c73e066eb556eb6ce393d8 +fa956f4b75f6aa4701d03360f1f354e1bcee9b167cace1605718f337dccf8cb4 +57c3ac8e3b5b730c60aee2e685a80ff8ecffbc005dfc5f11c5e338fa20ca3a43 +9154621626157e9efbc0b390b143ae736dba62723c99f5efaaa02a090b8aba16 +1b712e55d50a2a6bfc06b5eb32ddee1ddea7bda2f176f0f1c533810137262a59 +f8b14ec3b0349ec36bd0b8bae99368d21c4dc0c902e92dd73231b03a91275edd +9250f14fff4457350c747938f2cd6170e6b8713f439ac4e116e70f00bdf5555a +99a7162b703b45e92f8e77b50e85373f073b6907f95839c6f6dd306aede407d8 +642113e1bf2be60a5ec8a64431cb46f882d2df7eaed39c326c26327513b3a647 +9ce800635106cd90cd7f0083d2de423a5b9e5d63c49643d3e220aefb899f491d +28a30c49abdd19ec4bf66677e8bde6e43e222a097398ed2a9e9933a1d5ca87e9 +cc6cffda1deb6d13806c2fc82c4b32dca80dda4e3945c6589e9110ac91681603 +c4bf11c9d5510fb8d4de96ce3177297b692464776d9c07a1116b6369204df7ec +4592550563d3212b50bafad065887b3c369a7810f98bd521be06a3b4b997a6d5 +e0c5ad7ad8aae5275f400d86a6f09f1bff38d9d7220fcf688212eeebb8712f1d +74ce4985615a59c89354c1fc0975caaff671151a561edcc2017b0de504974190 +49c53f1f17162afacce065f1300cc2571a0f9dba7d21d8488372d386c41a9fec +bd1c7def33329827cc99c7eeb7e5b91607849173f68ce09a2aff09c94145aaa2 +76cce38832aed1a437e8206426ca41f49c9e45b6f581faa8afc3b47869d5762b +793b8d5fb6f0ac9c391d49424528ea39f635185bb7192f87b72acad339471ebb +decd039457a71837c2f543652284f1f40f82c38740c2ee36b45d620f004246e6 +d73f8777ba26c7a7e3a2413fae9b7dd37553169c7209790f14cc03c08d0bfa05 +6e72e0184d32cf070f685ee4507b79b21b353c6f228aa087ff469b69b1171567 +88fc37c39977e09d1c46456f1568628844a542736eb0ddf3fe3d134b7e78e87d +b126702e8ec60839b53c363090f698c5c11643a1bb63ef2d2f159872efc68ae9 +a96666fc8ce25cc0e2b47fc82f5f25f7b6a732901cc6d4295bec66132cb3f175 +42cbb4d4ffed7156beef36446452cf2992e8d9ba3735269ed51ff32f8c915b8a +f0050d9a1136e352d4eca8ef9ea6c1978fe689c8c563b8faaa1128625d9e91fa +d173c8e2b7f94f520098dddf4483b12abad73e2303098ec46b603b08f34f2bc0 +8ad44e897c2ab11148728f4de8f0390ffd947bc424f0f0f1ba80a107ad2e00d0 +ff4e76ed5b305b72b72a07e43f98093e032088c52c07e3f77d4a2d417f141512 +43d996cb0867a056befb66f052e1b65b37d2eec54a802e570c8b32554b794392 +3280107fb91a91d5adb4adeaac86a422717603de317a563251073bc740f10928 +1df7669744f5fb89e3f460bf820cf006c75231e979fe162fee64786c144a19fa +7ceb1da2096076fa0dadc7bd1522014288aa2fc96baab5078db3de94807f3af7 +854cc320e9f70da4efa02d38fa65c15801475207a09d254a1bba489b78a8214d +cfd4da769a8ae060fb4eda4b51d780928bd6315bd293f6c6b0f3e4a593464f0c +55ce0c1120b2099da0250d04f792b2270db2d7c606bf80e7a56062181f7da864 +a42e97863ec70187b6620559b29207c549366172c55d7f665952c8057a4f2152 +a69f772b065d414e65f57719a99cdbb57872a86de9fcca4dc7aa32b666d474e3 +d20508d06f0cf028521ad7d46e9c25a40d1390ee271d2ba5ddbaf7bf64585c3b +a859a2f3ab88e58f72a1485a33c419187fde432b697809da526477341d7433ed +f38e1ff4fe51920404138ec6403df7562e4443ea091c620a13603ed0388b88e3 +671f7436193eaad4cf55ace6d04b79f0389ce28a1eb223b24a9f8c92b4f5ca3c +0bea3ec00a555756676d77de2a38e35375b82c5192001446c8517818f18be439 +6c900f7e1587969d9bf8a9fb5595bf055222951c2b0392fc387c258c8cef50be +7696d9360b0f2d4095e52388b395a10096769586c03fc96a69615b92b9e4d3bc +275229ea8df5c72ba0fcc67bf8c1b2708bbe298cf75d1a97d452d51743d457ad +7d25ea5484500f4b086bdd81351f71885845fdf5e9129e8b0833259146dcd34a +3547c21e093a4fae7469620a88a126e0d025d3e50103f66357e2e05985feeb5d +4a9adb2db82460076845e54c083a2874aa56c5b95253a1e8cf8f1e35448577fb +8147f62f33c968151352488feb6fa978676c9f274d6b11f7fb65fd39bcd7dcce +7846008370dbc907341269f7d1c355d087fb176fe06836511cd9b01addccf580 +f68010958b8196f50277dd16f3039a9aa70411fd94d1b145b3ae34d5304e6c4b +02fa4b80f3693cb6b16a70dfe06c132438e0e56c4fe504e1923196a58e04034d +6cb67335f4218b857cdcdc928f3cc436c63f10ae872b93788b9a84b546c3f504 +7bbb0d419d7882dd1f7bfa5fe8a1d1c671ff3f56b50160cf4c23e8bd55111d03 +eaa7ff86ce5762687b6136f5728db1b9a1b914c7e2fce70c2da513594a989437 +ca8eb6792445ff806e502d238984d278a81d89b22864ddb0da2e49658657cfdc +6214a570113a00e55812ccba870feb01f397f010a0377a34fbc8b052084e3d75 +5e0bdcffcb26045c428d8de34af04aa8b7a5031892935c16918f0ab2db811533 +545d35799195310e5b109688830bda180f096fc5dd2f2cd98801466cd44a2b50 +68e54fc80d1d80c9f875b7e75860cb406e83132f5cd0813757d75b5bca06c62a +fdb7f0d55e94cc9a223c0f9eaa30c0a5c13ea0fb857fa703f2844d829418ae2b +968dee2aa785c07ddf773e30bd42ee89df6618796171c58ef11f6570d21b89ad +55e4ba58fffd7f112dbde6afb5c5cbe7d73b69b5a25003394ab6e0d5302ba575 +51ec63112e038b79f6b9632012ab775ae978f4d94ffa70e5d095a8fa0fcaae76 +18fa4fa41df5e34e7483c278d4470abafca5c110f1cbdc1e9e10fe169342a2e3 +6ea635ecf0f5ba7ac1fe1d11f661e825191ada43218eee5f5aadc42436c98789 +e7692be875ce211a94409ca6fa9b2bc1d67ee0e375b83b62feb2671b75566620 +47c9ba88ebd7f795c9c02e63cbfef0515a62db218f4e5a0c81b00bfd6ef12e8b +7bbb8e9ab5a1be0c2773c7b5244d7a815d95644a188ce66280637dc8cbe5fb16 +f2ac4a45a8a8a3e13bce53c345f35b3ff85373a8733aa6777008ae9329c7e54b +9fb18b1e137e253c72128820e04c7bf47189c1d1836f6df447ff9efc0adf7b0f +09c1032853c67fe92d961a91e70add002c0b8f56a07c3423cefa2e5f65b028fa +ddf99e24090b56e5be0173e8778b5c45fed11fc0c0ae64a824bbf77f1150b9b6 +cb4f96ba0413fc37f7590955d075120862015df7171ea3b49fe6b0f261db75e8 +5bb33fe6043a19688ce286573be42c114a0495cb2cf6f642e83674b5ab17c7a6 +191c140c1ffcc54d70e2b4d1b82fd0aa1e61583564753cd6c5c0d6d7743cfca1 +f6fecc0f51f247b081cd7fcdd498da22d5a2c8dec0b7a9f92e252f63644c50d0 +874617703ecdebf7ba8933041793391f67ef138fe0e4efdbad4fa6d7b01c1f01 +b9eb2868632c20ec8f3e34055f6793054bbc31c111686ebade4b4d44a9b69021 +54cc2fba1fcebfc1943433fb56b10b60f5edb160df0e33e7e98ff752060140c7 +8511c870920c2369a0d6d4dfb687c30541e014bf4443f665a24a5f05d5a21acf +f99d9131495b773e42e3f1333866f45dc35ef9231a00129564d194006c447bb1 +5f341631210376632d90120ccfdaf8eb6df5e2cb1b9046cad64e34bf4e524c3a +f786121f9136672b6bdc99baa00d412db7d5155c94796da2f490cb441786569e +769561942b30cd8b72d01c11434b9a64a82f73be48821291df689324a361fb54 +c1760ba86b250c9a6a2c855eaf318703d4b6c23f67931b376f48dd3d87250ce5 +7614efcabb4a6b8fb9d332f121aa8e83edb6897987ee25bbf692d1c243e6b592 +1954fa91ab728b5844f0501a63abfb7f6c8a018e0f5cd409139ecda8b427754b +089e9f71a74c55b8a0c7d3dc7ffc478e693ca78280c9b33193e82383627bdf30 +771103c535dcc00c7d9ca352f135de010a9dc95780046bf75b36e0a284d8c2a7 +f3b6096d905dac2abb33764249b1bd61e3994e96d0f3c1e8cc9959a404dce763 +31b01ba083a82d6d0d9cf9b163bbe2e84e01a9eb07bfa80ac69babca7e725fda +43b67bedd3a23fa3926300349021c2337a5dbffa2021e05d26207958bef87ba7 +eba130cdbf56be5516c5ae4441390e999822089200aafecdccadd69169a27414 +1c0bf4ff1be4221b4e6465da6e5ed755568f79762a660653e10ae8d098471457 +9c6a90dde454ca311947f0d48749b14e04aa65a9d8c62097998b4d78e171f166 +40bfe92170c33de5ce03dee2bb50a656c2748ee8eaa15951da01771acb0a7c97 +25eb74788e6c283c6cde569ce52beaefcdb29f91dd345ec41b585f1e2dda5b29 +1e85d3a50e93ca8caa6fec04df003df18120152d0540efdc4020dd6475233f7a +1bb0cd65e6e389a3d714455aa5341872a48c01f9f3451f0a41051340a9276afa +50473824ebc231402f4ad6e35ee9d50cd89d2dde31cb5cb47c72cf47ad6e8538 +e1d41960475db823b56c20845107d5f2ebd3515ba63c00b73f9f069a7b2d8cd1 +862b61a9481a437aa4efa394315eff55fbd6ffcb26ed9010daf763a3806da8a7 +14a1e943547d733eaff9b1c8ff5d7ede9573851877756c99adac534773a87ba7 +e3e320ed16d4c383bb75fae51a0bdc694cf4b945a389878d38662a3d3b6287ed +d505ff4d7947250e56c501f630ba5066f343e550de87b42ad8eeba15ac21de34 +ca8b18eed081283179a71ddd916c4efaac62f0603685530d08d499918b726311 +ebb642eae0db7fc91554fe6e77580244e6f3dc871f6bde18a80d732fa6f2f04e +108029179f799d54c7eebbbcf6c013641657c98fc17d652a9b48d15204936752 +89f4312216dcd0605be6fac8c1994dfc7488f89fb2e777297b16c95c66e4b7c8 +5b30681029156954c59c7f4009e6e51e5a218de4722daac7b24176c9184f8da8 +150df8d26760dea0757344050a36ee320d1e71dafe9fef9bee08c93a2ec25d86 +310ccaa2c2b42c87298b238b449b8e9abbc89b9751cb1b2d86051baf9d84ed66 +e4123cc33e02b6c95f60d72dff4ec2e59c0e85370ee21c6ce7d2f2633c69f037 +00608a7d4c67e14d6eb9782762c193ce09d9700ed2207df978ac96d967f64d7c +d1890a7992c7b1f0a6240d53bdc279a1e9809963532108114482b30325585466 +050647c568823771ea8e227bcf931321bdc7699707ce84721f3a8d9247ab7428 +2eed6d1f734244c0006db24d909c39575f3c31d67c4b06100dd37c12637e23be +103d0fc36c3db59bdbe5c86474269c394b0d910ea9bfb4f321724e0b73ef96e7 +542bdd57d34c91b319d8ba7c692608a0c0db47d5c8164782c5f5d9a438c15afb +80c7545832948717eeb7f6b646c59cd2d44be1fb792e9edf4a938f887304314e +b064e64acee79563271364ccd68552bb354d1b868bb91aa38345a1f712bb191a +44267a300c19d3ecb9c756879351f430eabfc5b596f63a6860dfc94cc6ad909f +9815bf7d7d885b62d3aafd9624ed5eabe77acc50b5c8aeeadd4ad79e01f4fcf0 +c0bf6c0124da07e12348419aa115c90fad1d3a6b8d12a9d65cf3c7e8059eea56 +29a9a09e7d2df23e180c19734acc46356455886bd9e1981ad86ab2be96eeda66 +87654f6ea6e20c95aa61c9a50117db0a647ebc8c34c55f158ac2085ca23de1ca +02b4ded478ca08c4686527cff76d641e0097f3cda433911682b399604ef61c89 +901c7da40dfc094df7025b1a692c159ba0a743b1550f3c548b2c5f7b33016a29 +a370407acf516e13a466e03a8a71ae6ccfa498d6ee19f53e258c3644a6e86852 +7f76d2d673ac3b07e3e23554886243d94d7712d778839a0c754a8a1217162b8d +a3ec1006d9d36dee27d54e4c6e256f9a06db8a5a752a1f56766f0c6982df002e +4201c9988b769c64aad5446a8190a5b5b3c1f9bc8cb6ad24c9beaab17c17441c +4a9a8391950fcaba005782678466b3659c7eef7ade032612a9a2e238f59278da +1deaa6dbc1a007c6fdd494eaa997ee56bbed5f797df482213f03b75da3a05a0b +30b3d63c75b125b8ba5129e298c45d958a3c69067af3313cad7db36d928d8ec3 +dceec61f0f7ee22622434248cdd8696c5b54c8911b9d90714347f7f6b11c0bfd +908e7f9cd6f98b97a3b8fccef61e6234332a1094b3c968eea224574947de42d7 +f8d5de799f40caeba36b4fc4bf430bb380dd217366446482f94d207c58a25e76 +2cda6f2af982916b182b477772674283254ae75a8d8d4cf121a73b3a2592ba76 +1d6d914992090c438c4a68018d474b7147beb38ae35b8d8e9229490655900c3d +e615951797650c229683c3def25be277af6385b4f0ed240f86547a1a3742aaac +a0d28fd8de4fbdeaaffc37a669bf709f0dcc13fe003c96e44a9d33ad16217675 +04e1f237dec054223a0a35a4ada96b0a683ea1e016c6fdde948e0a7a20f8e8a4 +a6d3bb3c09636e0373dca7746eb163f43810e2eebe8a50adb76468b8a779c371 +6c61b780626c027be20eddcaf408dcfe07cb044aa03f7805290d252ed3f30016 +9ddaac33d863e1ebcde7b8f3e0be3f906c3375e4242f64c7ea6f0f662bd9b776 +6702737841953a725113b45ab4eb8548a1c1479695ff4ff9eb8d474ff66c869b +196aaff62849081a98ee963bd74da69ffa1dd8519b106ab22b4778cf97f1aec2 +d9b68354aab2fc0a8fd3516e2d2cf08c22ab093ba89434c57874f4f87831062f +213a7fd7a5572d8088eea1cbf77b21ab4de8f4c7a1fa8312484dbaab9ab2a923 +d87b1fe0ba3183ab27d00fc13c624efe6ee45e62d2d328aaf9f501e64765b946 +f21d5f77d5b5436a6ccaeea7002b0fb24bae81ac550a731505287f37dc04af2d +a4cfee3b3a1ab21781afb9222da39f72f2dcace99dab50d82bc73e73125279ff +431a5a2bef0b78abf0bfb1b3140698456beb47261801937d55e1dcbe40403dcf +2495b10dfa47211d9342f7676cbb498ecc5316b1dd64a74fa22cc977176d03c3 +f3b0760ec63393d846ea11b9c2aea75c5b7224dfa193a2534f0436cc90d9fe88 +1f56441906e4d5644fc33b472c28646ddbace7d8ee8fd8c78e5879e638b41b14 +eabb5715c81ab6cd2fb872370888be6f6aced19820394a42bb286adf8dc2a82b +18b166efcf0c5c7626aebdd3abd5fda35cfd70887f695fdf82337b821c510005 +90c6f06a4e88ed6d4d0e5f2c3ae5e4865d67e144bba6f6f3ddf309c049772e56 +0d865223cd88963c6fdb573d56b8fbf67255f94c1c4e264a8a13810162f1ad7e +b141f69b353c7a9737aa9d919d1bfdda75910dc5e841f4d52a5f58a3ebaf305a +9075edc50f9fe0cce188ff64e09cf1769949589b221b451c0e7f2b6176f6ca5d +680b1b4bfae4b7ae87c03049fcedfc09a33a680f96d96c1d09fb0921f3d4bbe1 +9655fd72398d8b66287357626d90d44b9f0e2973942dc06de660f7278cd0749d +27abe4645698676a1ec645169bbf1134a573ed63fbddcf8e690fd66f943eb675 +2552768f52cdd9b8c4938e1d583cd6576611b1495b4339c86021ce6661175e68 +873991ac3c93a55d9430d510bb2d6c91dde275732c87275d2dfa3a0124b3da1e +1fd7bed9edf509a3afe352813a8726522244d32c8bc31d01cba0e1248ae5c75d +d25bcc26826fc61c172b5ed70c869894bf1a37369bf1b98f353caae79bc05fb9 +8c9d59c91e67e9040642e7b4c54912f603bc8f8696ac9d667c557c0e0b90679d +9c809c82701fd2725752ffe02d243baa5d340a59d26935d520b3f0a7eed8fc8e +fc352542627f167062b1d2657f36e518ac54d03df9a51e857a3ad589f7986513 +914d6b735e08c0f0e9925a49e08921da73050d323ef835f24565fe5b34aa55ec +b8c41e873d766d66230b8156f06580034d61e5060f2b6c8b7bbacc2875c26c07 +ddadc43a8d13860888dd97accc083e597c99cd92180582ba9fbd03d6339efb43 +27af006d0784c3f661ba85086486f91df5dff5985c111dbd19c17b357bbee805 +6ee8afe1802988c49999f36a176aa339676f67b3a99638d6a9db1c8219636720 +a64fe07e8968c0e2d013aa3583095c15b4f6cd716dc4cf833d4595a5db580082 +66c95090df00addd1a266558da09328570fd3ebaed85e853b0c38fa90ce59417 +da533b879bba9813544f8768cd27b91275d44b3876c187c7b1866b943d01cf14 +3dc10332256dd9d603641390e9c4a5d69a2e3a5a64cf5f25f3c97fd69673cd04 +af830aac66c8c58c7d6ca5c9491776b6e0ff293a7340f55702448d1c13ced978 +a5925f0aa260461ee1c304caaf92b12f5e268ebfa0ded8cc0262bfaf51f5edca +c304414a151d57c00c8d81018ba41f72e9f6b0ede165a4902be08de6796520f4 +84e03e723fc8fbdd5c708283d410bff715bcbb78184c9825bb93b13ff067b8b3 +8f13ee2781128cbace25fd8dc9b6cdf0094639797eedaf5cb118a2de7d53d66b +aff54b243047c35c1fcd4adc5942757cc55792f3370059fffeb95ffa99f10e98 +adb201b57efc5ede4e03dafed763d81cd47b4c575435eb7bec1193ff84329a23 +8cf67d8414e8d1a57e41f3ed0ed3b46f1dd2edf8ef198cd857c05dbc65350dba +a939e74d0394effef3780ac622549b301ae4539534ce23da4757a7205ca6dee2 +fdfc6608444093c046976b919204c92d985f4ee2db74678725c56348c40cc447 +8770ad251b6442630dfe076de75dd57da6a453e8ba58d0016aae4dbe05591e80 +fa2c2df3aca1de4f21d86c560a9d25280fee16d5844a5308d7922d9bc40201c1 +c648e37d929853249e572f88b21ec024bd07a8cf3dc4fce45df469c94192563e +a695b6fed264c72b66256a3e9b0ebbba06d36a9dc18dadb4ac7bb9c33918a106 +ae23bdc5326af0b6ef663b6ed2894bdd80d334a084bd692ccc42fccc033ccb29 +5c7bd33199403d488c61a9e0c619a8e501a4f5c8034df1d2782d8286ef950513 +be7391b1543e36fc886672a4556c66c4a92c40ff9abde49024eba8e041236d3c +f68125512f1803b8cadbdaa0926906c6a33ed1a52c75e5589dda5537ed70572b +6f94756f25eb171372f4513377760fab4bda57d5badf1c2f81cc68f4189cf499 +bfc5002e5791bfd84a40a69983dac1b26cff33475913e7d410d65d228c695ed7 +6e896482179611844eb586a8023e6e03af4c787d991d361be5aec58fd67222bd +a3a63f3785abfff3e90eda8f151bce01026a425587da9d8001e532fefb75db48 +ef723bb5ff12398ad736c4f329fa941b1951e171732ce74b2f569570ef9c11fe +8e15a4746bd8c4dc3828e431329fe205584b946ac06beb7efdcc77d5bb6f299b +265a56ea29b78903c605c1ef909dd25abe6562103084f9eccc550698ee2ba7c1 +ce69e49a7a3dafb88a155d7b6922c9efb5e1f8364728cad0b8b4761a1370f06a +aad0d9467fe10f58cafeebeb187be257859be4d730f33c8d4dd5e1b0dffceca3 +b23434c2a25bb9cdd8c553ae92093b594ac139fe70fe9f4a607ed7d4f44fbfe7 +0abd31a1d27f550acbb627ed100b06b0a90af2c1aa9e334b54b23863693bcce4 +bc517db889fc3d8d179d670b1e282c6479d4f278a620bc61a5e3977458da98b6 +dc4ef9062ce128fc59a595f9741a7ab354a086bd1b0cfbc8830f19a0a5b7a278 +1ba1afac9e8f805f5563a954cbc48e85565b0acd3930dac4f1f4d0c0eb8b833e +4ef339d3f5ad304e59f0958aef225767f1f992dca2d9279ed920e6b1f1d6ca66 +3814264a4455e999bde37475f3bc5ecff3622581ea9145dab6acdf95c22fe293 +272d2875a939ec35af73933e9acb08e419dde1c8296e1a5ac1006dad3bd4ff51 +f278103d486128712f55c34f4e1da744350965f2692d8d6690b67445b8d0a2d2 +6b1a18c1cac898071b9371cf39ce17153fa963d83e646486d9449d434200b912 +5bef39637f3e298c5dd1f0e817f523d68a994b3b05c8d4dab4700632f39f6410 +3417a3c7562cd8c399ab5d9b9efe99688b832d5a2dbcacb4ad5d4024ddb302f3 +38a6eb2e23e47702660dfb5327bb33347c833ac8c9ac158d2e676589def43d5d +9bd741ff2d68859e6974891121a14afa2c9a0b591db56404b19f08adc039a6da +0f5477677ba691e27d680068f832603cfaa10b27315e4ca8d8fb63b6a3c755a0 +aed3f49af639ca8735928670f37018e48bf3d9ccd8203017f5c52d4dcaaaeaf6 +d91371e52550e6e0bc72995965cc5a9f987e2099bb915bfa28fc0f57cbd740b2 +6630b3c1fe2f7314f66c36f3014d8940a6b99e20c2bbf66147ca17cd9d52e2dd +3edb04670d745d9a2b33ab65cc16a68fcaf84e360ae1477d357afa62df1374f6 +1219e7ff000117ebe8dc15d58a4d2d44102d235d9788d897667cb686a61e9519 +8ffe8a7958659c0ee5e1289c8c1676ebbe71b61b20e4eb930d14927e2647ee60 +92b3a7fe0c8c02b760f75b85bbe0a429d98f021d0f4d9ae2219efd4dc06f3a44 +a1718101659bba461a904c2560f5d3e14a0b14992b489b2b524cace637aae881 +030ca980db54d8f1dd988ed0fe2da5f799c393d8d12582dd218710e0a171da2c +25f637290d2296bcd20c593c0f4c3b05635d04b4504725442a5c038d3c3d4ca1 +9e121199a4517edfd81f9e50b9cc6a88c8c49e048a7de4dde8c77c9eb4aa36e5 +5b26a061ed03eec44693b9f5a7ef0bb70a26a147bda86981e93ded72f12a918f +133e63ad8507daad920be5531d03b75b491f95b76e874180b434ac0795f961b0 +aed9e078966edf01ecd449afb7944080f6f09260e767f3a388c481df67d4d6a6 +3d5949ea21d07bafd52c2bb664295bacee81ad5a2b16e4e560be69e9f19fc9f0 +d5e0772784a6917d2bba7ccc8455f1572a716f1e032f5f244dd26e5e77bd6894 +829620277dee975d609c3a8d13c5dee7d05bc9842af7a84e9753420591d0f6e0 +e457111aad08fd5818b23baecaef43d6c42c423f37cde8ed09cadde44ee7e8b5 +c5699e82dd3b7d5f268907d978b58fa774dfaf90ebcc85ff390c78056806f6c8 +9ae7aae8295bfe14c499513fd2438fec5f13a9299500b0abbc17df9c39a44098 +1784299d7229e0f36748d957e5cfea65d8d2c940720ef6adafb4b40ea38bef22 +a997657aac9473469b33f7b35cf12f92a8906149fc17fd56febb5e8d728671e0 +0df089cb79e80e41de415f9e7d1b5b93a7355d9eb79bc74026afcfd0e82b53ed +20715a06fad8a586bd1961b0cdaf91af18045107311f73f8f9fa185271ca70a9 +6242825133c68e6e480a9d96ced60694cb24a3127357b9ddbaaacb314bc76870 +8cc7dff7c1d96ec22e39930613b154a2d52f6d0ea5eaadd5429c2738b27bea90 +d05e15b53c2481406e56bd2fbcfd9c73b9bbf9ff905fa83f6359ccd92f2f6494 +69927e744de743f579b7d3c0221c8f1e644a49d33e86208d9f3940e313abf42f +7820c38957f38908db156a4820cee64ffe0ed3637a26ae347df177abd9ea683e +91b15018fed6071ac92cf31ed64e5152636a01ad869b09afc76a753620901110 +f317eae8a99e5bc888bfad1e435302146323d0b752d0347c9b5c40fca5393ee5 +ad16201bc6aa52b4700d790af61387f16f0ab6977291dfb25ba200ba5248bd25 +4850cd1197e0a7b289439b0442fba60a1896d5d8eccdad1f16e5824e665a249a +2982bc9cbea19dc6a0429e192f005474e775d5dff231d5b3855a2da7040c1058 +5490126dc9c2e409bc8f4eab60b75db09b08c94c8a675efc22a0a8931c790cad +ff09b39407c33cee4253e5c5f9e806b5bc5fa785fbfc6db334a484e8e0f023c9 +9094b1cff83bfb775af6751a4d1010416b4886b3a40213297340212604d556a6 +2c56be99d04ee8c1c0772783df3bfd97a9600c3336302155a019579b1c753b81 +93b5712637288c4c657d66aa21aad4ad0660f160c5c61c2ad73a1e1ce7518c31 +2df63067457a38a37f27e3e4224ae637c2a977a5ccae87292abb73a29b019bab +91c4ad20b02dcb57774225183f9d386136ad0547e86b64cf5337d42efaca336c +7bbc10cf8163aa44fee56370a74d47b6620c9c70f822b69d292e3a2379fd776c +7540c44c8ba1f0f072336630d77e45a96b232897d32f726bc579fee33e2548f6 +3ea6c07e6b7c8a39d82905ec789c2ed837a380d354e93064a516605bcbe587e9 +99f69b562805b54604a6ed75d84f7cf08bf33bfde2cdef33efaa1a4e417d2640 +a05bb5f57cb7f96dec69cd6bd3cb909cfbd3088f60d4caea3373f31a684797cf +0b1cdeafb76cace154d45bf7775f6441acddaceb8332ebbbf148395e08073da3 +f54f6d1a525217d554f294d9665fd12766de19fc11e23a1483cb0abc75b21bba +9f7c2f5e21a0eb5b79585b9935b7d7f2254c4f7311d6367a6cf51fae5b228648 +8173d553701cccce508b5623bf23bb59a66356800f2513725046f115d10f3a68 +4d5aad7551797c563a6a5934cfac1c95216db928d08a8adcc4d12d855c142f41 +b663ab4755813cc4bc432147c5b9e4949d56a07c084be5bb14b74ff3a9ca0fa1 +708e861d3133c5caaa90213ac1042dca3febdc4431fe092c35cc2d60fe92eebd +c96157af469b6e3bd124a183947cf960aa29504dd4eb9fc9c10d1bc77363644b +6c452a8824b48ea64a3084f6219c65cdf36a1f8a4d7da515ead6f0e03d0bc2c1 +69ad00aaf8a2b1782c990f7ff40fb9bf2c00aee85eea074f4568760d8c78529f +835e6ace945521a39af3bfe33b73b62a9c755921b29c0167190c6fc2133645d7 +6cd319525acaa82fd7727b055e212c7db32b5efda34de81160378efae97fcb51 +8fc021af9ec77692c0bff6e8ac0de9f938ad65c48d56322c5719767da14789a6 +06dd5ae421aeda6de57c968c883ae17712aade14da281fd823c99561b2c7895c +c0ae4cd1a94e689bb579d3978ea9b2bd70bcd167f15508d1d820c8f54683cb3d +8b302e2af9fc2474245fa9c3fcd50f57699ddbfe78c83b417f2ab301cf335284 +c7cca7e8d5225e036591bebcabec13262d1a7782f1e53e2a1d75c152c0ea6d18 +04cd294417f9cd90912181518915e6d81def1ac5957a7d59b62c5766e8ef3554 +43938d39498456ba87c424013135609c6437aa6346e59b385992b196e5bd7f8a +0b44804854f29e194b6c2959ad55c5bc94cbc0f41f837d72c1e91e795e4d98af +976eb1b55e01ab71a0a786032fb6a62fc6201db7c67f2340a5c504b9a9a9abb7 +3df1694ef6c098769477cefdd3b4b77ab716d240ff9fc0a1ac737877658df26a +b6e7688c7382d170e1218cfc3be31a193f26e9a029c74da3ba2661014b58f58b +2cc7719be663206c3cb3f8993a3400c149326651751e8e9d7902346660c4f845 +c7b0bb144ffee8e1187efc1a5e9e44fb277876d17221287c87ee6351a5c887b2 +72e0c04d45d060190dbe5b1bd8afb1de6c6d984b65362bfb0f9a4aec15979b4e +e94307f351f30f02d8656f24a4885a5fe3bab465b7a0421f240edd8dbfd8f4a1 +fb2af2f4fdcd000d0aff4b5ad85b54b98a83c59654705ca2df9ef54b742bb3c0 +577f7f422cc7cc380e5dbdf0d4b1fcbcd418a219b88279fbbc8b5397744ff5df +1d795570adffdf79a38a6ce62456c2601b8f09bbf18287bbc7ffec9d1b164856 +77b6f176286998b7e76698945e70510ee09966817854263354a751cb09afe9a0 +76b86ed14a837dc7c4c15ffe7a448056908deb055a02558aacbb6465481b81d1 +f42fac1b857a516852b3e7db8425d23dd0e2e80c423abcb3a5b95f1d34f28e76 +74c3e3a77431cf1f75ffc9f61efd8c9a09fe9d74681e541e4435d8443fbdd7b5 +4975b26b3c69d2e2283b0ffd5e934a480c4ee656e068aed4fd180fe5f6ef4af5 +1fc86e6f9271d0b07bc9805cfb43f06add9ec5e410a7bffaa925d84a26965fb7 +6942fec6318bc03627e112f16fa00f56ef464096aa0fb4298a98b3010c404009 +d16c2c133878b6f2988107a01cce2c7a3db4cbbaa7adc2d45083903a357d4911 +3775dbcaef8f814be6d600cb277b9af93d8ab005fef834ad50d8ce9d1dc09f95 +5b7fb930cce65c43d9cceaaf4517b8f1ad764b1c256280f19cb69373805ac79e +a4cdefaaf9064efa1247ba74bacb09fd16122646d36980eee215f83dc9293193 +02789698f6fe0c5a0539fd7ff2b8a28746d92354bcff6d6c056171bda61e9ad1 +bad7f68caa7c81dd31d3effcd9074caa07943ccc3fa68438e9712002d7b7d5a5 +2ed1fb85a70e55a15ffd0fc5bbb64265a048ba668f0e8513f733ce257473c517 +0315715e26e0676819f8a16c22d8eb39d07846efeb177c488957a5237fd3d592 +3d10c2e5e1e6b50992649bc18fcc70c396312b350b9cad02e0af2146d9894f50 +20eb54df3eac30225deed70dfc42784e3da822f380f46b4b3036261b2e19e933 +675dc99e5bcb66381136877f0e9cb2ddf01522a66b33d559160d2f184a7ab052 +e5129afd8225900893ebd39e92830ed4da59e777ff5b0a298a2e3bcb2897a6ce +8bec15a6522071afa21cc13ef47179c8877e6b3722180f9ce4ea63302640798b +af1d2fc6e0132b3505d3b0e949d6fc4d9f744436c619fb0611b13a6b0a4e2372 +a21d4b034d9b4e0fcdf5f25c41e8ce94c8e417088db74d2d82a618c18111d385 +c4c66d1f37f6e64b8dfde45ad805c374cb8030fd3db32e8489ee7243c78ee4b4 +3f58f68c2f77d0917aa51ea69481d98cad76a2e6a2833f2b1cde6d15be2188e2 +40f304e95494f838630665b8c8330ea641683eb4aedef08ad22b5870e8508f4a +098fb39f4dc7ec87bc0eb35ae1e97c29026d6c800deba720641445df76d42a8e +6470dad8a60aebac364f773ab9e7f2a8b31af927190c4baf7f7b3d2da3becaec +06162e878fa179de59cf84e37f0e56764963eabaf87b1fbe061917749ea18ac2 +1794eedf33f62c32de4f3db287d51373384a2cfe30bb5daf59aedf26fb1fab59 +5e8897f2328f9233d396e692cca1ba9cc4e6246968ae05fee297a5cbe1dec18c +59d1618cce3b4bf40d4e07de3cff3b20f7bb88e7f1323f64bb8ea416700c3703 +52a06a717e69ceed80be16007079ee6d7ad3a87012eb2929312c2b68aa785214 +6a5760590785548490ee4b55bd78f179671e74268c670dc71971773683014080 +b742cdfa5f5c58173cac5dd60832c9b6ef16b85c4280472c96e264b54f158989 +386bb30d4336cc099887921049db56a41d2a6f57028a7cde2ea150e9bdc16d8e +e0f42177a9fb423f2245a34dc8808ecad15ed373a368dce05930e4ad627da6ec +30c03a2b9f4368ce8bea2a19405a5dfe6745c90ad99baec67cef778651e4ddcc +e469d3978733fab41a687f7edb977653d119a9c8d33f299836f12759bd4f5abf +ab5b1679c61b46854d8c9345a33d3338c813f5f8d0947abe01fb4846afee616b +84f713090a8b665320c9b3be3baa1c7d1923804bb5ac590dd2f7d1cca105e7ae +a1b880890497bdc0c965e6c355463f8a5c481fa144dedeba2b5d6e1c805096d9 +f343738b9bf2571b3675a19a2f919ad7da95cc16bfb4d7e83bbff08c5bfd5b51 +b3ac712724e9d031ec14e05979f79e2db6d1b85755c327ffe124bbfb62c93f0a +28e5a60ca370948a3a2fbe3224849120cd74ae75aad8e4d110ea8cd3f7983cae +e269bab03078c3ec14d9169b2ccd4c5a3173d63c7332b2ed58b622c8bdae6c31 +bbb347a18271f610c1192085b933051bf4dc83f627002b9654092bbb48a0c6d0 +e280db40562724e3284aa644e399062787a2b58e850adb5c1c3300c2731b53f0 +ea5e3d8c37ca795bfc171259877c8c3735a46beecb8e8cf9bf7a3ebf60d90a5a +b228dea11f5b847663d97e8d43416cdab60be9641282027a152f39e953cc263a +34e070785904b1cdc78998d53ea6a44b2edae5be3a22aef96970ced5b1a8fff7 +20e39b7214ade784dfb059d1b9ff5e8a0a1c910e0d6dd399055d7f91bd13d9ae +2b6a651d1ac110d1bf8e2e43f1b4d98b3bf62b7aff5e7744eaa994d96d6a05c3 +cc66b18ef140d07551f83bfc4fb770f8674a6f9e844879f3f8b7bc956cfce62b +c658bade1f84701103df87cf8ee9e5d33690839e8fb6e3fa7ede4fa9e093da77 +81d379d9b12bf2a56f968d0849311e81a72c96a421b6cbd58ebbe138ae58623f +2208930037c3cf001134035d7e47cdf849004522de61c27263c515655618d1f8 +69784ab3f742689ee655228e1672ac9ca1806b76232fc9eb85f69b110ad6caf4 +2a054adf4e2767a95f5534c5525a5a6ac6008a10a59cb28bb70e1a41fab590b7 +3fcf80f3a989e905d344ce643aff41a74275905e9235cd33818c5bcee1994c33 +77938f2c4fd08fd052f6f59a9460d7897c139729e768cfa384df59bec67dc82f +5cf8e2638bbd8dc769ce87857ff6e7c4580ed80e630815057a0e381a91321af2 +aaf3710f92d3bea496587cc1baf8e76a90d8406716ad85e8bb3067ee410e32cf +9dbf16a6ba4a6993a1454a393aa1c6a4f5b85bd71dea9d09e16a82a2e64b5c98 +8d2f05107b11cce59735219b104815e38219b1dcc2a8fac862cdaed85b4e7f3a +3f8de686cbe956d7b11ca62dd89c68754e56caa56ce6f523579e725213913d16 +987674baf3e75b9e1176845eb69121707b6d061fbf86a28ed7e3cde2c0ad5fff +3200813651016bd240ea190b9240e682df8104baaea088c868e83924bfab865a +99831038e67d113489df5abf11f7cf0c1ea9c24ff19a56faeeedb1b2e103e0ae +b28b73d58224f590be7c0a7548caba79e8a312f758e48c9eeef76a012383e31c +4f457d451bb1c3d9bbfa9dc84c016f6a34a40a5a7f61d5312abcf985a5b56bd1 +de2bfb6427053f4f73b04f545d2e7941d6aa8a465719bc818b14f388161419d6 +9a965691fb68b9a8a0d78f89ced539556ed137321ef6c35884e9485070d884da +b5875d08200a593ae7f9398f4684d19a3a0b621496f032fb8d17a5735dd5a288 +0058b60770ef1136d78fc9dec10e5d78a7dcb4e804d199b659030aab2eff0a07 +c64aeb7b5bb2181d8a80f3c9c5bc1eaacccdef478777567c2f03d9706b4dce68 +2ee5f872e112f7a952101d859246bddac59acf9339b546fe213cfb6230bf2862 +3f0a53b0439839fdac6950f1d1ec14121a8762c94a928473e76e767931fdad0e +c399a7b27203d2198ea577f2a518fa57c75188fbab9de2e7fae055afe6f3c7be +80ae91ee04de86ed38fbd90fe76160e9eb222cc28c11ba39c3ec6155233f4313 +5478ddc2fcf853822921c9a5dacc1bd8a11858ce9af112e05ea6923d4f3af379 +26359d6f9fcad59dd887a7c302e868cf806c3804a997810b16d66ec54bd8993e +ded40daf9c1326d48d649390652bc12f8df57db93013a53a340d060f8f0ea208 +51ba4eac5c3d3afce0dbdecf1b6284c3c16c5529bca906a4cbc295fbaa9b2588 +7d5c2c70f6d7e0e0b52c4c4f8fb406e03ab88787ed35f9c5d95f6abc995be12e +9e51fd4f7771512064a1b2ecd96e89151cd5e135ed5f5ba07a16bcd4e51a1622 +75d9009dfdc4ece7a5bd9561a46099f05a8dc8f350069aad74aed48f7ccb4b96 +4cd0366b94ee152fbd623983a5fc38b9a68cc3d08914d2822e78da693b850b07 +b85a17793750802f661978504694e3eb4b5b2fea34b48eca0a8c24ef81d29ba7 +f6622d6be3305d90cb2af2d67a665c9acb1159a5b34353b0bdb0626a71efd2f2 +56188f41f6c85800ffd51866fa082561b6f19153b8afe445f88b4b7f15f8eb6f +757743d88a687e44ede5135356e211c8b155f12ee7aab0f9abb94dbc3c4a5367 +737468e6a095481a76d16bbbf8ecf6ba56f710b1d18af7ffb4eeb8275e095d76 +743da78c7e97bb5531a71f00ae8e8f5dabe1bbfb651b076aa72fda2d8bd0a645 +b4862be4c0d789d645234b46286cfb807982101600186720180ccbf34d64b0d6 +232be45545cf2f4bf0d23dee4548208296064165c34a52e734155f56cde02134 +60c4aad2e5d9ed3b44a42dc897482d4a1f0780210decaa5fb38ee0cd00a8254d +239b98ee8d82091f45afd8b2c825af54d78e1dafa382275da5fc8d345f643df4 +e4822123f04d053b026bbb686066674630165f5f0ac094d184cef0152242fed2 +fa7b4bde415c3f9ed71d34f37f59a132f8255706a3a4777d7af1fbd4321c86d5 +bc0fc80f4ab662c0f1e59689b6ffc36d81e9349ed7b762e10d85d7294e7d394c +616f67dc9624951164f310307ef5c69db573794a6c0c67dfa180a6bf62df1194 +63029907d339f69af39663e8346d43ceb7433770a42c00c7ac49ae623f4773b4 +20205ef154d2bf9053a159c374021a8202b246e434164c4353e96c3055a70a08 +b890bb0bbdc381da324c1f443157880753f7dbe688640f35d012d011fdc3b84b +530ed296eed8c3ba88ac312a5e94d23c4a6bf5639fd103c14db6fd71b6751d57 +92069f67cc142c1533e54fcd76109046f1acb94d66d3ead2ad35fb9e3e8e349e +dea50fc8fc4506446a8ee556f8c6f3bda2bd502518bf237a7623bca8e81655a2 +22aaa7d829acdd789664f32ba972b6dda0b6d69340ac6a4840352ce04049b134 +e34187426220067f15168f593bad76800e3687a9ea99d5d79a544adf232bd90f +205865688bcc84739eeb804f99f354dc932bedda4a54b0ccea94d3f129bb5978 +60a8d881a7b017c3ffae7c8b5ee76d09c8ab8572c81b994d49c2efaa80a5f2af +299945e831d2335d669c596b4af8e9f5083f90d7846b9be991430e7d396efc33 +c232634fe93d5bde557879b106ac4c7a124d5cfa47250a666c2cc9ce0a158d37 +63dec10be1648ffe60b51e94e8317c71c0553ec74889f87b71c7920fd676e09f +5f21a1fb909ac44dba922b62597681f9e9323e3599473f39e52b1348bf585cf4 +2029944d229073babc0536e8f4d73c8cb49264e660f0df5f606af0543a1137cb +5c5d008b019d542bdfcdbb3761d8dc373a20b76ae2b4885189edfe5bfa1e0599 +8fc793a9804ec309b0024a04a3c24a1efa61b87d1bd95dfb688a6cba47fbfb94 +5ec8770e1ab19a879891ec6318981d6bb73234675a44966630f34efbea0fe1b5 +a585e5ffe8f6d58ffd7abb3a7a13b0d532fcd8cf878e57cc0dcb761f291c5536 +dd8222e8777f112bd7c5d9d16e7ea46b00bebba2fd8870fd94282339f7298c1a +cf2f3c0eb7c203181b55043be782b79c1e33a178c53a7d09dc2ebbc3b338e5c0 +2dd813e2a456d88f4b658bb35c6ccfb1d51f83073cc5643fc3f98a6b712dab8a +a41ee7183668913669d13c9b0cd981f1b6fae03f47961a49e349bbb0bd62f47d +5a0d4c35a9bd80945177b33bb07ec5c92d03364649fc8683d1fc202c5ef8ffc0 +d7cf9ccb7589ebcb56f2ecbfe6a46a028b65889014748d56968746e37e9b4310 +7eaf668a9a949c851870dd5564e29be355b75f93496d997929888f451f4ff7b8 +3ec717df9865ac5769e8078669da3063645a9ae0576b5576bcfa3c1cecd8e82b +6a6727448ab8e6d5f8a06b08c885f59fcb66e918521c32d006aac974c10323e7 +a1f97b9cf30c825c35483db7b5196744be5f286fb9814c7789ad4b1b397e00dd +366b5b80a7e5aa28cad3856fba593cfefcbfb19bc6227b79c252936fb8f2d49a +2315ac036c6e08766aa2b287b6e0a5d851cc66afddf1e577793209d2dc75f2b5 +d8050b0cc54efc673ee8e42a0d305812a5f89979478de4c24896489ee3df4328 +a585536232e065fde26e460fc9435bc02445058d56ba2bee0a7b54e359867ea0 +5955aabdfdac296c39ba589f11b3d2d9c5e3b7508fe43bf63fccddb5ba21bbee +4269b218d978b5818751b2ac06871753c511d36f82557f561eb95c3b70f712dd +fd84fb5230b503222cf3a17fe8fe2666d1485419f4ad7bcb32ff66396d929d3b +207df2d811ee6fb1b4392f8b1a993dff3c254ac865a5217a459b24158269a889 +2a868c6c4fa9811e356371695713123d01a261af4eea0a72061137a17a93fbb2 +151979e29a11ca6914e3c6ba7990bd0ce58cac96c2e84927d1de1754a9d56ddd +a0984576475946f63c2c454bace266de5a6f4487a03ebcd1fb0df6fb22af5434 +6938dc41bf1517b3fa99fdc97a8d09c320388fe718a843fc3d7ea5b5ecd27985 +74b38fd9f1d21f2d4a25d0688b7d311ac747b12066a7866204b91c648d51a9d1 +b67e7cdcbe4e4489948f9f70f6866be1a92b4f7931a12d134cc82fdc4782e8b0 +d42822d2fa5df15b349f8f8bb4f56125e5a578b7afa2f409565afb59cecb9952 +aa42a7bd56fc954052fd6706caa5fe3ecd54035f2dd9e10336543f4eb99e3177 +c0d3b65b64252b132e23df390875a3a612823d62959128b25e688fefd781df4c +11a205fb7337c83b3191d7e38bcce10ccfa3c411bf6384c456e7d78bded31f8b +eee65bf5dd748fbe4f70fea9a542f894616252d9d809deb49a9775542e613919 +fb07e86d16b3f51736e82d27dfbfed036782ee3739871239e34dd7fba8deccdc +78aba8245f945c5b2dc53e2cd2f1354a5495d4a002878dbc7ab9ff6384d9d9e9 +131b73814ea9e5fd0b57889496763d073fdc1c5433be30acc62f3fca83326384 +5bf724e35bd947a611a7bcae04648298dc434e415b8c1236aa8bcca1be497a05 +8a0bbf35d224c77ebd7ce63a69b21163534c00499f312de6cd1d63112fad9c4b +86d437a975b0854e35c68a0259e0f9aaff4ccaf3938a2e7711d6545d75f264d9 +a1a00d8407b8d2107183c2cade139485cc681b1127304fa3c40d377dcad69884 +86593525bab6ecb33e02c7203e75255b7e778583cad2c2bf8d5da414b37d87ce +2c230c28ba4761ffe92ce3219d5168e54fc89ae3f1ad70cbc9b956b09ba6e3ee +58e57de7b56d02a9cf7cb8da0d6ca2c3076cb9130165a2b65bdbcbd47c31ac3c +382e0227ea54e52070ac8f126867360726e1124415c83ff1e64eefcdcefc0ce9 +54ff72e9a015e02e4bb8b9ca0e04592c833cb2cffa03eb0447c1cde397b2ef92 +2c95430ed3e54046921ba40bccde14d4ce5a0fbfacf25b2c7d7024545c4b51b7 +d03f662a87740abfe9248449753a9007deebb387d7e7ab76631aa062f79a434b +35e38c577bac6a5efc56772255ac92326adf9023aebb17d8e073ed683a029ca7 +8da3d55197392554af500283b0e47611a3e2b68c852c349996113e47742ac3fa +20e61b641e29eaadb4c90076d2734ecb674e64d25e859f6a085bccdc22d35885 +ba0960eb7bf1072bbe291f9b1d1ecd7935cb7656ec6bc15d64975b1c506180eb +0dbb33dbb74551622ea37f0d813c71416051d0ca33dfbbd0d552863afb7061da +a359160a493ef304656fba57239ab154af8727eebdca342b288bc07ebed351bc +f276f5e6c1dc9cbdaa91451106df45822393a8eafaf03c3f024b20dc0bd5e4df +43f3c6687f2019d642fa79e8ff88a42506d1d7d6b9be7feeda8e21315efe471d +59bffa506786dbdbcace04a8fe8ae423a27b4b9c0c1b8dad3600f5bad7bf1780 +759d7cec3cba13cbf618a53df36c5c2702a38c3af55bff63829ad7f7ee534144 +13f4d5614c05b140de29a9db8135aa108757505841f855c24761c2ed71f89642 +041c855fe532013d0febf7a861bd8b019980fdebea9b245fc3059a8112559970 +a62fa095a55c638bd7a2f28fa2da186d62f130791e8c34e8d7dddd1e9cb6319b +cf6ec3e238f5c1312e92b5dee3dac520eecf315610fc65f458f9f48b0dbc9e93 +b1343008995ac25955fbb881b051114ea5ec4a45a729fcbccee8da29c4798237 +5db572fb7eccb0ba2b41371686c237234a8866be9f1017ff5d151b931248b9a9 +d279e6faad1cee0e2c94b424be49aed7288311ea1ae5f9612bccce83e65ee68d +00b3aa5358cd9fc62688a7694a0e4de3135cecd48721bbc4a686bde074832dce +0f0c31099b35cfdbae50071d2f4c26b55ae51b919c4c1100a02927ca59cef516 +ab603d631abb6ac0a5bc4788bf8e53f22f83dc621cb82372ed4329f60e180c17 +e27e822de8a5ea5d3fb9e0ea0b2b96f1fa398392ac2e001721ddd7423f19b967 +4053cc18287e2ba5a3e2d0a0e80d93ab99b0b3ecb3afe71f6a384f62b938c818 +17462294d1c9b17ab3988e7ae73f3efac6ae24b3ff82df6eaa285f3ffb3248d4 +fadaa73b7217b0c1faf8f4dde2c53fe9ece617950bca9b3d66f0251536963e58 +15c6dff60754eda6427e43b0285643c0a619b14acf45da5dccf94a2332f99752 +dab07d1417ee757010e091cce4143b2053fbb276f5e1675006f3198d865b483f +f4f9225dc95b47690742826aa2c0798e8adb97bcf983cacb4c3037d82a0afc4f +5596547ffee1dc83e7fb94d3d14aa19e70c4d9bbe9f0cd519cfa91ab345f0e6f +ef54525efc326d87993e8e51c9472be3b346b06d6a05b93b07e04c45779914c5 +66ae97cc9286e7218b9dcae206c48f73de2df368912f7a45602cc3071170b502 +93d8a6adc85da881ac3eca963b02849ae9889eacd3129678dba7d032d465fcf1 +bb50627f25cc2f290e35ae4897cbc9ee040e66db1cbd80025ca4188fc2d22d30 +38f7cc8e488b0a769599372fd924ae386c18bb6313b6dd7841302b8bf688ee31 +4477d11eb74b2402dd2a4dc51a6e795c141eb38a0920d6fb582abb07aba1efa7 +d28c7e6a7b0952e1ae2ed26de402f712c27a96c1c51abfb1f5d56c0b67e65cfb +08adbb2c7f725dfc14c054c84e875746a704ef41122f0e9d496dc36d38c80861 +17341595c9c1097bd547bb1f25a5a64627def63820479beb5780cce34dc7dccd +1d5bb7718177f49c6858c94178ab5dfe5a973f4fd9b621220c13f78aa5d2258d +25cd8deafad8fd1dbc6778ff902e36a3c190d60547fa62f0341250ccbefe8647 +5e4b22828804d03f17f54549a66514f6458694b884a8a733ae55975249810acc +354cc875ec55260386693c8ae60160d7af456e43e8b7a3cea517dc502a42803a +73da983f7a78d086652d3e0add8fbdc7c9c2cea754a8305b9b79e103e65b1832 +a6a024a5b8fa8c77edcddccb5beefa3c9d1d01c37a74a08953642083851fcbe9 +4d8bce1f34b7c71b68f3247eb463e7a2fed1bda308c877e91a86d6052ef9d55d +06d6b83b9af7600d61c36a6c460cb43af1cd5bf65113115de83bfc6081d1c0bd +d88f19949680caaa9f48a608fc67deb98ce9577f24f1c2184530f78f788e19a1 +5f17836d2522fc9859b80d7a3c032f533bba7210e9fc43740dabd27fca4c0a84 +fb0b1849a93c4a09c58c553d0e910df0b2c5ba53e8290a3fe05680cd7c611bac +2a82297a1d42e400df434b476be5a2f92aff2db009d26dc81043bbff997ba7be +eebe8ebd761d56ec4e45328dc273f86f13bfc0f5139d908145acf933632b4f78 +aaf3d1917ff63904f2ec971b5b2f4ee6251c0e6500fadc45fd9aaca127967082 +a61ca2891a40763f1fa17f5c6ad3cd1643be1c088eaf4d91e328ebd670768dec +dc895dfc6a554f7428b5423a86858aacadbc8819c0caf25ce204f98976c7f18b +071b79f03d9be136d36b51fbab43d7b7e4a6b3792e3a0c39794c46eb4f4e27f5 +e805923bd6c4c5ea9612fac86f7ffd3b8ad343d2492b8d9f052baf864747fcb1 +b6465f1b1b7e020684c863ea38668c55ce6958eb6bdf0509834ee6fe50864116 +e3160227aa042e26fbd6629cae19d0435b19dfbc92058f319de60913fa956fd3 +26e76b5635b9f4d6adeaa45f31a32c99be06343571e5176e8a89c544f6ea4572 +964f1787df93981b88f68b4999768d382128d5316e83e74643d70a2ae288291e +806d19b180582e19eebf8d295ed214d966b5282e93c32452d58805829d69add2 +4d9ea97d33da81df65a4fe30ebb6b5b8c9b5102ba616bc2da448eeb0f0a93762 +a40521b52f7387c535e17069ffbaf80f0dbf57b296043367237fa4229ffe30ca +938265084c735ceb1fcaee87ee82a2aadf9efbbb4cd80168a0f975b913a236f7 +22fc543668e57e0b0cd201b099834b660b49673d12ecba4f123be5545bdd0df8 +4f1f0e00c46c679b915684b51995d80629cd4485a67fc28a18416a3639b11e34 +b40f292a620fafff9e21b31c85779e885f07fd8a400f84235b585634d233834c +d20801ed4b4973f1e91379e451cd8d29cff2b9989ced4fc976536446fe2bbe7f +f446c5f791ee401cc5dc916d94a2631396634be1a2bbc944da4017ebc4e3965c +e780b758000c9928962f667300812363c761d33f868b1b8753adfc3e77666e04 +c1e468c04da304f2876d1afde4441719c3687c19e75dfaa44bfaa64bfae835cf +501d71ff247d1dd18953e980c8c3701e1215c588ab78b27c41c35c265063c5de +6fed78259cff1d0c848272b4991c414e94fb052043e0a7fd59df65fa27941e06 +9f1ffa2c5f0c32d0ce639ee9c4a5ffb288b749094c464c679ba3e39a11a19cad +1f5192376ecdc9a9afabba7f4b036edcc94e472ae1d1aa64197eff0c87dc4d97 +5fc283cf7dc4944ebc13bd1e937c97e59f053633c52afdfe1495953740578168 +5d137087920373603688a3dc4ad18137b7dc38d8f94bccd6419d9d356d7596f2 +e027ff487fe91e74139ed748df7de8c3db5fbbe0e724bded756113bab6047ab1 +574e67413fd8aa1aa851d1841d7188685f0413ce23140d869c822e22ea13aced +4ba4acbf0d9b65be4227d95e84944ff8de263775659eb52615d6ab62319d75bf +805a6abd316794954d029491f9fb47110ed48760f7b39a8ac5b24841536c2a02 +2555eb6dc69324f9d735e5f2421c2271e6b2619d2515e035203778cf0233bf7f +e98f23bd109cfc4ec0d01e3db3620b1b9846670bf1a8b2cbafdf7731f50601a0 +214619f59f389d6b1e0e0f5660292dbdc7f2a31a3370d54ad4b02d13f81a2f4d +18b6487425ac00228266f1027a26e4903147213a7a5c29ba1bc748da6385d919 +dce09b00fc655251eae84d6f56ffdcadc25d8c22d5171f8c00ba8b61f151b985 +6d55137cb7008061645e8e4f2315c1553381147cbf7901c4207acf851ee2d34f +ac0bbd28528525aa65c6321cbd68bc64694838fd81b20845de3088ec9e13a886 +801a40c656766860361e04ca6483aba7fb9ce30339df27fdfc44b34fc3db554b +4e4ef91c3b7ba7484cdc036fbae749376229a608d1e00913c03018e247cd6346 +9769dfdf3012c2f562905d9da397bd007b2c81c47b8dd3ae61362fc8661dc620 +bcf9ef2561e3c342ad2f3962ccffe8e98e6d62c65fd9ab872783dcfa035ef347 +a2d0d61bc2ab27e4f96f609b91ca099895354ea9aa11881944c99ae187fb591c +01cccfaae4247c6143689dc9da0224a43c2ce43b97d49c0caaa14b838bebc579 +37fe3a2aea774f1b1cb928d69b3cb31f937ce83097b12d6f76eba9be803c0a31 +b0bd8de2b22489e3da1b833bbf7524252d51ccf76088fc4125e1d0e6d6815468 +547b248d16317095d732d1e9276d063ab7665d2e684ba272af6351a737cb8751 +9c74e5c624c79a852a39bc22446a87c09bf4ca365b1d134c7d6ab23fb5069d83 +be00745f0672fee615dd8071b8ccb31a4866853d7805ba92c618d2b849ffc498 +6fdf4abc9711617d498fe7013936a85d12da318bd0b4d2a2dd715749747cad04 +ed570e583b2f33855af8a8d1437d389d6e9b3e47f9de9de4481c492a05ac49a3 +457307dde03b8a30ef2edebd60a5c556db43bff4854b255c716cce2eb9559a95 +5dfb185e18a341b0776d6c782c98675aff75d2fca752e915f58e5c9d0f192914 +88e46db6a51bae30403328930f5639ed29396895778431543578109c917e5730 +9c5cccdb2b6de16a8cbccd1bcc97556e666701659a43c5af8848fa4318cedb25 +67050ee249eb8a7fb5c210eef38be485c82d69ff77d68982222387a04b2d08e4 +48aa0d2dd0201a1d06b8bfc14169ba52d34bbe65a03715df03259656760f90d1 +043474c465b5c900b86461c5e33a5f93210871d0979fdb5b26ca1b2409c8b5a2 +9ac23b4a69053f7c63efd9c9d904472e1c387f97669a830f482bf3658403d095 +9795695185c1a677fd24f146a4c01821377e35373c2f29252f2d33bdb4c2e65b +54f6fb2a74f4f69c8099cae259e3dda70f680d76027e951c523b33adfbae41bc +33940df06666a88153f983ffcf016ad439a84cdbcb32117e5e597c541e7192b2 +11177afe54f0ccacd3b67c10d44ddad93e604585a513831c8ba986971b189295 +843caa12d4c3066951a9f5cb6fcaa07444e4be618b3d6de06fb7754823e62fc8 +a87aef5f867e80fd2bd0c699240cd59203136efc3a94eb3259f68a81e923a78c +8c30c38150bc808b7a0aec0e254e623474456084331837bc16ef060780df87f2 +f74fcf280ff478a04add5a41aac7dd136afb9a4721cb04f1a54e8ad7c886cef7 +33d14d742c292a307b8c50ed8c16756a336c45e6843342a15ab362170975b429 +3986013ca616f6728ec65e0b4ef1f4b648db8f12c74e38b2164ff0a056b53aba +a218e7ec36425b4e8dff37e420ca3e1ba16c5bf6adea301e6039b596f3ea7b29 +df568fe8c742d0bcafb24e7f561c73aeca87ae7cdf7ba2c4173a5fd76f941586 +48144781457282078513542a6ab75d2dc6976f185604e4ffc7480015d9feb000 +46bf9f6650d702058dda7e4f410de647e3ab2ac42561e4c73f96a22fea4a31d8 +f36da788f42ccd7ad66668fddac36c37b800b19bbb32721c40fdf1a523a06750 +86de6580a675fc5e254d782daf7c903bf2640aed85198ffd17f19d91ae85b526 +448d14aed5cc66dbef9b510c9edae9210dee8f44670b4ba2945dd98a92d49fdf +b884118efc1263ba6fd2712047df194e12e107b793287007b57145b54056cde2 +e8310ccb234ea73ed35cd7a060b6088fddea99c4d93827a0adbce5d927faf657 +d3a7f8a49626f9ed40e1e3aaae8650268c4aa85e8b51f63ebe592e773306deb7 +c78f80d5c96968264d0001bda325f560e664f9be197ebc3bbcffcd0ae6fba5d2 +fa83b6da0f8a6278c84530e657e59ecdd591660a6607eae2191a0fcee0e8b8f7 +de61cc07fa55dc1b9bbb98930f93b1d9419b84e6e7b8ef2595442dc264c65746 +1bc7a160af243059e0030a31740a012b783247420967746903bbf44ff2b33aae +487fce9e1b54b1e67fa272e64463a796201b20b6f123bdacc9f04ef881b16ff0 +b60c151419f090edc5d95ccae9773dd1909a37fee6bf39f2fa658c1da7a3ec5b +290f183b4ea95fc6edeabb46b5f518a63d7b8a1e2e0b8c1eb35c95963ab65e55 +9720282fa5e4989ad605ddf5543f50382f539642340c26e379b5325a1262fc57 +532fc4e6a315aff2d4159a0eac7fd498e09ba2e64dde029f33402a21f54efc92 +609fbb36907d798a34c86644264e0ca3da53639e262b49be5f3d212d36086fd1 +5b68624476c0ab1f715d35907fb19dc62625f59b5e9e63cf8fcf3c3c68a6e480 +2d927018240a8fe4230922bd0a431d67664753d51d4f5ee894b5ecf678f342b8 +05b201c2d4540e452a1be93da7c0137a3852709a8362355935494b1401ab73d6 +0c4fe07b2314e63db3005a40f4b36dabd0db3eff936b0a1cc643227ca4fb7e0f +a29ec03ab4610337bbcb63d72f42716fab0a3058dd961b2f291293beb9126000 +a8009a5ab98b0c7529c0e2c4ae27acb684bc3c07817a2d13c672dfc6cd448f2d +9c8cd5a1f597039ff2601d88f2b3dee5980956fada5599c5c968c5cd2db83a9a +e24e2a9eff9d3a0a488f3d7a68cd056a6f8502d6e5a61c305fb99416001a691e +fa95afc08246bf070268f62f8ee9e4ac8b2d812a728db372c62209fb6b5f6789 +7bb1443ad5241a004b3cee1b9e1671d5de56ad5491e42ea7325cd718578a44ff +fc73f544a6b0b1df27c39e213379a1017d60c11a5f8769022bc8fbec7405f4e2 +bef06c1962e4b4c45a1e080ae095ce911736f220831a2bc4c958a607b9c88a05 +96beb76fffcf4e469e2dcc09857bc9ea5687be77e1e392f416f681dbbd8da68b +f378547ecf9648c1b95005bcfa1872dd1e72c5510bec48b0e411ca163c8214dc +0efdfc1f08e925a5bfda8e6ad2f9ee106ab0a053fab30677c6ed7992899d3d1c +30f11e59bccb1e0b329dbe5415fad4b7e420cf9c2caa8f7a032d5e9f9558c2b6 +80f5e6af2158a8ef1fb1e36554ffcff934bda7039ad926ab6e12555d30f76f0b +e98e2e19f12d4f4e8e5ce72e4b2928c396b2e9debd44b9bf80e1df5acb4b9097 +f6fcb00e1ccedcc72e494e68d55151764795949847b513c4cf8694a759f1c5d3 +c6884ed10626bc8eef3097934426e7d45b919ec141b9ab389746b6c277469d33 +b82da2ef40123707646ca62adfeb5828706b571e160efc63d98e8e30af9a7c6a +4046777b2a7c17d08e0cd5e1b79c261b60cd86fee6668f6a3812c6d1bbe85d1b +53a79f0ff4e19c0bb6b2b07c3bc145727d25f9adf2f6ffa14e74e33f21827092 +1ff9d9227d08e044cc750d532bebf0962b6f65aa2d50fb238ad84646d16fa466 +3e592b1e3c21b07daa5e8978793436c50b30f31b17f3b8c3a8a9c98bebecd6b9 +2ad5f9a99cb4649d799dfcaf8860759ac26182ed3eb6a82a980232a426fb7934 +7869b8b24c966de308f669ee47f623b95abbd9f7d81e5d0e81714b6f328599f7 +5e7f9a85f92f76e3df446a7130fbd7652d17abdc021fcdc761f300cde20bb116 +e36484ea2f2ff9032bee64fffe992b4c437845edfa194bfa3388a22ce241fbd8 +fe8d0549d2bf43f0ddc6b0606e976dc36ec055c3722d7fe96a7339d15f93befc +74b063908a089d9684f93364476f9694a9a4a4e46100a6d5d2f3ad34702ec2cb +e64cf76d70e70fe725eb25780a3dcc619c3d3d1fab7d93ffdf695c9d2d86a007 +ac11eb3d551592ae551cda8f78ce2f4a06c798b6bce573d35f9c01a775fd3e6b +9d6f2eca089b11c38b812b9fc497c58d96797744d9a433f0f0f545bd7b4b6ca8 +ba8011c1ecbf6ef91b1ff7d016865871a12eb9ff3f55e4052c152de96bef6d1d +698b9918a8a68202378374097d8ee27f153aa3eff3c6d49b67d8e09cb51b9bb8 +d18eb43dfbd8647e4d2b3992810e46ac719cbff5a28be6532b39c2b462620109 +f42cf1cde4aed3b9f78ba888824dd0d32778be34ef4a7a84a785ad7920621a25 +74376e0faaa0fec39bdc769f5526fbb3f620b3926f6bc749df679115610bd29a +fbefa357d082db7719a75b6396a01b775bfde12394c4ec0a0f75ccd92de8803f +ec9f408861ab730860e0309b3f799eb7d99fae4989c83e46639d08a662e71ede +60aceb5280b19a7ded32438cc1ce140487e52db031e53ffdf299d552b7f9556d +438171ee4787bc6b445dd2bc23da420747f6e81046e715dd6f5cbd9a97f08deb +a742feadcf5d93c7c2557e69b45a505b91ac6799e37f40a2a70f3d0c0885f85e +cad7f5d5498c18d496f84010cc0da7fc91c4d1eca61ce021b3f204ccac60423c +269631a05d330c8b4574754aa6019885866e0245eb7efcbd747dda328525cf9a +3b13b29b8752df2c8c30c0bc3207b37948c30a2d037a29d1ce075b778db6ce18 +551facc66a4032c9479e5122ef759d8c58601a572b0a02d8c606e0f4df80f411 +ff5c60c06c5f263375fa7fb67b6f670a453bbda2f41e71c7da09770162f636b0 +108680424e1d6ed498acf2b997dfec6d8079b2d26103c67543fd0bfeabeb027f +dea56c640827bcf1d5c9e353e30b46ee9d3495c9af5a6cac79703aedfce3a0c1 +d4ce1b20275ed9de111473494bec7da5d579ac5260aebe9a0cfb7c6730bd51ef +c8b8343166a6ea72e0c25fc745b2c425d852b6cd9e8e2c0cfb16be2257bf6933 +86693e380a7eb1c9c24f193620d886921945e5043fd6b8798c1105ec40d4fb82 +56cc8ed9699a1f84d7438eb7447ff6112686403c97385442c3d34a9187eacd1d +dcb4b5fcf4a11e90baaa10fbd457053f5270e4cab233f41f56cea906103c5b3b +0e7e5f9b8abaf1d66572ff8b15e0979926dadd51de964dbbac8abc813c28ad71 +4b14bcc1690838b6a2a33a4045e7ae481d679178ff87b65d5e7bdab7bd59b536 +331c132115020fd681ae7705d805023ef790e163ec92f41035e28c6edebd276c +d4de63de8141cdb8d77b6a657713bd1c38f02ef1d97dc791883e15d96b7b701a +2f124ebb9aa3a2d90dc825470852ae8a959e10375ee5abfe70aa5a1cc6cb58cc +df3ccec83216907b8b80ff54f35d53a2d9c679e61c2cc9d8b3271c597d1cf153 +f5dda0a71eb2d2ed289a5b0d8eba301e7a4fe05e649d53cf3c6275c802b88fd6 +5508933966a5f261c898f755a60d7d3c95223e470b0af6ca4b2a57615c3e2465 +f535753c0c3d21f6cbefc29036d3e925a4b6216290abf8ddc86ec955157ae441 +6772fb59eb3b6280a78f9183bfdca096d5b46f938058c03b38adeb1b4f4fe848 +ff24ffbbab3077bf50b1fc474688bcb05d9e07294f3871bb2c0dbd266866cda9 +a22b2f3638e7b93d6eece65df65835d6c8396e5a109bb65d9f23619ba85ca9a4 +34564b9f706f2b0b7b68518f6e0962e101d6a2a83565cb1bc4342fcedb6e7394 +4d303d4ed4f792238531bd105fff9aa61c29bccd5d6c6ee399b48ebbb5bf3932 +63de8e873dd0775fda5861d1a9c547c01fc3cbdb7f9574f14bdb1e97280c024a +63a922657125be2d5f975e86c0e4b9b6174157126a9a06839530543f1fefb261 +143c666c42615933aace075512a988c9f2a46a449ec3b13fd118b4626e2a047e +fc90a20772c4ebe9b23eb733fd45dcd20289ab7d801aaaf5fce13807ebc84420 +fcf927bc88e48903f17bad04fdeccb76c7e2ab93e008321fd5a83a39b8325343 +59d4cba664629d807b624ec727850bcb92043788a855a28e86aeed0fddc4f6f1 +fd11b6f00224dc2d88248abb9245112914e92c933800336c75e10550610c7569 +e09c8a3389f88d25cb30f7be1a6accc5dd17b02f141f729f1b36d32fe93b4ce9 +75865054e448fcf1ca846bf004c1c67fb3c48a4ad2bd9f1d594e4646eac106b6 +7e747f2e64fddd88d076c03b8d7fae26b53dcb1027f92fe769a8385e7cbdfff2 +e569a107b76e592fa59f8d92e9f009ebbd872a09f3fd3d9746e8a8955634858b +4d4d967be07f8999d7fdc0ffed37e83f865469901ea075fc27e9a759a50dbf02 +a7a1d7031c78c9cd66e359459469e2896d6d4fff36b7b2b510d66761fe133053 +b2d64c8199558288054b842da2816588a898e05f2db1a5e11813ad89f1660910 +410c531faf42f728cc1b34188084de2578dd0f5458bab3c17da610b7d6afb635 +8ee66f8094436d0c4896550753f4a06cb566188ef59b536ba03ec04ee8650a3e +3f3a932b61c940bb0eeef0ef7c1301ba52e59a904542ca2a9bb82e1e03500a04 +f818f8f747d3c431686d543e47b14b37cd1e44f021a5da657aab08bd56cbdd7f +453c331b7041958d618d4b007f5798cb49260ab59801977df6eb49d3f1e609a9 +c862cb2a297a2acab8d2ff5263f40fffc73078e777863f7947b0419b6026b7a9 +f1c14bd344902c8837f5a5c6a7002984f40607f8dbf01e9caa04aacab39ee10c +0509c706a04db09e08ecff57cce67da05ac8dc14f700b2ff731d0799236646ba +68f305cf7f79020dee5c99511a37b63a693339706560635dcc6bc14d5d12ab98 +4ec26e657619d2c6d8f6490e55d3219ea28c69cc92c3f67bdc437a77fb9b320b +ac18393b3fb793c308e92a336b174f7355710966c2cd8f1f8ee6f081f0c3031c +58149c41849c763fc6395658dc43c86f5488404778235d7f066b3654b9e04d36 +786c1a766e2a2e10f870246bdc94e9241267d7b71c0f4acf0365d8f8dd3c1c1b +178734bf1ccb8d202929f2e956b4f27809fb2e2677162c978fc098584f510765 +415d6254734a525d73c92050c3a2dac12e1c037eb2c1f1ea479cdb9a2da0e899 +05b9eb18eda7a314654f7ecf608531be3cc30bb8abfa03102a670b87b61eaac4 +5af4d898243ac70207fd1d5803138a78744528a47e9e371817674f2ca6b97a59 +f19fe641e8e121340daf52a2ed995658806777619a6b6dee640a04b63ea9f446 +f4dbfb071cb6f6b4d82e85b4be34c39a4d2dd417aa93e07fe3b3ee3b53644510 +4ecfef4e1caf7b89c0ec5c3ae61ba1e958f114aace905f7cafe7a2fb2cd17e91 +20275a058ac69193c471ef47490d21770792563a63d87e23d8e1e6158fee9510 +eea1d2bbccd5f8e28d63c04bcdb78b3a49d640825559634dc9e5625db3b72011 +85de810c60eea94efd5e25a04de8cef3566c0f4b6a92ed6e58700b5598fcd65d +42c4ea8efeaed8168f36893aa2465f7f6d5d3087763b4f2a53b38ec3a61173e0 +48a4864ae6a6f6ecbfa1e92f15de678eea897b0776c7fd7ba192c7da0277699c +a1ba6c9516f89ad044c418c24f8af15fdd129f2db45cefe186a20c6abc895c94 +241a19145c7f8652439fc92f8ee142abd14bdb4f80bd43c3a3aae6cc8c77b759 +21b42047c0e374c123d3f631e25bbf1ab42115927ff52af0c3c8a31cca288d72 +126fa5bfc2d54aec8d05488348b72e80b08cdbf483d994cee779296b9357fd9b +addd288dc5a8ae95467e485a92409afbf3497aad25a097ef8165c40d802bf74e +79f08b2320aa4b110076d4ebe15d073d0ee1107ed6e9d58c05286c62f4136b40 +4a89129c66c1d1726c99b8cb4ba8bbcb6b3b4e73a11cbf11354284f23a76e0f8 +aee94bbf4d661739b81e3b47d5b4ace66f695001fa09a18a9960d741a8cdcd4c +4dc1c68c0fcc38416fa6f7877befef5aba8968621ff6653653b3c21c8bdd0c3f +07b8eede44036cf8a0aaba353e2eb14cdc1341687bbf0ed1d1f910c6ee563179 +95bd02430a3eda60eee5d36abea5ec10e2de1dbd9e3cf96c0366b602ff976873 +3a49d5019640163949e41eb4073fee6681d61698932a4d8c613b686bee37bad6 +ee7f19ad012634c3b6aea6a4d44d1bcc018f57a72cd1b078ed3fefea13f991ae +e6619bb1136bb64b271c96ac8b4290a34040c3d56638227676d75655abed1eb6 +d709082d70698cbd5940cde861d6dae8a7656d6772b89202d376076e6d530a2c +c1ffca88e2aefd6c4ba2f3dea6881d835bba8d433e18a067bdb7dde867edce0e +48d9854f21126726dfcf64cc97831883e35fc429be7c8ed512b3049b40af8114 +35477c782c676d374dd41673af8e4d3d929054f1cb3aae92a20469fcf2b0ebf3 +55e18aa050c89b1f35c8dd7ce1f26dd542d6c70af4501c7486a72cbaacf5624d +66dda7607fe961681476fd54154705c0b0a2fb1f8adb4d50dcef80ea10b341ff +d276e9e12bf4a41aaf9efff1b98a4223221a58eeb2c094972c4c61aa9d6b16f9 +a36fc6af6f121158c9e3d3fc47b8b716c785c0699703c91b80a0478a391ecd41 +ae7d56b313ecf34774933493d949346ed190a7a4ccb7e7fddc8da3c77324e9ae +70af63b469cc3e8838d61784dabede694c35cfa46f1396296424ce3ad1dc7d05 +e6e94624065717493ed3dcf92620e88472118ed0981ffbaabef21fa5c708e3c0 +349c89b88fc10cba39a1807c8c74aa70829126ce906a351203e1542d43a45779 +59e9e65bfb567e9bb7929077a0a1dd08b089ab35fcccc96d3a6d5ebbe4860fd4 +3c936648b92b2d455f979d985bb1af8dca29859224b2f1e411c2cf9489d41dfb +75dbc22658a45c16da828652dece832db5dd454783bac82eb4a33a4d3b82f62e +a36ef09beb6683689077c8fd089efb46549515ffc875cc48aaf4152fc484782a +4bfb4b2f38ed7ab8600d0066e27b03b7c4c21643f3e977d1a9a830e714d54b05 +04e2b7f883e9ff51f49621e53edac289052e44dc1099aba1717391973f827b08 +8b2c076e40abbc61fb9ed2582ef2484e7e07a7341defd54da7e21f16c071fa3a +51aae26760029cb64ee948c4a54725890907e94804fd221be309b33ec2901dcb +95be395576cee7f702a03901044054423e3aa0c508cba6f545d1faa5eeced999 +f0f9d4bfc5495c8fa65a1f18aa190bc11ea45ab16140f8ec88d309648c64eaa6 +57210b86df19d8d9ae5b98a2b74ea37b88cea4e11c44f879cab4e7510ce79079 +bf63192ad4904b92b6f622e535b538f246d802e089ef1c8b78666ac83d20f864 +681183aeeb6b4043afef1ad4cb4d5ed2d0bf8fcc4f1ee159c1291050da9a52ea +fdbeef2e5d5b2579967b4f33aa310f8c726aab7b9a0a07523a3c17174ed67a37 +bea1fa202f75ef9dfd3c597f3d983bfb53ec3d5c0170cf5405ad3be2634315b7 +f823b857f8854bd67da9ff0a01e9950bb0699bc2a4c0fc0387f336ba33d7ed71 +84d531f2b0bf886b562c2ed2dd6fae78762d409ce0cddc96a7161b5b597fc154 +1a1abeb0954146fcd3e44c93295c709e30cfd0b7ed5eac7cc4eeb0e99dc8fb07 +9649645b8c590850ad20bc44eb2c4025a0a568ddeb503ac1c21da965ecf9fc0c +5631cc74b3b0ef2b9826e2b4103ba3e0011ebfc2f0430afeff63ada1a3bb5568 +55bccd1ebab67ea9a04bc971ec6a055563a71e362ad3cb79d4c1ee5337ce5f87 +098a0ddada02c19cacb1002146bb3631beb166500d1fc9ae7b88949e36183f9d +86a17a36b0acf3421162cf120180d3a436ee5f6bc937ae7cf18ffeb652c48633 +20ec0d42bf09c22daeafcc2bd681f19bae1f8ef7e15f5e09c4beb446d7578b0f +49f2042482b785e8543acf5159a40e847b078629e632c5620b86e0e539b6b4cc +f78da4d96f465ffe472fac5ebf8ea6e68b2310a558b9ce3ae2d16f0bd1a1caec +e3e7ff8ef1ae81ec8fe81c6c5bb7315165e89d753987eed98ae9f2d89e3336a3 +0fc24c0f8c3f2ea135f6c306816470fdce5d48a229783f3d1f332b6f4ac565a4 +0b1ed85630e64a1ff78ca6b92d47d317064c88124331b78cd6caa7c93f5272a5 +123db565c6b798967e149307118178b1d4a0417c95b2df7d2867e15e7d5574a1 +4f2146a5377247336c09f3e4e5b45db385d7cc90a17543b86d7c1f77bf1c5182 +ef3d26e6e95b7365d12d5845301ee48f90391a8075a80306348637b56f25fb0b +5ca4f6b8c2041a5697a182773b30208c5afcf5c9acb8902dfeadff795d998cf9 +b3a8abb77f90c91542ba110ef727c7d9a13696d858bcd567ef5d64ac43d26c20 +a9aa27606e9f5770c3cad5f8a9a527de7403ea118c8e43ea064e6a1da9af3382 +38591437dda2a87e80a9028459eb1ec3411b3f24f27630eb7e356ae3548570a5 +8bb9463d1abf3b3608ceb02aacc7c9c06ce283355e5073b2b445bd815d27708b +4020e90cdef6bf39de645736d0730278dcb3fafd44ce088ab70287d9c767d49c +8ad8117251fb55718cce2cbaa17d8494369b3ab37ccc50484fe7bf2d305210d7 +e011d36728405d1ef1a73f9e53e33ddc8fd38569ab2bf28cc07d0799772ab6c9 +6b8e28f396e0938dc86b896bd668768493ac290cca566e84a0aa432832df3b10 +8525cb08ca50ea7d71eb8d64e5ceff15da8a9c89849e85269cfce2e09fbcc42c +28a3d675d9f75d7d63778deb63893b1e7676ab4408719ed6e3410b4e2b783013 +de27eaa26e7318c372ec61282404e7cb9f7b79d2a65f8077f0a7a1733538fa78 +66b32437cb5fc67eae875dd77374d3f2c3c082f2eccbb5d7887e49ae1adc0d84 +0f5171d843ea609516da88bbd906a8dbfa77cf4e68e76aeaf960cef82d8e8f9f +7d03eea0c16aabe9501fb6c1993fe240b8b4804d92bbab0bfd58b8497e45d410 +033735eabeb4c92d17af8b9c5dd7bbf93ca4ef8010407d69c35a2b5897ca56ec +920980a1c8f159520e6dc28f3a62d6e7d995df93447fc8e9c19215cef25dcd62 +c9a19e12862f8e3bf347561addfa34c9e85598b68490553cadff9ebebe1ebf9d +954bb6d27608acf46322ef67b6537ee8ebf6c16b97b694641e9f2858fb9dcac6 +311e198ed43c34aa0a023c1008449186f2659beb9bf7085cf7a7ff5dd048c910 +66e704075bc9d5da90c2d26b14d7ef8e3d54fc72703186a8453b83a7bb4fb5ba +d3f796de88910b843c9be15ef354d26bd39e1d1503385a169f3f92b16f3f20f3 +1ea9cf4642d5977fd23aa0e13ca82377ec95fa4b908eb0524e2c573e42ecf2bc +90c51054a9a2e0cc8e93924a3f71edf177cbc656ae838f0542833b6deff1f990 +7d34eecb257585fea135ec1081a97818479c80215e8d5c4fc9ee6e9f68781682 +85e8873da0a1d6e44b3187df9a0e9cf69372d9fabbb11c9cb68b4bfeda609682 +dac5b5e18f004096c42ed39016ccbf4008fbbbb32ffbd970888247bd7d57b1d7 +11d4b5d76fd339fb769254a0833157eacf95703abbaa0936bb10a59e9149f070 +f82daa134f97f0e48f8cf9d508523e98d1e331e159a0c422866620aa859a30c3 +ea9ba48d4553ba65dd3f316bf64c103ca11839f2ace974e4e26221ad9f6741a4 +5004d4e3cd24bb296f1c58061f245792a5999a8053b246568c8c0dce7a030d95 +77824a46638ab0e07dd74ba20e76e28ddbfcfc27240998d418e9ec12cafb7dc1 +7e5916bdc46a59f31b3dca99263bc1c785aad33ac1aa0c57dbfe09d7757867a5 +67b47395f5d148c9ffdf1bb401e216c79f5ea233cd2a5a82c94e24f778c25353 +145ea4fc505c32c168cec430b3fae9e69a921daf0d5b2afbed1575fa115aaf2a +61f1be743ecd301e63db4996958698cd1f27aaf66adfc853cbba31e0f98d8e15 +d2d643c8a3cae4d421a52adc0cd80d2ec4ec9e9de7bdb1315b52ec72d437746c +5c91204e96e3bc839aab8833a766a7b05a223436e3a3cfb5c689425360fb7fd6 +508f6993fd4fa79dc4612ff9faaac79eddf47e0da29d6426508ec4271f1b87ac +446f79d28e672c5c04c6b46e0d1b102cff6b9700ba8fb08b3139d9ff06fdbaf6 +a55128ea0ce3adb73fa00fbfe0450156e9183f6b91889d8e4ad6415f8438952b +de7ebb125e4ff9c2e357a32d3707cad278b9aacc542aa83898e6a26e7f8719d2 +6088f6be110f7000a3a4b48ab264f84d1d7778629c41e0a2fc2d34e22382e1ef +e688ca04d31119c4c120da10b9dba2708bf54e3ac3eb183d7f3b5cb8087249d5 +d4fcdfa9c4b71b036f46f720ebc0563f45199eea4cca13a5b95963a677a5b6f3 +3be08c9275fa8e66823fc04c151ae6793919c89185f65140d8d1f6772927b88c +42c0d16d08d563f5b93e05689e7bb8ea958f90d4e5eff9bfdc7a5acbc29a4672 +f532776c79f34339983ccbaecd33a9daf6fc1672229c0022fbb13ae37f6fc27f +1107593d8d88aa67c1a76495f5f2e08fe8d1013bad99b694c1762ee5e1bc100e +9bb119a159392c286fc689dfc0693fb911d42d47a0e3ac59b516115b12884ce6 +6473c70272420338d03d2ccbe9f96e4fd12416939e92e52e3eddfbad15206bc7 +9fd633cff17ef63826879fd701f275b5fa06c48f462f4f5f9ff98046827c37fd +91e254f95a14b354a0b5759d90a75eed92f126191d6437a81d538c7b55986e2e +18523bf547845d77a3ded6c69ec5bf558094ddc40a6505c938ef395d008ef1de +1296388919a9ce63ff38f476d01bc30445338735c7fda0359d03d58f748f4a28 +ccac2ba01879bc05a44fc21835e4aab1204b1c6b05ecf32c8247a63fb685a523 +35505e2be2b0000c7fdcb1604a6d480a1a5827919bbeb66faae78ed7d27fa8a6 +436af96fbefec3ee6e8f80cdc4ba28a65138b6b18671839bd96138795bf389bf +2298b851db853c7906178a994223f533cf3b00680dde84aba13ef69f8191b7ca +02f5de337081df829efd5f3f6a435d6d805272afd5b2af3eff829b14cdaacb31 +c179bbf59a3b10454d0b81e0382fdee3cd5c941a2c6e6b446cc7b08358ef4409 +c2a4e6ca109c9b3dfedae8728f60b560ed3ea8252d150e11db2b7fe19c8d5233 +1e8385afa0f792ead4c2ed5d3b0044dae4e732801724de12d360f0f47bf6d7fa +aeddd62fc5b21f4dbea6ef739d1a005b141d4ba3ad34b9c34257ba5eed4b2e85 +4f5d8d07e0ebb4bc6b70d5a5260c7c0b4cc7bc1044c77e8703d0d59c9408f103 +6737c15b3ad668dc22066a6198967fd8653ba004737f5394445da06fb344a4b7 +43a1debd846c52687e9eefe5e06ddbe8c8126a87971a80d67f4600f442220b6f +4c41f388645a6fc978c6dea9b31e09732f050e19ffa4b112771741c025d610b0 +6e1f8543890cd4cd2125d9238d008091ffc2e78ed57b9a6ec5113cc8044c9372 +f305f5ec1a992907464e22188c13ea10b1ac76196336222c0e052ef963a1c6ae +df38e2fc92abc00d5a8b6d8cc608d670636a15cd41da8161e03d8361c09fe713 +dd60041cfe0c82f9df04625f3a8c01f1ff3f9f2d571e406a5775626e3dbb7d8c +1e4aaf46df0b42e8b8f9c2abcdc7ccd0b6b6eda2fcc1602f0b777a8e494a892f +d3cb1521199cadb66fcf60e6d9163a2ab0c2cfdb20e897a1f16555d97c2c91eb +946d05f5905982ba85b77ff081d1c69f73d9014423795c4001af6f9bd2e484d6 +91fdc2a911be3c9185b28f89fae11ed94de19cab9b52e0f52493707e73de0e31 +f9d558e75bea05a5b02f5918e7139ab065affe31956ad54865d0097c9582514d +99ad462d1a4de2ab2bac081e92ccead8c03318b8ea7f6d6077a779f74173794a +59982dfb57998a0e64cb6413d774120fa51c165210b3c63678b0204d326db945 +678869868bf4abbc060d9961c03586e3603d01bcb12ecbeee7ef95e89429a2e9 +980c4c2d6165cb22670efdeeab861b9bbea1b10ab948c9e99eaaa7f0c6603c29 +c67bf2d42ea6e029bbe2ee4f48634d7c60cfac1cdab4daec98705fc8397fc656 +af7cfa465ed1f7ea9c0d1c5a86c5a33601d75c0293f9ec0b448fec40e348bfee +4aa7a6d1293650c7773562b31cb8181535b3e5462b6b9acf3f74fbe01944512c +feba186065cf34877600426abccae5ce76bff790dc03bf0758b64e5c95010a10 +ac1197e84514cd9df7ca150d0585a09bdbd3dfa86b6c8d328f4dc8ceae0122ea +d7833cc21d6628c16003f7fa5e28b392d80a246483856c63dd35233cc7308ace +0bea9a4f2c4e06e544bb2d5e412bfac62ec648f9fbbc488d65ccdb2fb7a6a3f5 +c682b805a16c6be9d03f4551387d3b19ec6f2ad0d2969041b18c0ed96ba90d74 +cf0c9e4c0812f2d98e761afc63a71e58e0eb5f4097bd7e72e7d650dc3a2b012c +9329124c1ba2f4816275aab0d145103887770bfc9e488ab635245a5c8ac03cb7 +90aeb5eafc4e99e70e37190bb5012a6987ecc403b2b54b0a3a0bb30587e99fe7 +dd6beb3a3c8df7a50b4d5c350d7182e4497354eb5538061458af62d5a111ce95 +08a94bae4a4b9abb53f2d4395bd6fa4c1da13e97e4db15c598468d238b81a78b +2a24530b43d81dba1f265581be36f4a19b5c51d7aeb0b4e017608656c6ce7cb4 +adcb33a8ff7cc76f7ce54354aa76fafd4958b9e1ec9936e587ecd4fa75e3dc0c +d25ea85d744d52c8a6228bc4c9718ec43d056412b513e141a139f5c118a44060 +9827bc275c901b5ae9b6179a04513b6c4d039edf8cdb3f2c95b43316ada44146 +f9e7fa093fb2acf38891492cf93e407ca813da0ba34a3da595c346d3354c1f81 +2972d78b5fb3d09e413adcceea264a12da69451a786db4c4ee8f7ee2ebdf0854 +70f04388848dc5c782f7a91e070e1b79776b9254e27f0a0b3110c431f8fb3848 +294e724802de1e27ff3cadb8fcbeb920e7967be152c10e299eb30d632f54fe57 +823245fd26dfca5036c4cbebe443e8a4a21d1e6ef3f1dc6860613d908187ba56 +dd64f85dad9db1504e7f858cb388bdbe829e067c8dec2125c764b79607cc822c +fabb2b2cc93b4d5dca0568057febf7cd86c72762955f2c9d7e1d734da77b0862 +60915afd088ac2b113aaf06be481ca2174fb224746e26b93175da43dbb72f4d9 +68a85dbfaa81b6802c130ae529ffdaf3dbafb39b4c55317825b3c687738f4370 +621a2e720ca0d5710f3a1d963c424a73eb88af68c3dc7ec0996a11babf14c823 +a3d52369c42e84301b47c9ebf16e33cf02d1cb1c872b0ac7ae59361d330f5fc6 +31f104cf221a3c6d23b9314dbf3190edf21331787a0ca1d55507eb76fcfcb8d6 +da4e2ba9d793d158998c06733cb34dc891a8e296a48bd0c0c4dcdf4fa27dcbc9 +0d7d1ead5f56a22336bdf4818f4f8ee4df9b82223389507725837abbb193854f +fb0ae2c55d8259aebbabd35a4dbd3433430618462e9f23f91885d0f3ac99bcd4 +9d1424f9aeaa09887c06c6f62e07339b3e4424fc920b11bd0dd53b200c896ae0 +ede4931f85766645f04c94877b0364e6e7e2a0ace71347b8ab0323fdecf82003 +ad75a9390ae1d10ab82363ba83bbedfaf24225141a6033bca3f59d065926de8c +efcb260f5e394ffab5e182473154b81ea98e5cbec099eff84d53b9348f4b081b +9f120e5275d4e9490044fbc2a9d275b84a9a40b8451522e79c2fd383d5866c96 +84db0c0552cbb14e67ff321ca84793e8ab95cac35e71ae4e20958a5b274be4a3 +641cf01e9b50487a9263f4e60a7ecf6a80d4e2269303bcf8589bbc7d9306411d +1f95e0b59d232b303dc030863cd6a5f25c769dbd49e150f56c4b0efee4c096e2 +130321e1dceac61b3f45a808fed8ea47e0354eae9578991d88c58526ba635f93 +591b3f8debb90e2c5a73050766868ab418e6bc1246f9a200c9010de827147f47 +4a9a35b39947767a2cf12774083708e7e7d1f25f75f1c27806a7e40c5f4f8456 +8bd43aefc069d7d862b78bdc488717928c0a283cbd5e57ca76efbadac172a6e6 +28009c10d8047648c549de7f26070eadecffad1e954185ccf9acf02ea2ba7bb6 +0730a1a46969fe637617e9283cf68ba3400fbc0bd9e24dd4ae4f33241451c4e4 +0f8b996eb76d3b47f0dd0ad64ac75b6e12c516f843578290079aefa03c6ab66b +8063bfac6b2b07d8a94f636626b7803ff277e963222d738a6c4cca04592c9687 +8a9c74a4c528baafa16a2d87e6182b7a6836e901b558d4b9ac7c4258c2ef1dd4 +e70dc0e985661cae6535af3fa04de9be151d75502a65b9ce9ca88351728cddfe +25bcd365d219ef27b7986cbef39cb7450ae28826530e0413108d08ce5c624dae +b1906f7fcf4d83c91dc89a1165a1ea5470ea14a91634540d7e37379d358ffdb9 +38d3c40cb195be0259757ad84e0bff7271d666c62bc9d07dbdc2f463f0cdba3f +fd33bc0b7b566934159b77ce59a431e837c913cb8a3159b4b665e0f0cf237dcd +69c056d03b39db46d40ad75d31a1f27e28af37c0a3d95a6bb89844cdc60939a8 +a2827f7e9d64fad39befbea536b519ee61d1db59cccd0c1c62975c34fbdc4fdf +a2c85d3122b83d27a81ee97c81d8c1e280d67fda2c89bb8ad5f9e34c4408278a +20ce29f25391b4aebaca2bfa94855b58e53180cacd548d084cccdfe203399397 +3b34eb9758acf3335999069b05ca7784fbb467619bd48008c129ce80598cf595 +2d2263a36ba5a5b61d4ce7faf05e651d26d9a96ddf4d6e164a76caaffc7b7439 +37c2c332e496cbbe3a15e3f07c8211c9cb6f745c0b95a5bf36c55b37056f5159 +56a87691c070a5bc22adcb697165b17de566c6ae87473faa4329f9d34b84a448 +a93b1ae3c3b05dbafc8f0a9b246ab12fb5c5f21544d790a03b0772c6c07fe41e +561c04d25290ad18bd24674c5d557dd73a1c022c4a0c3345c4e97ab872cfcd23 +93926ce1f80402e6f1e32a069e26388f85f58a6c2f8d37185f51325fbbcce7c0 +0ea9ce821951358816a3c35d9a3ae47c15a429feeb24ee9c6e91e7e4f4e4bd5e +8e9020451b587aff54a9733beb5ddc14d478ec52011d172e308149f6f68ef4a3 +af9f56f2734989eaebb7b1bb96153429d9bcbf3ee0a6c2acca62f586b506368e +21494002e1c972624da592c5e0e9a316482ef500dcdbded7f4d7331f7bfbcb0e +1ecfe5e9991d59301b062abf6cd8e3543c24e948bfc730d8344e0a323efc5e4d +b1c037b366de5ee1eaa0a0e74f39c7b1af40de37b4327e620df1bf7eed4dd9aa +fd15a96128d8f37f1ae60b6aaffd96e806e2c0b29dd43c7c3ccd00d936f76924 +54e3234ec6529a77332b11a25c2242c53aee5e5d128f5805fa007d972eea2d9e +fa55bb624acd378707405ab37a49e129d003fc9d561ba621eb71f2d1f0342f68 +fa3fc028a7f3ece1d94acf6c4e91eab1656cdedb6ecf4925207b9e547cab62e4 +af9cc1bb900b02d55a89ef5bfce1a8f121d0c80276d61e41bfca88674c65b4ad +2d66dadb8223e8386d40b775d1195b6bc6207b439b2c5615bac548dcc041b7f2 +2f84d9c3d57bd7d58d95c455d74cdba0dafdf5333988d94aea34d01d93a6fa1a +a034f7cdc3a486f0eb051a55a39379b78ea908a450c286b6f7902c1542b7054a +be2449ecf445f56a5a4c2ef2f0994fb3b3adaa35987cbbc0c64ebccd1aa110fe +379f36b8e590195f4409426ddc515ac37be56a6314537d839e77dca4190dcadb +e423cc230dc717b9e7ca35647c3113fa2e27270079736680b0abd1905125275d +18a3ca6ec043b23ba6d9f90b88a6cf51bf8aefe90c25b5c211940058962ec96a +c03c144f18a1e1b13d5c871c8c5c7ad18b0c3045c7db5e77d6f5ed211bea4b00 +0b8bffd69c668c98bb08f4207a80247a80483fc8fe2484483177d6547bf66595 +4d7afc64a6bdefa6d8c12d8ca7a3acf95d56e6f6098345d3772369955e3ce2f0 +affea8a2475757361e2001976de029bf745d701cf0433997ca78c8cc1d6d130c +692474ea0a9114359f645f722da96dedfb0bf6d94529326493b6b18d6abc70d0 +c7ab6f8b68a9ce6538a1d9ff6e41a151f37e96f6735d0fb76cee4d502d13e4bf +4db0ad2c84d44596a66ab1fde477bf14cc7e673d598cffa89e8e8fcb1575890b +4969a53570793d3cbbcb693b09bce2ea64c33f446f3f6b71a976ec1f960060d5 +b80631526110b7aa266b23eb27b1e565b8f0d9b44f4a90c57cfda6fc917f6efb +f05630b00eda90f568c583cbe506b9b91314e31b1738cfafce12f8a17a7bb096 +631effaed2543a732fcb2e5d81689982399e1048ff6199ee677e859f36cb6070 +10ea3ab6faeb30973dfbd8b405134c96a6d40d5e278d76916ef4b66d3bfdb15b +f0dc3f8cc169ca142ae73e778ac690e1038e8b5898f6101ce4d57faac936de06 +890b32c3768394e0d94829f51ff9bd315fc44e33a58394bd5a996ab52b1dad68 +d010935f5a0e7f118aaf9fb42dbac4e642d5b7ef61e43ec2a5b68a3584965c23 +f842dc4cab186b39650edc77dbf52068153c875bd28e4bc30f554b88436b40f3 +1500199d497958c28391846a00f83287fb4e14e508f8954b6ac61c572e634f09 +fde116d3cfb40b73573a969774883c5501d738fc67e3f31cece099996950efc8 +e431c63ff4eed98ab8caa0ed1996ac8530f315b2b62b882a6dae49e46c834b09 +c3c0d35f27be4aaf09e0abd445844c40754ad0c29dc4fc8a3569b182003b24b9 +cd79db88db16272238f9ae5f0a5f0823bd0b174bc25448d9ab253654781a2e4a +51a23e73e22d714e45ae27dd5e8cfdd9dfbe032530765c0751ea3395fb0c1380 +414ef2cce4944f56a2a14a564e41d9409e1929956625b87a17f64ab0131e55b9 +cc1822d73b578854e8c26ae0d560d405dc8a72ff40b240ce00d52c3d8e74e30b +57dd3f7686f6ce18805b2b7757853e49f956abce93dce1d2700915c5b2250ab3 +7ee35b1606aad163d121c4eafc2ff9d7648494db513af8aad8a3fd1ad32291eb +901f9afbe0494a64a99230731841c455d82db72b9e577e17676f53d5f1f3a98d +ef88460a898d5b5184e9e1f65ad43c108f679945bd7d6c777e131fb79d99c74b +e3cafba83814d984752e99e7f86d1dce93d00615d064427f28148b37a2c49668 +974f6a2f5de659b42d04e73d0e5137204b5e68288029327ba9ad8d9124ed4560 +1344da203d7cc8a26af36454a392193657cde0fcac0ba0fd379b74481fc56c39 +63abbe29416be7ced922f0ff6ee6c2bcb032d83bc4fc0002578dc1943549ef81 +4b26f5938980e2b607ab290de624b06c31ca4eaef275212faeda9bd87aaa1b27 +3e8fc6882f298c8e503f59279f66b7b6ea576458b979ae92f3b6172a8f6b9f31 +a7fcb1a241891f044e20a29cd948ca8be18059e01381f445b75316f8fbc77b07 +cd8558b13dedf690eac3715afe7b45421f857d7df4df4229e9a5d5f81ee905e9 +6c63a6b1ea510d0a5fc7223ca5e14bc2475952beec5de9542c692f720e33b41f +d7d1a649d788964430b605a6092fd5653edd47967fd72f8251bd9ba5b5347d25 +3f4b2329fabd0082b71b517d69afa5ae4c6a02983d07b905d4bccb1c0a249fdf +8c6a8b12a7728270b4e90c05c1f6ff3a962ee8f67fde611fc39d95a2ca550290 +8157f91dd7a967b7b7068d1570885f763ff2ab8d57221e4780c5e8e981ea1d8d +b703653412e13b2e99b9c6fa232077894aae6afe819068a141b876b20534d7f8 +d7e2b169dd5720f0170d3b801741797b7c775838b4b36842de3e3fe231ff2a5a +57421433ed3bef75a860343dd31092f0bdebe47cd6a9881a63b55e675db769fe +182a8967fc6829a1fe49d1b25bab86c04befca59b7fb9458863d779ad8df7b42 +835ac1c5a6d16c4479ca09eadc16742be17c1e59ef1ca1fb725db9e871b64db7 +8ef30f0e954be11aff43b674a527f5de267f2b52fee2e51a6681d5ad10e1d822 +c15ab0ca73f25e228f390c450621340f99c4870829a7e223b5bea167c7f6b968 +e2f7f7d3a5c3cb9bcbc45795e98aa6013bf142e2410107a410c3072b96d24e15 +4270a10457d03e9ee7425a416958e991806b139f36d2bc9971efd6bf29e06e92 +713344c9b1a6bd6ba6bd28b6404a4c4649589cc6bc917ba6af0ac4e3ee359cd4 +48a9f74b9601dabec713b8e795e942f0fb90f15f27a8491689c14a5e71e56e14 +022233bd3591a1c7aa417b22f0fa2a7b02e30fdfd56011c508513c8b4385f210 +9b0f01a69b45ad5c701436fdd05d780672ef30122e6b33aea4164664667cf0c7 +3d3bea1a4778b3d35db869c12cba4fb99c066159bb50518bfa211096ec448228 +039f96dadc9b9600ec5e60b70c475bfb024f6d7687c156aeadde8e48b0625c3c +0aeca4fe017d4a18cfd1bbdc370ef6b1c7fe7c6463a961dd06b4329210eec8f6 +a172284470b0d933a2bf0fe7e54ae607f5fd17bf7e62be47db76210295e70f48 +3ee8d4c7f4350cac22004b68af0a1b0105efd86c72c1e6615c3d36e182cffe87 +6d4b4b2fc066d8b6de0283e1b64964cb0cf06a2bf9115d4a0451557602e9ed87 +fde4351940b3dca78d5d66db800efa7b9f0d6f4862323e541cbe078d9404696c +42c62de5fd2fde68deaaab671313f371c2aff793fe6caf4d3529450a9310d4b2 +df00029c115ff3ac4969f454c8dd4cde13ac7f8da419fc22e985063ff6429211 +9a751f54f6402b43d01fcfb86d7ce8c18a69993d40313b419e75a419f88ab41a +40a0052509401fb48777817a764192e55e2df39ea866b150339681a2c894106d +daca983773e1a280a661663f5d192674d0288a303da868f93aee92743504f6e0 +271430d963093ff7172d748b14c917a99896e0b71866050aa97e8d969d111de9 +02874fa90cdee0dee39bb6fc0cce58558bbbab4a4d024157546a57eba7c1315c +9a1c051c287b6e43b0b4195c1cfb7845df3ddac7005e22a861e82b1bdd1dcfe3 +ac9519c77e2a88b302beca597ca0cd3bcad5afd4080d38fa1155080570dab5f9 +f7f8ce9eebe14ab702d19ef0137c615f72b1b3509d3108bf7d6d0f5c7fa5a301 +42a45c30ebfd452e67b294d8ff9388aaaf3ec0572c26034b60ae088ff19e72c3 +ba186180d6f93c64202bc9591b441e303d5550c251d75ab94305979c9942b82e +3bc053641641077a0d203d5d6036f1c918173309f04d27845249d2b92911affa +84dcbec3baf6c61623f8a73002f9afd287dc162762a91f6698aac67bfcae3404 +db70f32c9d81e76f4145d8aae76c8a2b42557e79a3c658cb5ca8eb844cb780bb +dec028775a380862b6d5ee1d5195dc507ce3ced0aeb8938660b4c727d40c6e89 +e60ab163b14cc1f713999906fa5fc58b8b1d10044c17c4e32fca78d99d33cd3b +af638d37c1f396b898bd47776cebbd71fae4162012767362f833dd3f620cf5e2 +49d584ebe4eb183a253d5d4a85a65acc7ee764589234fa74a25849584bc6f9e7 +6da6323675bb14334c7d23db9f8da42d689c14691875712ac8f4263662ba9953 +76a972fa405c90a574ff35afb29038c4048085d6a61ebde090381207ee9dbb1c +f2dccf97635796111a8886662d39d7e3b2b79c9ce048f6d769f36fc80348eed3 +f4d5999faed84c8f4e37271b29d0adeb25c980a8c388afd6fc015b7c5d182f57 +78e9317db58e2efe61a6c3a63a2a0ef9a3c6152b2dfcb81e3c0d00c6520d1a14 +2dd8d314384fa63fb33c47b3bb3e2624fb1ffeb31f673df5105e024ac697fa70 +051aacb07e671787f6f76741c69ea9204ee1216f75491e1e1011512656f48b40 +2272666adcb4fe07be5b79e39ba3aa85774dd992589aacfa7b080fc4b94d855e +e9fa0afc3273d1ae161563c33740c5e2519ef806b6f3a4c7d832c46fa8f86f35 +8aa32b9b0c6e464e41797312d93fd25264b85fb996cce679586077df7e5fceea +9852d4012959de6a9002b4e67317b4f87e2229c9bf89096c32b8ddb3c14855ad +f5fffddbb24a63da28ad2b6028184a4c083f090976bda8fb60bc51d4c590dc97 +b80cce59290aff40472ee22afce117737dd804fbd43de024399081076cb701df +bae537473ab542a08b6a5964ad5a5026f68dded04855c34144cedcf8380d4a89 +a744823b4ecec5f225d26f128912c3f3822e51b37b7e5b6b29e9f1f43fa7ce48 +9ccb6b309bbb9f879527660a6fbef9d7f11fa0104f6d27e32292ff2247668b1b +352a4c244b53141263bf6f6842ae64f198266388aff922adf272ca3b360d8f89 +27f2aa449a42ad993382efa008c700fc74bc6c61a5348c052f247df465f63060 +49531b80c92753ae16a817af2e28182ed43f8a050ff90fd45cdd314b568b61ac +45f575948f2da79a035ada12e83c50c24f09cfb5ce9bcc15bd9c34479ed4ea59 +21960243fa433442b345cf568d78e314b2054e2c146c7c9a8e938b9ce3c7ab4a +2a2aba81a72caed7874134d4126ee3a3096282aa87b29949fbfdcc173e1df4d6 +a5957cec97a798e61ff9ed2d620f4e229041ddb5e9c0a787916374bdeb03d0ad +1dbe01778b2b86c36818e89839e761b0098a7d8db58ccb0e4d67ceb9cbc04e6d +c232c9fab1b2a63a24886b060a78e221fc964eba7f190f5c8d02e0e4711c4a46 +f6611940a8782fd1606a5975dc787fac23f15ca5bc3529af7695abd9b259484e +90512c6667d85d78862e548984e8443511abe283b7714abf122110eb21747422 +c4fde0949df2811451d4bdafce1846156ea531a15a7f8f54b7a117f28885ef86 +5209ac012c0ec7641444fc4032e48c16d2dfbfa3bc12961d5d1ecf95cef74456 +df2efb574e4c42c80a65bb008defdea2e732b101ad7bbb9646874d2e799130b7 +208e1e174cb552d9fca89794f010525898a096c97f0cd41eb911c313efbaf01f +8bf26d7d2820ae5937abc3994e0129d15838bb65a43203901fb3f2375231d818 +08c5ca211909db4cbeaccc21107181a5a3fd93ad6398734f86eab4bbbb5e929e +b4062eee1cd6e18ef5a94b088cf6740b60b08ac496c6781e35d4be3c9c6c6150 +e25ffc859a51489798fa3037d7e2cd96399f663a9c3537649a88297effda3e77 +d98941953f41ee2973e7d80be32ee2d48d5c7d183f4608067c4a72f5067160ae +aecc4b68596b7f80222771698584b1e34ca77c54a0426fa5d3e009350f0e71f1 +bcc6eccaf7001e7fa8b23c321b0335c87397d1a375d467f1783d9488dec2f269 +89590d3a23b21539cfe64752e51ad95c351033a1fa807fffeec3589efc1e8b76 +f81de863071160931055a01d94dc2b8fad30d5bccb926a1d4a9ff858d98d9178 +8c60932d50307b5993fbdd530a5e25fe381959b01e5ce66f8ba694c95b4d578f +3c56d5cd9be8553cefe694b396407f46531c333f1dee44e8d1679133ae7163b9 +c9dcdb20ae4d2c87c7f37087e78570ff608effd4202caf7c2c64887e47617892 +de8f0b4006972fc32628aa340c05e7aba10d892a1d2523fd216534a0dfdd11d9 +db9157bf1febc5877179bd4d8c272a598b016468bb31908e1fdea32906963927 +18a303429a7e1b4240c382f2a02bc8ac9d28bd2181b576c09097c1a76866b5bc +2af2ba8a15427f9827036d5d85d76e0a9fcffbc331d769378b610264c5a4d953 +7b44cff644c1dc209da02b6134622f26014e847e3efc68c1403447e7b3f59271 +2dfd293e0d4b86007a8d9071958d979bd36a47c9e709a0252d61a1e7ecb119f5 +5302f9ce3accafe7dfd8bb2e1708c775143f373ca805a442bef5523e82ffa034 +9f2530b9aed89a8e5c81e013a7edcab6a906173cb0cd48434ad711e89d970762 +3afe152cb282db3fe2e105575ab5b75c00c3b1ecded579cfa23e97c964bb3e9d +48ec0ef42e4761f01ec5c12cd1411c9eba7ed00e85fd770a82266c71c841392e +8c8f2724203b9a44f09005b3173d95a5de83f54bddf23fec70058564161da59d +02121c675380fb0f0f7e0bdce96f656e46f15e2382f316c039826f091cc03e6b +ac9969207117681e0f472ca8b5885355020e1848d66fd99b378542c811f63f5a +bc79477067649055735f2d5a46a35c4133ca4191e6a75f798d6ddd8f72cdbd4e +75de4762d2bae425796b19a65647a3971abbfb29132f35e9accae847962c218b +4973888e3ac04631a358b57d1347e2a74544a70e219b2e6c4c0e4b9f3af2b872 +22f27ab269f3248935cc65135699eed4c1b85769da13cd156108a7d1cd894b46 +fa7e2884d180bf6962240b20812a6b89a49ea08ec6b5a5e8766adceb78cca7b5 +8b89a9c7299801939004db901e195ad16199998c821bdbfb7dabcf1a80081de4 +aa30d5653740803ec63c0f377eff0377d44e8aac6aa289b144acdd5207996dce +96359a17dd3f6ca398b91e86af024f0533ac70b186a940f96d7464fffe38e22d +f8e83d34c8011351ce7dac20a9e35c2460701eb62ed3c815d43dbef99828c025 +21dd0f3680e4505a5a166696d16187d6e85363023823e70f41e4fa7b796e8608 +493a3b3a53d575880f09fa117117d6c946fd8782637bf122d9a8421807105b35 +792dbe884b02a344bd235328c139bc91aa524a107197539fdb2abdc99a7113f6 +176ea649a61e4968187bc7a97475b063d4a52d085ecd3191137c4ea1579691b3 +8fe05a2d3d223c7e5a23526699054f254236b96bb3f799ae176fa86859acc325 +44e0adf45ade76a9d635ed8739c55defd14aa6b3aa86f3504e71176ca2fb51e4 +08f7a7b97ddbd73cd848390757f830abbd1e5437ccbdfe9117d73875c7241f52 +c4d8854a3ae81ac2646700268c5fbbcd03a9e6772dcb7d5b7f2e925a944f89c9 +0e7ad30925a1737a44bf80a83b5a68733ca7f30bc6f47150d337d13f8a9a33d4 +b94fe1cfd05cf1714d6e0496e21b4e6aa498cf59f4dfcb30625cba83a53f524e +e90455af7c17310107b2abb1a287fd1c8489a6ba6195a0f4a18378392e860976 +cef9a48f00b7fbb6c04afbe796a3af0b3a7ff9ad53c448011709d4239ac523d4 +7286b3440f7f9abdf19e4062c415b5cf1e5b1c2ec79eff451643517a7cee43c5 +56f2d68440f64a2eb7f5861dd3de1175ea67b022a137bbe8d3ea80775898100b +f29cb8e25c2f816bac1cef6d3ce5c15cbc3f449f6b5db7c901a4e0953b38f1ed +ceedab0acb10df42e2cd6b4d231ccd752b69fe0627098a3f1bc3b547488bb1fc +03e0e97103cec3d60635a27b41826283796db8bc2d72e0b3b8ec3285f3ef5a75 +5f69a2be9f0e0733bc32ca037df0af3c5f29af5772cf1bce273cb1dbc2143d0e +0a0598cff5d570ed5f1821811e6c7aa8d9ca18593d178d55e45ebc2cb32a2adb +c29f52bf976c98491a5d0a6300922a3031095820cab7baf7344541e08740df1c +a6e661ff99a9011e6fecf6ffcdd8235824ed8f86e02be31440d93f7b65ced2d6 +d2381e370df510ed09b424193dd4202b8277c586e7398ce8e43dd2016f7e550e +644dea807151d35e8d3b3fb66949c92191a86bb236aacb255ff8fd410ec4d884 +e41d54d1eeb2e724ce43d96aa249aee87a9c2637c8fa4b8c4f9e28c23c4af501 +f93d7120ed9b1167983c3c87c44823697113d6614ed80eeced54e2d0f3fb44f3 +4974e6135949b26f352acd7cfb4ec79e30dff73b8d75a6ee74a55e427980f946 +87aebd0edfef0769e12d199b2dbef64565a30a698c30ab05ffd06d68310e55ea +93ccac06a08a530a7440d36f2a736af590a682a13b5a73689b8d8c00c5fb635a +71bea3db8b8a1e5006f1f72e38ecc48e40f73c39d473b92048419be4e5825bfc +2eb3a3130d47e541b5c714d5971497cd23d8a5abb6a93e2da1087bd4b2b0d841 +fdfdf7c17b92e47c9093ebafbaf1b9429958f74e79deef860b65c287370b4502 +26d5fdabc24c04b34f07a048db884927ed1dfbd19f5b45276b2f56ad0a5a51bd +9578d53562766255256c985891b2fb3d1150fe772faa9537315b199788b4a596 +39572838b9deead32f579f9ec94da84971c35149fcd7780a34497879a5422546 +74172a429a6b85da115f966c34de2c00cb11a1fffa16d8cc84b86b9ea31d9af7 +9cc851fd0bb6e2397db8ef7d0f1e98edc5f302f0c9a5b33950990d4019293801 +1e06cfad4653e1a4f5ee4be3a959cffc2231be88055c6d724b9d83f5f8f5ed01 +f4863e329d3c757cac3ed3d9aa3bcfc812407c8b10a78f629d8f660b42423754 +ed23a022797e478f8b25f6a3346374b8e285986aa1e19a19c3af7a81f14e6b0e +a595ec48a0c6a6e016c629c3f1a91043c0eab6ce5401267d5091dcc0c8e14b4a +7062627a065c66fe9fe068267b8c434410774a97d28b76024e171deb2306eb01 +84854194c373ef3659b489e337134e5763d16d00d6a4e66afe3dbd30e0b808c2 +cf044b277485fb807d66b6d0033d0157c5aa1dca6ee774406a7d4acdbb06104d +e582402782f0d19920b7c4c66a65a10703f07d30e5663b37688a090e7db49783 +b5b31e9478e1491c5b40325d6eaa41e35bafd45bc85c8f1be10463cd5534f110 +8369f8ea5a4895428c1dca59bde35cfead2dabb44bcabe96b27156abe4dd9a18 +cbb4dc7b5908715faf5db93a206a4f40a19060ad1c33474226482e8fa3cadd37 +197f9f8bbcf204e76e6e411e56c7b33664ffa0125cb0e8f7ff3a55647a841a28 +9589124c91519db94723a77ae008a7657949e8bf80388b5cc51585fad67bf242 +f5a081ff56ca0870dc9799fd03b5291474c63b83b771b8bee604a11a70e21d55 +3709247b92f5d26049cb3d2963ec785b68455bb485f30af7426cfd02faf10934 +d32c8d7b0909f993724bb7da23b7bc690754384fbdd366b14417e6bb59c8362b +11b7aa76af2a21b0dba56d8c04f14cc768220acb8dc4d7c60646c85cf11eac9b +710e60d1e02c4b9a078ee52c154abc7bbb5ed801087eaa68298014023f93af89 +bb257e37bb4ee55bdcc563b5f28959187135aeb95ee333196f6c0ad8e2fa493b +c819e39856397cd076f6ec77c2de08517b15cd6404306bc45963aaaa8adcd1ad +0c78bc5a53c2370870ccb3d5b781b811ddeed772b2b21d6cc2b8aefa894a8350 +48dba6afdef72f44d779dd9dc6ca91da09a9a825a12322a2bebc69cab203954d +1fa1cd86adbc7810620475e8dd1ce2210cbc056d586e4d203ede41398ef9f106 +b58e657f3ea69f719e7ae006cc1347a31b573857446cb3fdf83afd5991993c94 +95e8fd62929149e5d83b852423a0a92d3799484464bfaddda2e3182c087cd330 +e7c077f7b37b1938e3ab954edb0b98b8f25ab428b313047b6e66e6f6ec940d2a +8f9989ef2553993877bac51edf043efd752a82ea0a21a80f514b1ec69265d777 +e0e6f7b71bc23f53681ef43809a277799c930a1189ae11a7d30fe14c5df3dc8f +86cf3e329c494ed6cf0f08b5ac828d16f522985effbbba364440e78c27535b77 +517b9bcf39f6a038593c6b5fa7a7df8144df223272188c8e5b672f55d3f862c5 +6747225c9f48b995c9f416d519ce7e302c22a8c568e53fca67692d0485d9c34b +936b69c65919e2a1ebac36520c3dacd0fd0a837a8ab82964cca79590fa568eec +936b0df2123977d9b0f4604ac160ece39eb624d285e930cd59b30e26dab47ddc +bf1e601b39d3081be32eb3cf521ba730fbb52298732f17752d36758c331ddac9 +66478be91854a54e9b101a52f94b13f94a80e3dd73a077684192f88927224bfd +35339070cbbcfe6e51bc583b1d6d1179edc0409c56190e3f08a67e4c59fddf24 +9f0a430f6a2093bb7a9e32eaff050ea21201febcad5514f5ea4e1c790437a3ff +1722fbc4a51f4fd4e48653e6764bdb83195233206c6db692056e93eaad28fa16 +332517c4e2259bb6cf36fc5d9c923ccc69047f10e8bfe2f088b3e95077f4a312 +508ab431048bc2344a31a4583718c0b9e0ad8ab0ca97dd51debe6c3dde8a51ab +01b9ed04a58e7a2e73f34f7e2e8e9ddd7b99949b5f0eda2cb61ddab64fd0dd5a +344a20f03b6f9b3fed433329b8372eef9612608380f4916acc5292b7f5fda274 +e1b296f142ac27ac06a3bc96d5f4cd9d317a5318e69dbfba646074f2304849ea +3c813981fc03fea55a109aa1e174556401bf37aa870778a73eca9d2c60eec4cd +b88662527f7dde83a248475b5476dd935833d6ea8ce5cc912ca5897168bfed0b +177d4fe4c328f55625f35d11f85ae70e360c68b5601dd64681d557ce51e724ed +6e5cb05523f3860698b38910ef6348c9abeb14c645b34d08e42d84928a36e91e +999d15841c9ace2276b65dd78ee6e4253c27376ff691a11e640fea8573509b70 +9b0fcf1fd6c4acbada4957ddc2e9b4bd7444cf0a658f56878da729cd2e6c340a +3a3bf51132ceacf89a3bfbda4be6a18b0c5be6021076fbf6d2c5ffd4d35b8855 +d69f62c22621414d6dba9140f9fc62919d1f0c4b2d725cbb895bf04b874b8e42 +2619d4653d065b77f02148cf29931f52f94f0f21320e541cfa9b03612d76eaad +48d1c2ed840c390363994f75fcbfeddb48dea5af3d5e869206f42cd37428844b +e69d57813618c3cc6e4dfc270bad5a74023f38a379d101adc41f62173a19156c +580d2c9870014a090bbdca4ea89aa7c0406e8f73bbfb90808956903b4908fd9f +e439a4a7dfa4bf0cc31d89bd88c5470940a1a4dbd871b9c23518e5694950eb07 +79afe884b71caccb2f350154fd6b1f90482e2d9268fe383666365fc41c5b0c04 +6fcdaa0cc65e320103ef976f4aca093a5b41d47bb55bf58fab366d3c9088297d +49c88fdf7eff4920faeae791887cde9a1c9b2f2fbc2e23f7bb5438f9a5c91790 +5d9666ed9a3a780a02dce5386f1af23bbed00c476cafc4734015e367cf600916 +4654d10bfc6d06af5316c45c8cc0a5f92cb4016a2b351d6484705e9f1f9056ee +c530943ca1c9fc321a838fb02857f0709aac2009eb3cc38f81145d6ce6d44524 +da3e21e5701f972cb836afe077e6376875a953ba427b2b2483330dcfba0783df +c371f9cc79cbde94fc5e6f968b14c56f0f7690965058f6ac266a8baf2f545336 +1b99a92db5f63cb16cf850f13e0c18a779679b03ab74f886b2357c612c0e2f38 +2c72cf7e4b979f888d772eeb5d5dd2b1d837f03f7f9ebd613663fcb8b2f7fdf8 +c761a958b41cffc4b2e2a48fb62ce80b10261b96a23b00f6084819d088cfb019 +84fbae235b2cf56b391a1973bb09fdaf180f6ba062bac913bfe0762f196d1680 +f7de26c276ecc19f6f8c84c580b8a007319ee045a04aa6e492b347004a26dd27 +fcb2590c4ac89041c481f8cce7043c2e84033e9ca3810a63e5b272e1b716993c +48da6bd8aab1c70e28f2da5636a7757448608a7d36be50ac184c3e4a58d108aa +e1aabad61f8773a698546f22f22df892a2ed287cdadf8858c86eece0bb566af9 +a0e48c19ae49dd2389fd38f2937ad3e02c8a8b281088affa0e1c7f7829d1b191 +9c5ef6f3ced2dd0c51f6e18de1602df35f588503b25039b79c371d4ef75e6ce6 +7514d977dec3af3de9f7dc7ab9064cb21d8b35b4a7efe21b6f4681c090c55aea +1fd129f665053887abb1b5fcb09296c6226ceb394dee57664ca483e9d7496dbf +10a480d97ff4af0ce136c51d90c3d8c3734536e69d0bb4c066d1bb05184fd7a2 +374328b352f4cbc93c613309d0f83387e565c8114e38677ec5972a64f701a1ae +8ea54f1293f413123df659adc7d8e9eb0aad32ace9f2ab0f69a989b3bc58d13e +8dae3890c928697a353da54311cf1e98719a82ff91754ca207409b6c10428228 +f78907e8e9e21f1cce47eedf402444344751d49afbfcb460b6d233ac8bc7a569 +32a3362bb06a575f686c1b68716ff9c8c93020fb6e5ac189834021d09d12d136 +529c6b5e28390a877a3daf3392e50dc60c4653f33abf9cd550371d6af3bc340c +b5c34ef3d2ed6bda5e8e2b4e97a865525d21d43ccb1412f545e3f1a84168afb3 +378248f719bf8dee72e408caf3eee889129d389cbbd62fa285ec9eefefcdfe44 +5fc87a84d103b3fc8c349f162ed5d830b5e7ab99cb2f82cfc2a83ed146999a56 +11873298b1c8e983c539ab6acffb13be2dcde7816a7015c72ff2097de9334e76 +4fe9359d3b3f1b5dd5ae02ccb7b1175e5e5b2a5d4414af3376fb605d805446e7 +e131cfee56d1c41dfe690113b891a4950d57975b1d608a19cbd10d4d53ebd4db +c6d78c9cf7c06be5fd47433aa18250fb896f3db663deff28f1976e93e7a36b4f +50830f7b0b5b47e2c0ca4a08482290aaa77582887fbbd330ad0c0c412ecd3fc6 +534baf96f8739a4df7860f73b8abf2e97d3567c09c616b432235e0ea8505cefc +26c4d7dc44f7789c338c8561a9742cf177620bdf68209254c1b6c83f26ff44e2 +74d98f45a913751919506bc3720cac860c01ced3f825d357afb098a5ae5db776 +63911f63a83b586e839d08a94715de06dc3765bcc949539394d75b0c6930eae1 +9c8772443ef8f8f1403c2a803100acd0305359b7544681097dadf07259fd7c09 +e80b28c4e0e75ed038feae6e0b3ba5d311d21f716d90fbd1aef28a60f84f8e87 +0a4d395cdc956ad485934ca58f11cf9ed829c4ecdd984dec9525a736cabd684d +db24ab8b679218c355faa975d48e837066f017fe39cd135199616461b9c7c77a +f3a986c56243594ab113115385bd8de3e560eaa3e468ee419f9b97d3b20dcbe8 +1a64942075d88d48a2b28c39328ad74e2b02b011331f655066b7790d1e2e68d0 +ed7298fc1040fdd407acb03e6dbf680651a9068082db7d43d1c85b56bbdf299c +5a9b88b8608d2a21d7a9267d952d71b786f7cdcd4f63c13fce13c6dfd88f20cc +874e1a42fe2430c0c0da698b021a7e82eb668371d7a8559ae906d7d6a0a60502 +c146f7e838822f22e4d0e1404cc853aa913087dc959b2fe1fea7131a4435938b +2ceec71b3101fca9c4db903372b2cb6a6a0e88748dd8479cf0625a7d5159913e +69ea97f5153b3fa681e940b0c59c1c4193fc979049b88cb38ea53e64ce6da9e9 +d77abf19140f3abd0c1b89f3690b59603abc202d4e0437431c8da5b6a2b1231f +89723b569fcceef6a78c38843df658eef93f6414ab589c77ff88c25a1829cae3 +ea663f93db354455d10f4d40a4c075650a4e84a2468fe985ffec14548e2896e3 +b1dd0616c0a6b17681e24fabd35501bb0e446244dd55cc6a632dc018688d2b05 +18e7c16ad731096807c8c7984d9a90df59d2ca0649e1f7111f105fa3808df731 +10de360b039985e643fabe223c2836e1a992a5eb2ccd396ba1fc1be39c148e3b +2f1414d762e9c95f1ab131aaa17d5632f6b3c3e566a1f1bc9be2ec3a89b595bf +bf99ac8fd3963d7ab464059c643bc6de1e806d5361b55731281d2556878d1087 +10f4f9f79598e4f37a2bf74aa4a94e563cd226e50d1244f38978bc3994b1b082 +586e5fe3723cb33dfa0c48ca249ffc20283e7e3a84cdb0d8df92e540ed428fd2 +0943e502f763f7fc0c879d6a18ac22c7b9fb410761ffb5e60e2698828666450e +aaa8e0c8d5541036badb9c7c92885462a9e7421c8923f82d978074d51483e594 +b0d24b3ab7306234079f4f52186a341a8cf7eec6485a491f558c50f86aef7c10 +6fdadeee7dbc16438b213746425c80bf19ee1ef22ab8952a6a91cf1629d027c1 +b4ec94221468a107eeae9b727e1463c690c41053c6ed0d27adec33586212cf52 +c4aa47cefa30fc2f22d1b36cd731f8818ecec6d3bcec641fcdfeb74f37f561b4 +f716913c74df2893324861227e362084ea3efa36414906bbe0ab92b8dc7360f8 +ab2dcdfca4bbc7f23ae6a6ec7eab609a6d04fc0eb78d95d63a7be15db384a098 +477c2d5b367996fe969f6b26be3d09a2ab3c3deda2f2ec4c9bb2f0646bf6124b +23c91547ba42f72c6d4ff83478769924a09ea982092deaed2445530f7e62a64a +6c6944f5c8a8272c7611fc494fd7c2a9f371bdd05607ba865fbf5cf8627922ed +46d67ad28c4e8a01700634db291a8c900c37d8f7cda706184bde8dfbfda3cc1e +e6071783a69c4fce21a094fdc2d7542d005b33850772f73a0e7ae2c6e4624ff8 +d77fb1e978e9b013c2c2810394675b76c7ec45e39f8f3dbbee1a92e43422ac76 +d9dc26e9b4163fd449f1d2442f9a17ac6034ef3cd200d50875b89843ea4ac7ad +10c8a2cc4df2c690e68c6f1070abd2bf25d6a62dac0da009d9b949cc257b4941 +8ec05287561ab344e71aca7cb870e71fef718dd65a69c99cd4173cbfcfc8155f +f8e67003b086437f488af5497fc9416b15fa81d22709730f32ccb984ff67e291 +355503d6d6253fcb17f072f324b3259bcb47f2ce27ef9708fe4b09449e99d575 +030ea81d86622fbaa1bd1e347105a283f2b394e5a541aeac32151b376464ed0c +96a2282ae7812383e1434e766f240e1379dd7440b4901a124607c4463b6328f8 +25fd34dff1bc61dfc6c3fb2ffcafe3b67068711e1635becebf8c890c62f342de +baabd191fd7f17369f6456cd3f69921466bedc81966b1055c49fb4d139f234c2 +8cd8eb0d15ceb048def05831b3e940627b2f98ed44a0cb193284c616cb77390f +01cf62e583c01909a36b83e9dc1097f7d946b30edb637f431ae85871f33f24b0 +0f3d42e09bb3cf5b9fbeec56c2762d4c7e2571c3300058af94ed8a09ccae9e60 +420e3b78dbe9b76d2e661eeb84162d2514564d3bd76e59ec2385ea5ca8e77480 +cbac4e07de6aadf16a183fc172d5c5bf7f979a77660706f2df8fc7c49cc77f09 +e3232aea4172e2a10cea4a9753724ab2b5a31e40febcaeb284436daa7328bc3d +48b2f8ba50495e566df032f44d23a1ea6d86557d48a71c7456c415562464c4ae +0ea04fdc6b07680daa44a90f34b59dd67802ad85ab62ddf3790b8f8a8b8660ef +815cfd50cb8607affc2e4fa152157101c957a422f4368aa35f9faa8b6735c27e +7c6ad626bea86f8b66398dcf40080a2ff60fdf8431d0285ab80668d39590351c +588cdbcb8245e5b9d5259ceb2e95f6238f0dc40b5406a15ea059751ca482b345 +10d6f256ba50792b8adbb790bcb9b52cb37cde2ba2029afa435bb4fc541735e4 +f76aaa503353a8370ef5a83bba65cae93b3bb20d727b24ac58635746de379ba9 +04bd03403cd2dd8cdbbb96282ff967bb11c89392c5510c1889dee5d2126d1e22 +c2815a7c54b10aaa07d797e0337c992bcfd5e023a0dd2603913df6fd060e40de +ea1905d3c9da64ffebdc539bbb00792a098e0aba893cee2b2222f62f7bc33b9c +0fe107b99feb52d76b600648b32dfad7f7edb025b143b445c2182c8278da240f +8909e3de7456428deac22c0fc88c3ed99ef0444e762edac64c4a4afa0b97a609 +58c607172daf23b09bbebbf040b5dd5b55cba5f2bb1e765e359d1a80c6df7f76 +c703baa94076ab528d326cfd0a31156698b9c9c3ffe0f13b7711ee58276b8422 +80fa784133d0e5f5b07dee16f7fa0dbb95f7e1f5c8ba8b45ff72d64586fa334e +0db8c968d3628ca508f945dd9189d1f7d3462897c141d080dbe946a66de8b2fc +2f2c89df29e8ee18681c8f01a43213159b9cb09c121eb73a080047b9706d4b25 +de8b147972ae87932835a6f4f12389542de405192f0023ef363327dc02af7ab5 +f3eda2970f67ed2e5435c50c522dd8dafbe0dafcfcc58daf945657045b3bb9eb +a9b9f8894400f2c1030c752e4ea6bb093fd5a09fb95bfd484cb326afa941e2d9 +6936453764c5828552529668257f87fee07977cc6d217b5b923808f93000a451 +d7c26a81dc47a1e7fffbae8016303157ceb3f64af87f5a2fd8c8dddd04b8ed7a +809140824d1349bf77e19ae91f8e42d7550f4163570d87c349ed3dbf427625c4 +f18245abc4ead1ec09110a30f4fedaeee971a2fd5c4bedd0bd1c80576da035a3 +a2527d163b2198e6c483ed7b14e9882f0a4ebcc2b55b204fde963da8e5358371 +dbe833aa2c41f60e98abeaa394bcf0212743fc5a3efaebb77d3206362db106a4 +2c57562c547826a558bd82bd5dbf7d853edf511135538d554c25e94c40b3f73b +5c79f9cfd585cc5cd1f0aecd196c019adf970563fe58627bcdeb9e2e03471e05 +d90d43ee6a20a468ab4ae304d8ac4049cbbbceb0cdce45d38975bd8f1ce5d1cb +b20fb81cd0507a3699c888bd8127aadeafb330151049b09b3932bf301489cbf2 +b09f7c42502e6ea82041403ede92b34f1bfef5fb5f5d920d5533eb4d65445c06 +7899f0e07e081795c9ee931a34ee6a9c65e63744db3f97815ad946f41dff97cf +7099378fbc99ce8e7f0c7f4f4e7ffb5089e970085b74988304ac99c229df5291 +9be0d25d890b071bea811aaa588d28f78e6331385c5e12d03682567e5abcd599 +1b51b54a680759f13683eeea378081c76234cdf5e3d3e5faa8363c2e74a7adc3 +92e744d370d8d466a7e1461907ebfa43f44376a7323847ac162c24ebe8ffcd9a +3ef3f05e197604898f9dd3c737c7da17c8242b8f7a261774d48b822831ce02c4 +f9249b22cd805ac81a0b9fd24ca446594cc50137223b67b97507d18409586cdc +aab9f58cadeb6e5a1f9a843b7cdb58adc014d4f2f7bee89cc3d207a82e6b9e7e +65485bca7253c6668629c44632120edb18b3e4bd170b5f431c35b2b945f55f1f +e0181e92aa60f35ee61bda2a2f25dd60afcab8962077b38db99c12efaa3e62f8 +024bf9e864953cabc76f42827360f39ca838b7b603b83f2c8acb52b4bbccb905 +953612745b0a8ee64753f5db78bf77762bbd7e48b370ae59f59a3609737ba1bd +d08e30fff8ec11a92050a7733539758889fbb3ec25d7c287e74697f80a485653 +1453d337173bc751eb122095af020c6acd57451e9d492d87130f898073705b05 +d044c77d42bd91116dce3774460fdfdfb7942c45f3053f13e71cdc7e5ff368b6 +02adffaf5eb51099c87806cd481d923548e4a1b153f3518445c2734a5b852ef0 +7028968378a565dd0245685ed23165d93450a2fceca590410aef8ffec0747afe +a184ac2c6ffd4252421a3fa67165c48e1c0bba8b039bf3c5f42bc031d8bde0bd +075a3594ec943f67ea4dbe5d5ec1bedeb833af6bb8c6ae6a3974ba1241113597 +4eb0a6e3107654d209fc0f43416c71645605a70ca1f9537eb49e2b901ec67028 +63c6a6b6a142dcb22182e2cb05a6572ede50e2391943b3a589f496af92bc2053 +3f68d7ecb40d1cdacf114090014dad9b9c00f34c47263d626016bf57ee1735b8 +5944bee9cee9d46a7a78bdffce9015ba5120b062076ab7968384404bfc7912ce +0025ae48ff3d663aa3b312ee77b669ec2b4052794e90e85a7769b500c709833c +607a352a4e69b4fa6cf41908453d07394740bbe9cf4501c5a64c0603c6f24812 +85cc4f4d1b22fa1281084b24f73b3436d0db59f2da5a100cc70f57c033c04dea +cc78a56999fffdc14c143e965bae844d87c7f7cd59aa05d352434cd3a70feb77 +3e878d1bb0bb9681622449483923de84737149dfc0566962808602790de465dc +86051f569beae85236ecb0b6a8de7d2e5c62cde8c13830ba5d3a5943affce66b +29f771f8edc3bae0df9629dcc9761b2caa07d29b92aa72564e700ec9bda0340e +71281448fc01a5eb62516d5d921d22e69b54bd74e30f85fc52647ca24fa8d273 +4ace1a25faa68a654bb60827585a9b5dc901dccebf5bb02437b6456cdb93ee83 +3e226b7822f375d60a1b75cdcea40dc0acd32f9aaa39808d24043098d76e7367 +26e24d0602eabbc35d28509c64a4d66df7c008d32e5964de8aa2c50134a00177 +81d085806a2b2783911c89f6876c1a4964aff3e59644e05aa6fba05e970ee558 +614ced908bb4838b5fb24c1a3458ca50a1d7e51af615549d340cc334b96aeb9a +4aa99e74f3939a4b640c653b03181a4c54d45604da621d4fae1aa04d4237b7cf +9674a72b50e6f26c07aa85343b43e1cc4436e0b326b890440dbc6ff36202f144 +e118eee07c880f3d5121834366d6b174b9d67886b62ed002e78e592a42668cc6 +31e500ee27ab1beb2c87a7fd3b1f2274efcabc70dc189b942e55d6f3779d6bec +67701f5aa3efea75615cae8bc8ae937cd29b9a6811f9ee11585e39b69b09176e +e5b0e4a8cf0c6fc393fea31f0164ba03ccc6af688df68f4228868cd63a84c480 +1ae93da9c45f79f384fe3a54fe463d4c7853031870c9e14687dd9dd76b9db209 +9c21790b1523d2ff913552ffe62b3b371fdfb87919a2d961847bfcb4131a901e +9a8cf933b2e2693a688e435ec50b1c0800ff31c63d1f5c7101fceabc9211860c +d043f5a575ea71977c7a5065d927a4de2c7752c02a857b884910df8511eca9f3 +b81d36526a9083de5c32603649e944961781c3966fc6c8b9a7c1aefa7e08e5da +782a9d694b8ca6d5c3887617e2bd3b5ddcfa2f965b78ed018a217ab5c4a4e538 +85ffb9485db87327232541ca112dec18d9f6d4e66256c929d8c38eb634cffe5b +b4b3aecdd3ce66b85d9df1f87b3cabc609ca8d1c5bff49215f8c324bfc42dead +64c43bcea81619ee6948ca0dcaa9c7e2a19f8b9e830b9febe1a59ed5cb8d650d +51ec17b2844c9d67184557654add27c135aec9c6a6bb2068cbc4edfeb82133ef +a5f46f0dbcb5996702b4b1b67b3cff6992ef64fcbacb316e901765a87d76b0d8 +17d389d165efd517aa40f6c75a91cf060968467c82b1294f2abbf54a35227b61 +3b3bb9d32eb143393796fca19b4812402f221c7859ab4cee3777a52f847ad8a1 +3c637ff08c83a58e5389960e44cbea061bf444fcb64e613f8f47bfb1990c5d6c +5da42c20b4199b633f3675d91f301fd3fddb875093d565e01f45e3c22250358d +1a7af5ce476b44245788eca65c4db73bde810290d8a63e59f30b3c83d16c5c62 +de36b6dbab5d10659924f32a5b876c1583cd8bf728afa797b33a6c3c0d85b40c +536b2c7d1ec7ef7ee7a9df19bdb5fac451001bd1e8964a320209372646202954 +0eed46fb166faf15f8b10b8515724b409c7461a738248f60429976bf7ace5a7b +bac4452ac45b5cd4caeaa310f154d78f101667fd22b0e69bde93ee67c68913a0 +67231e0b73377f31d3bbcb61d8819e32f0aa013fdc543ad95ea5f48cf95deb9a +70c31b233f591549701daebb81dce7c3f6241d0a4c562bd9e267f55f017a20ca +d232044a680e59425b8c072682dbe71e21c7ea603056d9ddc41f16f26ee5e74a +523462e49d58fca01dc10d1ad6b6629cfdd36c556f8fb347af37886140a145fe +4fe9e34d22e5d7804db730cc076ce074762f3849c62ac49a2d66c707455106f1 +ab854054aa54222ef6d5e628c8065228723805076993d356f0349243d9e43abb +968eb1c9998ec26447bce6aadcd84f0b6993d4ffa5f536fec6e12943747aac99 +c253f9b24caa7db44311cba889b53ddc5664475c22526fc9e1e700b3d38b3568 +85ea0e60d4146811e80386c11b2ae0e2eb94afe92dbe3b5a82fc3b7ea5b39847 +475b707b4058e717d5ec2d599db0f27c04a3de4f85bab108f6d1463183291cc4 +75edb7b62e0c1d6e6f0c5f03e5b9862c6e5b1fdf755610ba188ca32f5994ba24 +8c6a0f6e1a6cbb2378b3f29c4543511dbff9345a6992fb19d67500372997478c +5618920ea5a62eac4aa661291c8a3e46a26260c8658178e17605b413bb89cc6b +fe10c7572049fd36357290dbbb19a670e1244281b4b2a3ba60e1b322182183f3 +96d486b97fa3d435987879c3ed1a4c4a5e1794f7594f05ba6a1d75138dbc76bc +5994ccd69499f4fc7c01f0b0b04a7e2b8c2c3eb6cc39a6e61d8610d0db8bbf88 +074959d4efb3f4e638208c7935e08d34379884930d8e99c3465ea4d4213a8f41 +67e091345d5ead21e5d9cb489f2666c02a25c938cf7686a943d645feeeea7028 +7e1885a3a2b2cb9d3b3e75896058ea924009f40c8bc017c82495de1f8ff0c62d +3245610b0e5d54908eb3d96091cb87df26ad8133c46040e168f82547a32346b5 +0175b7c37b6bde3f345b4322f9a57c25363d32d1988941be4a84403c0e4d3440 +c840be8d4697fcb6678cc2db85fc9d6ba2f59814f257f18bf17e57b436581d95 +d391e318081d75a1a9d8c1fac834819a82100b47b78424c28871ded159b5e5ba +49a2ba27f1a0fe358661ef98a937baf3722a1b471f269e3f8cfed8f4b44ec694 +b38f4106570c9ba31a30d56a594fe4bd91178389667c3d15b54cf7590c46b9b9 +a1ce513f45ae78bdbfc81a820b2ea832f390ab3d389511add1f30d1d07f97e7d +fef1e1f796826561873c6321e0915eceb5d141d5e8d9e664802f39be458850f1 +69990f176dc24f0b3148cada39a20c3afcbd82ce6fbbe0cec2f3cd6dfe390b96 +f9c450e3fb31fa357930ca4a2911b3441e4813db96daa79cbb6b6da2ee464055 +374194ff4d779d0ed6baf67e7c06d711fe1b5e868c1a4e6c7f3ed529fd3d3492 +ad079fdb6faa5dc0924400149ce79a9ab729283669917b2b538f05bab7596b8b +bc9c86cb74481d0181c8fc2b0c333619b96c63b6fcd352f0564862205f685eed +ff81f069dcb2bd3d0ea80b86952f7efd67ea8b60f3e90ca23cd176c76d73cb1d +7c7de170a4196875e99ba42f5e53a5c3a7740bee37d08900d68e1a5836ad4c45 +2f325a1fd0d49f74e9437f2d28062ef5d2934d063f0521ef792638fbc96af2a8 +8bf23e8a33c7079d2abe21a018521acc0e14c5508e629fd83773c9f59cd37fa6 +4a121bdb1db13d1c598589b00da37e78bd59d0e9f3e6d3c99054626e9e0cfef3 +35d2dd25c138f96a3f7f62e2ff2ff12010049edb86f3645f0272f36eeae0a60e +532cebda1c0c0f39c454e251aa6ee1ff82536c1fc1c9b7c9679fb2deae693a02 +9eb57eba3882901d2dd7d0c24d5f0ef6b799080e98ef048eeb4429ce058e05d7 +6a296e34c80467c71fee0d41a366ca38b6fa3c5eb7abcf854fa7adc4d6ec565d +7d8c39d192fb3b06bb93518623a1b1c56cfe095354ef43fe73c1de5541a7af68 +c51ba01019d7685596d730bee70268 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courbi.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courbi.pfa new file mode 100644 index 0000000000..5162aa6d0d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/courbi.pfa @@ -0,0 +1,1940 @@ +%!PS-AdobeFont-1.0: Courier-BoldItalic 001.003 +%%CreationDate: Tue Sep 17 17:04:09 1991 +%%VMusage: 57715 76639 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Bold Italic) readonly def +/FamilyName (Courier) readonly def +/Weight (Bold) readonly def +/ItalicAngle -16 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-BoldItalic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263789 def +/FontBBox{-48 -288 860 839}readonly def +currentdict end +currentfile eexec +5c03f98a9ef1056084234938772b65b659a297a60831474f7f06192b155c7867 +6e337a4b7c45b34a88552e942ea1b7667df4b71b67df89e141537fb4b1d26675 +7b98b6502e4b2246f50fcdf717d3a5cbf57a5bf92df803946d950138fb0acd1a +c81f3f66f82ef04256e333e070972e17b42d661f50b27463cec7ab9995060f63 +ad76b5de2ee0546d9a2e43488699c40c150f6d60a9fc1dd3b5367a87d081de8b +a232ff2c4e9e7ab38f13f20d747cec9f5cb36fb8ad1b9228a42216d93925b91e +3643f1c2f86f0ed4286847196391768d58895b7dcd757d9f656af1125a11f291 +42e28ccf91a17be1a89d3214be746c4fb82da439d6ab53f4bb12358b2f8c6b17 +32fe22465ba0dfc22a955139b55389d1904f3f742faee44c1af9c3c9f588ac13 +3635df24815df9c92f7ee93e79555f834f18f20eabf3b2b7a815770715bd2e16 +4b1fcb206e2fa3aacaddc54d5d61dce9a8795d8f346bc180a550aeec53154733 +bba47e38c6be925bb166c8b776c4350935f15e3c6123f8a91c65506f2ff63ac5 +d79c7a7519f9d09301a6de5052913938ed21c0194306c8ae995bb8f5ab991343 +5def56faa796248a10f995ff7d6ae352111eed560620bb6ac41103ab077d7cc2 +d97a20aa0a9dfabf6063f3a600f2c12fe79d30f9967788f90f5285da7c197d4e +58a9ed99659dc24269914e0c0582e37840b0f6ef456b0f6b445b18e6b5073f41 +8ae4fc99f4998da4fd8820393e41aa4f953ceba2edcd901d5b7ef2fd026fc8a5 +26610bde74dc20173add2c71dd98cd1b6445ea20f88684638f269801cfea8dab +e4cae300090a10211e08e37e65b79433989f2a3d888982631301a76e4c68a604 +b9ffbd0b7bf26b12cec3ef5c6af999e72243e396f5eaf36d7a02fd686268bd85 +d66d617e51c2c7a5033d160b8ebe9b7d3c0595cd0ec31cf4b88cacb3e74e2870 +ed7e20f88905075cb6821889e85fca3fcd5a397d44e9150750b16260177280fc +92a20e8b891abff9492a07144e9ba614d069d8afe28441d03d34eece34f89640 +1ae1c190991de2ccd321ac65b9b575661dbb7dd5336f1af355062446fe088c45 +05d9eb7fd3f0740528564f945ce3e13e5697b23e1acdafb8322f77b455e983ab +dadbc73bb4c8b593eb357226060c4f723311d7c48435ed02bece6c61523c3c75 +5be81484919dde97279579df674527ae2844220a490187e9350e34ddcac7c82e +e1fe5cd11259688a987d6127565904904dc3d4ab7c41035c5258a9841dd2120e +de49dc1ae7f4c308e169098267db701bb94b4862ec87e13c4176a3b362f7ac17 +39b75de7bd9fa615fed494334254229a30da7357f1015f7d2983fecfd2cd2444 +6e697b50f2b8e409e73e46194c89844ee5e5ae5a4d646587ed37a0255b86fd7f +9c287a61cdbebb354185d2724464a70461a29dfd3c3a98291654bd13a64598f5 +4e23fac9ad312e05d6c689e529ce5ce92e97ddc924bb5c7ca024bfaff8e2021a +dcb6f07bc45ae0f8c80b693fbab5c1c66d5655e7de5151f48fb0d5972e2f523f +790c7c46663b5032f62a9a510d75f7809f3c7774d2f7378a8de57a912058247e +30e29f65e7ab0a93ca198e6dcb287d7e44f01755f849cb46ee4e8a5668f5fe25 +a4a579201bb36e45d4208fc0309d5b763cf6f5903f4c59b3527e11a1d594f9fd +d3f6e55a9ef313faf9ee6d0f05c3948fb186cc981ae63de15e4aee46d7e3b623 +736066975cb20d00149fa393a35d8aa21637c73c396aa1706d4486bc38ccc199 +573e5c564947739431f445a8620383c17350a9f818acaa67ef7aa609afc1cdb9 +44a8a2c76f2e298b1de868a5c379f8f7fd05af8e66b55858d579e09c84100b7d +9aed565c5b3491b2fec23390ff21231bc4d231a75576cb7382619f0480126a31 +ea8bc6b2b1535c7bf260351756ee37f53ebe18c7115a594001dc5b6d3415b88d +8a2bd9167a5ad2949af32718aa189645a94fa2f5ee1c07b8c2a6733fcd44b21e +8adf515da9d623d02a7a0f4d34d7969454c68fae43681a970841a4fea9da5a94 +445d4fbcf36ca7f185e8f7d085fd869203a8f3f9bb87d31c46f459c1c3ab4854 +2def58e42fbdbf28cd14d3a1bd1f7d8f4bd136ca919263dbb3c52ca2db0fca55 +110940cddc11095c5562e4338cc7b74b0ff0c6370c1cb155154f0360220c82a9 +9fdb9eae6e988e28d7fb0d44869ca4c92667ae358dc1db7601ab42668ec40f50 +14fa64b966506873d63ba425d899ce827cb7532eaa44cb8ca1e5763399387a8e +6dafa8b3b5852f23301c441366956805ab69dfc15cb156ac11ef709c651ff3b2 +064a491521cb0ba8abb66b99119d220a197516a7ed8d4d5d223bd6c2afabbc9a +be1daf6a4b9d6064bef32971984fa314e9f3a8eddde83b39075b3b6f9f9f0b52 +793655e96efc0cf833fafc4460565056522b189870ab1493638d6cdca563e6b1 +793516c25d149caeafa2bde531b397c4beb75b09ac16430b4219ddce0c4c6400 +1a32fdd1385372158ee82b837becd6af14ebd1cf92ba934154232cf3f5b4200c +41e65762b0dc5120e7034e1fd4774a0da978e6395e855c8cb369e677adc49ef9 +f4dce344953fe9da428bd35a79b6d6155263c0fb306f4195a5a181c38ba432a8 +1f7039f3221d3700d584e4018469dfe590a22c3bfcbeb02c56fe0f0f5b93e6c4 +0cd8225b071022e08372ef5c5de6de6d24e22640002597d92051197a2b88a27e +071cb9c6580212f6dddcb80185ca39a774a905b447b5b836d72ed90faee84a51 +d9f5fe37de26e4a3e5209cbcf989644acad73eedd16f028a304e0eeff26655ca +890a74c6ce61b49b81a191e158b6f3161d6ac5def3f084d1c0e48022f111bdf6 +091916d4adb5284d062c8d71d487dfed925c4f26fb6796d36eeb818b9ef5c503 +3d4fb3bc7b4aab1f562b563bfab9a79ebf49777f6b8c0dd77af6e4dcacf81688 +caf05981536b4e91ce965abe966acde3d304d9d0f3b6433078a8ebcb02ffdc7e +c210a35c7dab3ebf015fa81b6dba86e683fcf8962117f44d68f562b4f7c68c0b +5df0193ae2283f35c421c6da43dba3419c63438ae46eb65fec9d8902ac784015 +398706463e99a1cf1554ecc16494477fdf68d40ca992dbb01816d410662b743d +f0255e6c891b1482ee1353a5cc268a264e300b94d15aab2fb2f80bc1f0b714cd +7e1546bb733ee3db28611f58fe80bc6b4bf8b637b00fee2997cbd2d2f8808944 +f428727190675e1dbe9e4ea29869af8729248ba59abc84861be3814e003ac8e7 +f8f7d7ad667df77d6b9619d5776bd048c7399f01b3688730fc94af5fea41e905 +43faeb064b8a7e8c9ed0f04631f4223730e2bd7357d6c4c114419a2d4aead49c +d2ed2b619a15204c8fbecaa51802f3fcd8f201ca100c36281294f2cf2981d59c +ad0d9e2ed7ebf964dfb3a5f2b1bee1b3f361806b0a5f7a74b32791644d5184e0 +2515f2122ca3e24295e4aaa1165bfcba0ebe9718243db1f4587f24cf6a52f92b +c2229b9fdae40d1c97b6bc6eea4e16231fbd92592ef326227fad7ca81701af4f +f47a2be563bff9d42ac841df2914b89f372283b77d62faeb611eeb870cf9b052 +dccae0c500d9ba5c86f984fca0fbd37e813fce5339e177da499e68b74965fe03 +6a4e030386eb28c668c18b04bde229c53c86941d682ab64f0ef33c47cda25acf +91ea2c53beb3a7552d69b092a76ff6c496d84608ead8080518943a6fc57fcbcc +15da6f2c62a6326ce45f19b403c65ccc613991bb5e493d1cdd913269816341dd +c484abade62ee0eb0f2aadc0fb4ca2b04cebfb9989611ef65b6697fc6f0fbaac +6745ed1a21dea33907385730bdb0cdc2fc37376ab389267ee40056eee0e6467d +8181a77d6478b78d4c140ba7427eca7357e0f7d5f72324aa1d5e6bda674c5743 +4fceef4a522731a5092cde4ed87211ddfc4267b93655789469d47cbe3d1cfd35 +2a98cc4896b7920887378174447ae1c501c55aec394822cd4beec7ee8b9b042e +d6255479d8e1aa7a5efe0f486417e5a5e6f6ebd019aedb0992e033a8436f4da1 +44db254c8990b3d25a7786c1250d71fbfbf6f0e45faa7661399f12089822697e +62e4081d586ea80ae533b192cac92f9f59ad445f7ddd088b66b307041b737ab8 +cfea19ed2a9d2d35bcbe1cc4fe4487f09288e7e85b98ddcac4b097038b8a7905 +c0293c2d66739bd457cbdd9892044dff52106839c707b2e02fc433bd1d1197bd +3cdbe6b1e55298253b09f7ce80b94cf7715f2947cfab6dfb389e045294424fdb +6f90ec45fbcdea39cb05c6d0a4614c33769d135ed0d6a6a5a4cb25ae1d1dd408 +51aadb3b4eec2651c290a62d95a9ecf17430db06a42593ce2d06d3590e76b929 +39a2f87c2614d353d109717fcd46a7f9b6795cc840ba6b4ec37502d3271d5ff8 +09c61aee0b67bc4b8629d9ea756fdb3724b1f67ddd7b0f47b3c47c4c067885eb +d3cfd3b7fd4f949bf87994709f5f278a699b3addcdde90196b5fce894a44f3af +82034d0b4ad4ac692f54b6bc07b849bcef0b651d2a1b1f69460bcb62985cc661 +4da60cb063586207661c758ec6bfec68b1f03a32e9b41e8742fe7ee126411cdd +f327812a36818f8a88f4945202863de81671c01c608f2387d1de2d7e686b5f20 +b7dae705d654112576d937efb9cb33ee65b5435ec9ea9eba518b3f9f1d30b9ba +7f7162e86ea5082e983295e074a854f1be92f637be4e7d99a75b582ca29f968d +3585e2f6481ef968c08ce36976ee7dc1c1577fcf9cb546130352f80e880ff81e +3458808bad09930300f85833c920c47d61f6be8ca5a5655eb4290fea4d4847c4 +bfe69e08c0a5cb8f58455f27d360da7950118eb86df84f490efcc4969827a14d +884551b1185831850fe284b53b661098d1b145b3f2a16ea5c7ae601756da6aca +c141e3ce0b4079accf03fd2376db53832bf0d41b49da9063e79d63bdfd37bf7c +94906c6cd82ee31e2184bc695f2746a01cff0373b369bff632f3753058cba0cc +2e7339a4c85170dbd24fbf89d917aa24de7583dbb8feda459081af95940e35dc +58c7d363511b82b95d983b6679f11bea2675775a1390bd8b1f66afbbc1295bf1 +05bf399faf1665bf04d975b31d031c6c74e3ea1489c57e4826263fe56de76639 +2698ded8780494b338640fc42a58c354a49ed70301b128f18e1c33c45ceb89eb +39ee8c97e200dc39325571494b49851ce1b8d1d0bcf79a3120411a8b168a7758 +15c0eb119ca69ba8fb227ce5747785e4a096f4b35eb15abf3a8f45bfb50246ed +2a3b2be2d639fc263765a00fa0047972552466f8dd6d596bb6812fe530d78ad9 +5a6c1f0c70f003d4f5d6d255e747c99c7bad63f97b51de299f7788ee41f08ebe +f60f52904502200fc62d912560792ef032433366860a3154a16bde3204401e00 +3bd3663669d15a79596abf25c6770bcf93012334db1f1383d80e18f783b5088c +8e03e5537396852caff77cf3a15899d21f6cfd57ca4e73aa5a6db1d7f3e7dba7 +6a31baa5d770072c9a29c06010bffb0a0e1141c7d9ccf6193cdbe7da527f4cf3 +e63298fe54b6e82d64bebb75fdba752968910cf13b2320eef043de5a140ec54c +01942dfbc94375e12a9612cb20d117f9d3e0878ea790088bfdd237ebb2caeef1 +6e13217f0f83f508777f9df0e37843fc9216a06eb096f7d6276df5ae8cd9db39 +25a9bd2966b7c3b58214efcd2f9af2636d9e9f73b09b4da344a81f7a47dceab2 +b23238f002540d017bf200bdc87bba433c7d7ec3b55da5af20c37cbff34701c4 +35f091ab701cc51c9f0191d5028668bd6a871e4d08ba19170f8c1430f1b542b1 +7bb65c5a95924a1093c04c9af060e456ae7695ff5f6bceb846976bbe437a780a +e7cf5650496c859eb598942e3700e7d1825e0af3bbe764369a7ee75f14dcacb5 +24be8cca7f80985d42570543532aa5302964f5d50fcbfd1e094833464c361d94 +de5ae694e605271102112615143f68365c9a626218b923b2a2ca76c4e8707810 +f1cc16d0da031df23e71591b1cba436bbd25829c3d0f0eb60e8b85d2f47e30bc +b0abb659bca53b96cc968db4d82f0adeb1467b54315451bc89e953e1e2f47141 +174fe9a4850b451ad468afb338539e2faa9320edff3118c60a5c4a7e32a072fb +59bce786196cf4fecadfe62c4f3a000a230169397f73388f06d9c6ab33fefeb5 +b0c93ec5c4fd02ebd912fe85eca4668d8723d9a755ec2501ae74abac9ff03238 +d8f82e1b48071f527443f2a94a1f90b6f2260ccbf51b9bc2de684a2a8563beba +3b05379fae11d6ec2214953decdeeb994dfa50847ab7357b121abea5672498b6 +9a52b029e8c77151bff878f7f30fd0f9a40b8e1579a8b672b7c755b68e28376e +4b5becc11fce9480bcd2c10099447b4e6b3bbcd3b7e84ed51c633290ec084571 +ba4665bc26ef665621495045e18e2be0ee391f764d94f7e631d02c3c9191637f +e49b03f893589e3ad60281ecea2160e8171783693e04355722ba6f7c8da1db86 +b1ea3004f486f94e9ccf37749e8a0e927d15e84523402684c1fc4c514e7baf20 +d77d00506cef1e9b81fb8244f0d6095ea861c446948fdbd822d10df5d6a82c3b +0af0caed6d1fe7521c6515665be4a5e10c8703c8e4d7db3a735119fda2bfd79f +8f3dd3accd038fe9158e33cac57890e6fb22b41f82fa854e1b6a75cea187d2b6 +18d4bf9117bea6261aaa838ead2e50c115c997dfc996c8d00b587791c5285df6 +b5cd27b12e338a650f53a0ec9cad5bcb0f2053dc77aa57a766e2f8e290586e27 +924cd5a5c1cf0c08c48d0e7f9990e84644e9a6f5c9b49be9e3d7322b9b66de57 +2e5b0ab001a2c9e2d9782796a4a7475ae1bf45d9389a99371ea684ae896f3985 +8d17a6c734ec6fd734a64c6747a207ee39f1c9f896b6f6ccead910d8bdb9b642 +b141d1a57dc06f9f303947c61fe1d97699fc3ce4c66bf9953b6ec5ef743717cd +831c22f49a68446b3b8a966b8659fda893a67fda0cb566c0eaf31bf88f7b480e +1f05a59cdbc561b6c7d532252aa464fda44727d80b6581c7f8fd89caedfc3b57 +802e694b74dc15b889c838571cb6ce197439ed966d5624ba7567e60e4dc52c48 +c74e5f2c2e0282e54cb82a5214b3a97fa82e779957265a4acf064bec17700158 +8036c7b52c4c2233cb0e8b5b244de31afa11afecdf26a916cf1ac85847a51eac +6cb46b3b35d7fff18d2041a63d853535fd09213116b0b62a115623b471aa4849 +6d4112ed9ec7351894cb36e9f9a0bc1c015cb3110201390643b2925dea3a3dc0 +7fc8d62b62ebcdc38c2d3316b8ec0055c34acdbde86473e4dfb1d5e33266943e +9f777ceb99c757b6c6fb5c69cdebf31336d418f0698622f2a0e46bbd0094cadd +deedd149e7ebb57664649e550a850dc994df665b57d81b571e4bc6c0d25a470f +bb9d78ac9d2fa47c41675a11f3e5b88b567813256f4a544fcb21238a91e2e30e +c3fe52ff997ea81e1b0d9ba23e0815ea78f46003a8463158f6077024b33de798 +ed9c1b02aa6428d1dab23df5c5b055537b44c47b4cdea9c7783ae5d534e65b2b +4dcbc46156e6353307e0e510e4d63c2b438737671c024f29b80513335be3b4d9 +8dd586131c242b34686881b7d38deee1ea765c86e7cedee45e8f184987ef2e19 +15e668f56d7864d1a8ffee2446c74c34163d2f3b7a9c130ffe08ed50f82ef23e +de6b14e54da94c19bf1e845d52cfe4bb5799572993d3115c4e8026d233eeea4a +2e9aded6f4f13059a77a291a68899f823c1dc8cb477b8a63e613dc9aba760219 +e59dd6207ca3a22da2934773001d735472c921f2c2edb778c8cf892295482ba7 +6253c77b38ceab6254eda38eda2ade861ecaee566ffb7228dbbaf41cac2cecce +53631734fc3240ac314f0c027bbfcb5706cefe4f1f975a8e2ee0956b23fee700 +92ef2de443b84ce88d513ba4def345f5804f6b88752921e636e9f3805ad16575 +88415aa0e0de5696f58ee1f5bef9053265fbd2fb59b1ae56b57976169aca1856 +e577d8ac3f8682ac5ae380031077961b4f5109f32cf14844d5bf33c230bdfa36 +7849549ec66ace781a6872b0997b3ae724ecdbcdfe1e3bea3985c4c49a301c61 +d420275f26fcd495a44e006fb0dc4466adcadc04ed4e7d5327430b63da5fcbc6 +15df77ee82f16d884b82ae2ca29fa3ed9bef89c39636c60d9b3fa3b0979daa47 +247a16e7c85d3a2eff262f02693468edcbab854de2450ad5b57549cd210aa038 +66b7ce681a264c8fe84d1e9db444dc9384613dcdc5eba9b416e45957d6781b68 +2b91c3f421c8ab3cc4c34770d92c17154e67c70dcf432c75b9eb5ba31fc1db9a +deac4609c8cabcddebf16af760647e84cea4ca275a0172367ad1267fc4b53a93 +bda2df9bcf433ae4a97e97d2216fc97fc6471b30d717c89c070f8907a7606c63 +2d584eb26c0def8166b20e33e5801f41937240794c42b9a89cbba3d69edd7983 +702788b068646d730615f77cab05aff0d0d3d6aa954aad02b927fd16ad2e0fc6 +e867725194465abc056a13368c8ddad965d1fc158d8b2860ecf62f91254f5d22 +642493aabeddcd7936ee057c74b65c3209f97d139b4ee97d071ca97ded70b3dc +135b4f6bb4b614b9b873d8861803e52b5c1c244041ac55002271c638d59fe5e9 +81869703cd7a6c4bf77ee3c1e874d01e42e5971584c4fe6793c9bac4ce1e4241 +22267304ee3494db762355ad4ff4f4adab137c86b075c9b8f9d550f7c064c50a +f47e512f1249167dc28d02f21f46de36139b14c872cf9bc0c42cb876b9381cc7 +c193a46d0e7e4445af03a2b80f21c03c1bdb4c8e73a45786b4e3bbb461765baa +57b956e0cd966d1e6df77d4a4fb5ac914cdd7c6619ba317f7c33c453ebf567e4 +e4ec75816c790bd658350a0fae0eb699c708559b4b5df253895491ae9c77da38 +8ddd56129988ff4d6fdbe7c01d890ee2689f235590f0b80de4a591e33e8196c2 +0105969df7fe558f8e2f97372ffe67adda409f12c17c979739510da4b5314ca8 +e4e64281658b232b0e3edfade545fd3c7e7fbee52adff818010270b0855df99a +acff5c77eb34159fbbe8c6d355da82eee52b7e153c354cf3f18baf88d4cffdb3 +00c8b1cc7f30219b26efc8abc8edd998eef793c7f4cbbf8a7d8f702271740335 +ba6e596c0876e5b3437218693508f5b59a5e24e754adb4fc549faac222b31402 +a8b754b37c2cc69a69abf86cc89123c9cf654d2d37a08251bc1f119ba6b72ad1 +55d2d0155edd88f76eb739280b74e364505548ecd95887229aab96271e461c54 +32aacb7fcccfd3616ceafbc4932eedcc145aa25e9ca13fa8d9ccbc9147418793 +b86718c5fcf833e4ee24fb58fddf71a53fc5203e1fd3f8132425d9a9bf216a79 +e769958a89ff7104dee938179b316361207cbb3aedb8422ddd16a10cab1edb0d +0077f1d83716f824236037c83a759f323cd24d057a3057e5b5cb8364528b3676 +c9bdd5eb9c47412c1a65d04a72f4fb24aeff98ac6383398760f2d593f1462aed +705e4ff227ac6805f91d12486a7658a9015ca7fe8badd6f449a97e4a4d3912a7 +3942c9ad0eeb2d732fb5243700cf95e18712cdefa2406b5c230a495e57b46274 +e064104b8b1ade3f2e62762a9528b850e4ef45440713626eb81df73b470c2f7e +e1df0501871f216a39cf671ecd4a289dba51123997309113785b7b73a5bfac2b +26532b86124942c3018c02f3d904c17596d451486f488593aaf66b73490eeaeb +f28eb3eac5f2a7659015f205fadb5c833f10375b029c1e3046a957036bf27c18 +1ac81761cd177fedf126833b3dcf3e5caf296b7b910caf9f6ea742b6a8b7503b +3772ab82feeadcbe041fc4b959586e06aa7185ced2095c33fe11564e857bc596 +2cee40d18e59317f21efe1f27a10b32ce40d3b4a60692d5346cdef10fc6ccebd +2a7ce79bbce9c4ff44b2f06b9a28ee1328e043cc12b42ab03317cf9bae3e84d7 +bd52b0761c1c0fb049e7aabe8b2a6bae03b2a8ee4a6543cd1f2c89d4b906997d +5530f949c403ebc40342e9d8816a39061aab7ff76c0080185afa3153500dfc70 +587481dc9db515fbd77c0b08d86f944f71745a0a29517136c9b679a5b0bedca7 +f623fba6b954f39e14e1fa04f01b6e377ebbe90e24d069908456762c42b35010 +677308247b6343061bc0d785d78a786b1a04bec9f9dabeb86e30e64fb4ada8f1 +b9fd75c9b0d64676c4c78d635b3386e362ec7cb06bf2c85b8a22292a58f7c038 +827a1a964af9b7b9f3fbcf8472d120c5d9c0bdbbe9c13ef14d2bab51a183e3ce +487c2c463b5b74f4b770ef9e0c60ed08a7eb54bffc1c0ab00c51163af9a1d428 +c30a5f2abb783c39e1891b93b27ba533aea8aa8b3bde4d9bdbebd0cb63554705 +5e2dbc482dfd2f70e88f9d7785b37492e6068532149a9e8fd5607911993e9dee +e1dfff50620ab8d327e51ecbc1d9f57045cad11228d13f073b197ed7bcf23bba +338890c5e4c89a831d3d6ec6f4938658b12656546498a6c7ea94f50c04bfee0e +96b00e1f90bbeef51162d5122d00a62d6fa8bcc6ba2609af9ef96f2af7341ef1 +ff453232622e760c66c04a5ad7005288a1963291a82ad061105283d9c1b6054c +5ac6087102fa0840a71d8ca55225f5ee5d9d8c5f4233f6e27992351df89150e2 +0e4c5b3707c15bcbfc0a2eef1babd8bdc8ce88410b5d21b2ad07f6a6a752346a +9392ac16bd36af87384b3959c8ad6092acfe0bcb4b1ecd45227fb53969512f34 +a99c43d16849f0282592f199a87cdcaa47af35b93c37b341d4f9df8aa99de0d3 +9dc3ee52a87141cb9dc54ee197d01063340f0d8c34abdfdc6132bc39e0d10e4b +094ef37bc33398c0c2eca7b7fd26205816798ccdacde7f235a70433df45909da +178e6ba670d4ee36c0894e42fba7c6e563dc44b64c253780c586a355963c153a +d25126232fb9a930e7e46f68289d1d1ff10cf89c2b81a82872b725d74a0067cb +76f0c8d490a3347c1e8c514dd118ffd233fcf22eebf361b73cf6d3a2fb137276 +4adf6e62d8787f9988416118607c6128f7210327017bcd6db915b88c7233b2d6 +25840ca2473d6a9b86442963466334f743263c0d9df232d42b7b35df16d80cbd +a08e17732d864bbc1e3f244c54f22f8fc198355440f8790aa50af33aa967eddf +d61cd3272c0e9bc63598c50c3af58a18c649ee88c38e4404af24867e43a0fabf +8a709eb5ba11696a044c4d287dca9328d768fc04a14c382d55dd54500cd5e601 +bf64480cc4f247a4b0c2bcea1a0c648e7e8e661f69dc09e789e12581d99464b8 +549ad6a29c2874744c42b434eaea2d2943fca61c27bdeed1a52be6e6808383e6 +a7c204ab964e78295355e2c53f021a809475ac21375c55e0e7491f4b1289b3f7 +5a2e607195f602687628ae541fa96ff05d01dfcd6c04a2ac5b6236a7b9324fff +00b71e095442bf04ad5b8e428b18dea2e6dbbd77a9c096cf4fd591f6a563bc3b +734b45ef6bfa0e83ccb996b9f8981e55627f790eb93947b2f01c46b7b4ccd788 +d870da4d3242541fce9968ddd6e438be5d36359d09ffdfaf2bf1ee47d9633132 +f41001b946b4879400ccae1c8a934a808fd1fa6db83cbe3d8dcf2af0d577fe8d +f6fe30b1e0ff0a68c7c8fcf950bd9aa17c8d8a19296670eea02cd17bece759ab +abb6a93ed4a6af531b7f8ba2e9ddc5c438eee125506816025795683f27d4df22 +d811c2646ce8830860a5d8992ea6a8c0ae01280b8fc4f27b1b31d32f826caaa9 +635a1ef2cfef6ba6c9ca9c0fe970d6e601a88ce06719578c27f33ff9f6f2d672 +dabd6f0be0235e3ed61c90bb0f304188784a018ff90156d8d04c7071f0de22f7 +d2cf7ed96707a83461ec99fa40f6d894286308858bf6f616f6c1105e7e84060d +1e20502bbb968b61eee38f151fef5af57e92f1d0196b8eaac2bcd8ce523529d3 +e8771aad8265b7e5e9846f28c2a83512fc056de6a20f8c4b0711231304b5050f +9510c17801de0c8e2dc22934ebd24a6167ff15e9a06c023d025f05d1f960312a +bbfbc9eae21c4da1a6cb51ced11db6669da3e2d8530fb9c9287a4dbeca43c0ca +936364d960f7611ab03fb143557d9545ab4fa4d407f125b8ec4e5c366c4d2a7a +0bb9a135eb9fee265dbb5955ace3bf374a0d321c82e99329166806ec8d198adc +af85bf2ef282c3ad477224d4a028584b6a2b5e4677690874194bc2ca665ff590 +da247aee67eec7772dca11a4897b12cd08532dadd9a217055b4840f26a8e2103 +e1563952d46a596e511ef81d1fb0d502fba1c6f5c0ea17c3e75e2b69e54eec6e +0bbb9278f565823dd1ba4e5e850cd6f5aae2672bae4a07bf015ff08a013bebf5 +810fa3969991aaf53ce458d35a44afbb39d4c3bd166ab4cdd2389f3cb67ebc2e +6782677b79fa51bb557c49687bf1b11f2082665b151e757e94259ad6659502f9 +0dea0e4588b706f5b9dd7e75bbd371539949a4f203b1402e5b35c06a7061f048 +8ce78957c95f4d0db1897d624e8f6f60e4f604973a89445221191f8c06f5519a +ec6be0a1c2be7cc6e5ba73c619f2badbaef9e54fa9ff4189246fb333f4dc1f9d +deb1120971d08567d890c29571327fed1651b073a357d71cb48a852afcfd9a32 +3e1b540aafab71f6a61e05addb80a225b4b88c4c0f484197951e3972df4b9560 +33d831653a2ff15e7083adbea09b33a35575678e145030c94b0c6e0927c9d4f9 +866b72e6b2c203508848ee893c13ab752bce6fd4f9fc6ffd91d28d14db80db61 +733849442b4979ec6dc0d37c1467a2d5381c8d33663995ce613728d6ae739370 +2f9d266a3e09aee52ae15fec98a8abb59ac09dfd740c0eef4e11b78cad38208e +5f60d396e41cc30828df87b3e50bdab69b39af0fec8c02c324d086eb42e097ae +4ce80ad0d2dafdc139e67391347e116bf1520ec8772b4b74e9272b4bd1d4cf18 +e808908988ab4bb2cec3db5565393461ca5af862e6a0f2183fff5d81d6508247 +05d5036599fcca825a74d487a8db33e6bee831d324f78af5910919d966ea57fb +830f6b782d3dbb8d5f7bad8aff2ffa541b16e78e2d23180b4c21aec877254afb +34076c578e4c40058375ac7e7cbbb7793488d7544bde5a6d29cffae9eaf0bd69 +b717eb353a7151bb06bd5ef2a38259798a5a6c9a684b377c0d72c932d52db0d2 +c9e86fd712ab9efd0eede6c36f24f2209605c401a3ca9bd28ff0959ffa480ff4 +a0eba22ff723e4fb4699beb0eb10c3f8e52022bb2ba2541941582667a784f397 +3cff0191832b3eb363c6977661032b8728ac754db575f3504749f70c8b021518 +90c8010c0da0503726f4aff60c240e8fd733fe37c74ce40a236e8c088c083dec +dd187a2c95515e54ea4ded8226dd9e8b217e936d4b41c767eed5d20da9615b32 +2193abab5fdf0a2c3ac1b35743e5dc9df9048557982b1d87296c2f82dccaa4c2 +3293ebfff03fb7f8f252ec7052793b3e01fb17cb526814d7b73ec1abf03d9769 +a18e3fd9d4ac55bfb534481780790b76fd92d947f3adabdc10d7ca73e59406ad +65481ce38557f64c5a23d1841b896923011af9d7c3b999772085d8da26122059 +ccd4972c484f9fb3e6319414b393d39b813ca2b603fa2f18926178f1fd33d22a +bcb5d561159b0bf186e52cadd6114791a9cb211c285118cf6550ba24a931dcf0 +d5c7bf30dc413918ab2f6404e51d612b50094de3dd281db363d254e17fb7b889 +cb5b906db3b604789ab7c7cd9922e879b1d7a5292990a7667fc1332d71e01be8 +95be5d17f05d662243c7e3088fab828dff19c60b61f1b413e38891b5c0125648 +59db561729c92db0aaca99d8309b18f0789a09429059c57f4aaf4d39c60e4866 +a01944c0adee288eedc7a3a3abdca9275720d1b3da4233c91a4ff6f1ad4b8eb4 +ef4954da9bc9e0c48f049baa0fb35815c66d644d3bb340872928802611b73c24 +397f3fe32125811c8891a8a4c454aa2ef649d12d9c285310e0177e0400d6cead +27bb940f9ec37b7717c3668683ea1de7e6fa950a5df69c6acc537864062cb948 +435d769f1673dfefffa71d9fc33c063c12f77ffe7a9ae14198a6623488ef0721 +93b48be6c45bfe6a1eb11d5cdf6ca9dd4bf4a2f0585365c690e57f83f7c0a80f +2e24520d10819e81809116c0948278b9a9de9bcf87b2cd06723c0d95480e5747 +f437531f4bd6fb9ed73f5072812f66dba6fbe10eed9b19ca8d16fc023ba44cfa +d17841f9bfd586f914e0d2b3336b4cdfe63c602fc06ff2d8dee6705955bb5b40 +7ae736aea9e77d00f679ed23049980872f1ca425b6ba0f35703f5d3d28cd7bfd +8ed8818703308374a6a0bf0411b8de186a8b9ae2c67a37e4d2a4048dab5228dc +53dd2bb2b269b1d220975d7ae8db6f17eefcba79d8b8d21100e528110bc6c3dc +147e8e2ae9a38c54dd105ba79b57816991c435f412e6deafa71724f00a1d0b68 +faf771589d6de7b07f48e0cfc509726d1015233a6d79ff1d290d40d3f1ad1dd9 +19a8b41646c625c840ccd98fa5856ebb7a36f778d9b920d7ad0357c13fb3235f +52e7e9eb1316c4fd0d692c6ef630edb722568d9eafc20ee3103ec21ec8ecc46c +c6cae184b121be328883aa1c0ef56ebe2eb0e4b7cf40cff3d0fd5cd2ca339dff +5560ce823f29fb7e3cd0cb47b16ed8bd72a2126f3276cf178bb0f1a2017dc12c +8a64aac7c26bc7f940e29410d516f4543a21b07f28625bbcbde727901f157a8f +7ee6d875847151cc685c1474012f5c92f25e8117c16b816bf3d99f3fbf844e71 +51e2f5d2b487a03399b3e263ffc722f6d4652ff11eb158327a2c94ebe007f9bd +fa6365221e676c846423d48cf1c945612bdddbafa91e7f76cb71174a48bcbcd7 +3330040298c4b93ad3dc7f7ab689d3c68daae2693482c746f3d16ab5fb291fcd +16c7dfc8b36b5105c35d65e23b7ae1f46fe78204f0e48dca991d94bd4cd0ff6f +b587386211746e1814daf38866e9293a890b47cbe47d6d0241d1a05db32f3947 +dcd22aae8d26a2c92aad8041372f86ad9a518b2b40d8f9a35e5afe82770ab8b7 +b1b2a2e2e456a7895fe9b3144ecc6f3dcb4804d21a6cf11e5f48c8f7d6e69e23 +cfed3dcbc7cade5410701d7dbb19297616419fee5ed72f6c4c302d4b6928e551 +7a810b9c7cbb33096cc68d509201879f24646bb6027b541be7013fae97ec91a2 +1161e2c49a2ab5f6ecc731da083842edab4d7a029cbace3af24dab6ef566228e +892062ec9ac9420ad0cf098f89bcd0e46f385fa52943c352c62341d5a1054e5c +5c8976d6085a43da60468e301e19f2c10dd0084143e377fb8f53b3a4ceeb0c83 +6f88ff44e180d46bb136fe75b2b2ebccc364260bd72ce07e935d65d2beea401e +2a3a12b6b1a9399b76b66fb16f57431e0a84813db0672d84c405bff5c06dfb1a +7cda4ab6974e13d88c631208a06ed15794469491547056e7929d543d05ef7f14 +a51f64728e444b0c6fcc06ff89a8289620160d82e36a477342b70ca1254e4792 +b3b0b5fd349c38dfaa19a3c306124d50079295bb7224ec8b8568c9a60f8063fb +4d49cb80175ed24bff8260e3361ac5227cf87a0d9d49f56366756991112e567e +a80ae3e6451f90184ec37082aed7eb7ffabaf3ea4cc8e9262a4c893da2e6531a +4fd9e46d3c448031f043b0fcb636084bd0284a20c57333c11a150ab595049323 +d0b9c535bc57dfbc7f32247a374412328f5119098c9e2a5182a47e8ea456a42a +bd3e53b3166a525cf6722aa07efff48901d63d851666ab149439f0a53fb5a45b +f816564244c03ff44292183533ba2251bc0b2b1048a02b270dc0d20fc731104e +176cdbd1dc8be38245cdc422ac0f96d8cf78f43343a3be655aa8b1fecbfc67e7 +aba66493f877b7437c84aadce69d46ad9d61a9b2cc484e0f0dc9376a857a8709 +39b695d5afcdb77049cde5a4ec726022d0f92d309cdbc7f6ac5e6b5630169dab +c70fe75da2048a6c5c6b75fa2017e8892c8cd4aa408452e0054c2a9e73d43e91 +67104adaff3f149a43da3deb46045f507b08768dad3587cb00a1ce8c185f874b +d66f45316bf9ba7cb47ee1a1a055a91c03c3d94128a82b5a7bad7e304f7baac6 +5d3ecca28b6624e745d728af83006891bfd39cc56e28af59ae3317501b450592 +bc6bdb032e8d5f319552bf281412e033b73644912eb30cec6010c152f36462f2 +5bca347b9ff899a593a7e9b96d6ad4b3ccb20e6a972a192428d4c5bdf79cc717 +97cc5d48a22981afa791078445b7873ba9f36a47d4e9124fb063506536bcf433 +d4f898d334548332e655f1430c5fd56161e78a98f8584de372f5036b7e02d712 +c0422bd413b89b831f41ef23d94dcec5db71061cffceb7c3f920a1a63d28cddc +fa742f11028226b3c6c9987ecbeb75e343c61837bed4597f4b2e8e130537bd60 +7eb0016b5c48efd3282e758fce1868ff5b302074cbd62af9856de3fb54996a3a +ecd8f0c6f0b20ac3b511321dce8f97d5e67643a9a63f7af293c863bfa4ec2c0f +a2c76aaffa828aa6643eee7f6408b6ea09e91037f30cf2c391f4c9d9cb5fc01a +5a012008b64c7e19ab795e24ec662cd3a931a98bfbb545be4489d7d5fe732cfd +c903cbcf2f600bcfaf858b0123a31c12f2abb98c17833876b152ee9efe354873 +b9c144acfdefcb99273276050fe43a140247a35b0994927aa2a1d7463ed69e08 +8881a303b6131e3183893e3d001f241809a990efd1c1ad7c3b419cc1644bcdb9 +a47e3a8d8fcf1f52865c4efee0079b840b82a95223193515b85b9102c7e3f0e8 +65f44580845f0fb5fbc16e339b66aa51779eb714a056e56afaf0ff6be5bce7e4 +754a553912486a7658a9015e1cd381969ffb9c6bc4aaf54ebb6b0051fc7eb362 +39941c8e0fbd44bb2fdba5dc229e9d659db1b44bf2688cc7b29eb0bc96f03f79 +fa0b953aa215ece923ef8a4030ce185073c30ed1dc8f6d6c005eace2a3642060 +b95a54b0a0b1980b1f4608b63f245b8ed7e640a9c3bffa3fc42449d9d5cad579 +e86a050e5c9aa8696c5e7c4521daf837f3213249848ad7f26da04aed56f8c543 +61b910f4e1c0e56e336894db76da6031e445f889c946e4c79c79b21c5c64cf8b +c88d06cce7614817e26c5d522a2c3d26048b964f93008d482af4f25638e190f5 +0d2775dbb1c4a4c077e3721df3e49bed7f8f642a6016963b6f58b8efd5ca7ff1 +1367b20a7019cd66c43738f84203abdc5b12ac2c0e9c8fdd15d1eefa86b464ea +d60127e71e62feb7394d5b99d465cca9022a4942f9e8f6bee849d655f6e52dbf +26188ced3107e70480cdc5e7eb3766fd734dc86f86f823c3e5c0bc0afc0707a1 +33663995ce61372981903adb5cef4df34a3b891cfb8c30ec92c4627b30078643 +14b9ef98e4acfbb87a6912b3559d58dfe7288402bfe33064f126a2da07b981ee +0dfe84cf8b2c72a67ec9c94039cba069c3ef2a24847a72d01a86145d0a97be64 +700effa830feccf46541278fdd3d35d082ce150c39d946362f3e5d23096d97a4 +76367bcccdb04e7ef9c608416adbae868f8800e645a80793bc0ce0e648a398b9 +268f697af3372197c8b33bd2760b0e75f7f38a6d94c4a52ce711c3ea21292bf3 +d48ccf0088c5781979bac62f072e2702529e43ff4bd63d94048a825882d6311d +dcdb6f2de1c3de60cab153c6f48f5b993ddae60211b154a5ef0fc2a0c3d18c90 +eca4e35b8796fe6d99734fff908735ee111af75af45b6665b82189dd3c835ffe +b13290cc59b25161908d29f385b517e85401222a94e1e5f139c5c00b72d5d4a0 +f4b1fc8dd6af78b00442b19ff2b9e8d87b0c33565ee49eda9a5e3d26b7c7c82a +ed94f162930ef2bd23fe4628085a3e7c41153fdd1a335b994b9bb10f6cfe6ef4 +2cb7dc8f3ce9d8458f560fdd41c6c189acc63a0c38e38cca94560924b4de1e59 +873896edc1b8d0170c7da1af5908497d4a48158498d8c23e49bc813eea34a1e7 +3aa06342b6f1c7914d73c1618d856a995cb51c407b2f6ab72f76ee037547279e +336fc3d223ede5cefd69b5c15d3972b2f06ffcba1dfb9a0c9f23c47f369de28b +662cdf284d112ce70934d22e2e00b5448905591d813e0ecba462d5edcebfac9d +415539241ac5e4f2ba785515a78b7b009b4cd20cccdfe4f5d8390f9765749f5f +d6e529814fb9d54e906bc323b160a29c65c60bdb47083a378727009feee85acd +ae66a691a76f7d58d031692215c3a82bfdb44cf3c52697006e8a5899a78aebea +ddd3b4c4c8139a0fe0ed2aafd845adaff7b26ef4c318a568dfd89b5060b20c4b +3c000b7cf8562fe82185dcbb58298decd616f6d9a0e879f1887c1605bc921f72 +d6b7eab7a44a883ba9f1687432c498eba28a7e650eb7b1d97ecc72c9fec17047 +7c62e050da13dcf5f62f26e62f4025ffeec90ea5ec51a2326f5c08bd1f7ebf97 +483279163ac37bf0795ae19865fbc560658c512240d5771ae5b8da18ebd3ef91 +e83fdf9d32e40ec1e633733ecff3ba66190f94f2b5338fb7d0be162ae41dcd46 +388bac55ae53b56e308c714a91ff676ae87f1e6a478075e259e9148d1b60774a +a1bee100372a7e29379ab244c8c4ba555f5d77c3d98f22e80f8a255a36f1faf0 +b2fa0ae59c61d33cd9e70d0259da5d93f19bfaf6b19df1dc35fc783b3939dc8e +d93572299348201b4549a05f316cad76edfa35467c4328df10e362b91aaa50a2 +ea7b859a5b11a9c5e9dd49a2968913619b57b8a2d6319ea4f102d8a9813d6c8c +3dc6de3091f3a4034078f15dbee8514a59e6eefbd5559192d86c7b55761afd5a +6e97279028aecc6d391feae0deac7cfe033e9e64339b0e581f5284bc81cf79b3 +eaf122baeee10655aca357383fd83d481291f37c90b8737d16d3416af742ba1e +db69f6a73f16aa2f7c122a2ba21c499818774d11141e740d8848ac15d0acd7d3 +f0acebb718fef48afec1dad102e364a5f4624ba04bc3d87fad0798bd45a99923 +abed715884d93590752b7f86a3c77b14543590eacf229f8f223b8e9a22eddc3f +a2907482fb537652ac3f6df21fa57cf44ed6b8ab79495771acbf4e99c1451507 +e949dba77ffca3820c50570d56e1d49fc4e9d89aac4824c370ce8833441f8b02 +d19753daa907205d4a7fdaa0fa130c296cb7b345916ffe0cdd15d92b7521e46c +93d5b6ad6c39e66d5d6a254bde88dfde11fc1e0a15ab05899434396d95dbd7aa +fbb7e1335de4a13915d33bac3f4da705d9ae891eda4d9ac185a9fe58c1ef7ebf +bd73a418c1e43ebb42938182c0d905e79506f642ec70961d096d6fb73be25805 +4064c56284f06ceca2a7afdbecb611a0f67e2e3ea52c186384f7713691c8174f +0bf24103dbab5900253a5f424e485c7c27723fb555d0e2c8af7660a5b914e044 +51d41fa45b17eae3f7815926098fb5346d527a7d7db1cbdba966bea36e6b963c +2cd8a9f509319cc9ba41eb6ac29832c8be17776779f8c2d6cedeac81005b91ba +fc8e4cba19744a4433c91319ecf73ac1a013554ca0ddb4eee09ea087fc9b2596 +5a9cade9dc4c9888ad0c9cb468b33bb95231646f016fe42b2b2749f77f6cfbb2 +d4b131c98712e2df5d1b024f9f22944fdaca133567d66fe5a87e734b958bd292 +4d97cfd2c3a13dbcac7a09abf9b153549d9b9c078813f407b9a9d8afe99711db +00edcbfbcfbb273d767e4c4334d9a91ae12522eaa15f54f84e2f9468b8e74bf5 +e74a1fbcba022550c63a64d85c5eb33d02ca6c0fd1f5a9aa46348a953aeb3396 +86a46ce0a13686927c03fdcb24ab3d98f1a4dbd8e6b991bcac96bde4603a9f1f +7859375319a6a850dd327d7d745fcfdbe437255a3566e9edd14af6c2e3444b1d +d9dbbcf70cbd7fc5b947266938c04c9f63938e88ca30e4d636aa9cfb2daa861c +3874cf2fdbc490e32bd6598ec696cd7d58da40bfcb6199d24f07b283b4a9a9cb +9b5426be43b4d0d67dfd8d88152fa14b531d522a9fac6cc79d2617993d95dca7 +d89b8d7efddf4c29e58cb0feb70ba74400b8be82c0499833253934c7edfe9e7a +90a004c4ee1c7e3dc31c24ad166cb1320da8e3bdd05afcda1492bc34bca43b5d +32d540f77fcf45d879a5646d4a4604397e37fcc732001d0af721d7aaf69952dd +ed912594fa9428a20fe0ae76e8401a9535f38e448f69d48bbd770f23ec075d69 +10bfd3604a1dc79f2a5159e8fb26b4a3eba3b50cc46e84e4ad657fdb0d254f0f +64e37824ed4c1efea12231df670dbc1847880cb64f7f3c382b88e183de261485 +f7e917e67ea381a568ce37212f8849df5cdd75575ebbcd7522e1dc3400a1d8e3 +8e09555799cbd6d3f488633a9e3bd4a2f6f180e1d27e0aa3949590cee53cfcb3 +3a14fe287e8021ab0777baa8859de5c21ed2fd8c3b818968bc26f5f9fd712eb9 +424c83d0ad28b76d1f5ba1678ca31925d49e2786356867ecca08a150a4591523 +964ce4589563210507493b74148ad80cb3c171e22f38e73a0aa59f13c839882a +536c00ba899d409a98480a1c7f82a44c36698d8ba5d0fb8d50771c0e91cea55b +836a946ae06e2f0c2275db32833265402264e2f6a1c8b896d5ebfc7c1872f2c0 +b4fcaa97210160403ae0ff1380d7e68251ef7c25e0a66a312fbad992aa1311b3 +61cc5afdc82f982d7343b8b7909c6c7171f568eeac8bbf8b43dde0d928e81c86 +ba3bf4549e255adf55d6e5909a01ce0b270f53169f9807cb9c7c70f3d3a569ba +8675d0f345f8e3a00a1c6ec27d5f83d275358830afdfd12cf23a0500e2512fb2 +faa9d333566da5a65dfae8ee515ae450ec5aaef7374ae1d598d5cbf677b85dc2 +e0394ae746b8c9554581c737d79b31048f4471d72972fd34bc2662a83bebbb32 +7d3e2c2bd7c65e68672dbd3ddc32bcc31b27812a1841c3edcecb723bbae371c6 +70f5dec75dbc9dc90e557280a836ce401105aafb64deb25e6ef6396da68183aa +a39e207a4ed29a41d9be11cfd888c1e7c1c5f869ec0272c7be8c85703721101b +0d41921b6ce168b781b1c745dedc1b8fb3f8fa027b0c2f63aaef59bb3c485c1b +c773e6c0672bd48bcec83042cad9b3058b14f14051906960602293261be27514 +bbfc3b41fcfaccf05d7eaed0f50b3f9d85d8bc79288b474094ae92dbec3b7870 +d16c92d667fb2074d176928ec7bcf3939f665b774762ea69b989ee8c8334f20e +3451189600c26df2e3a2453057dcf2562cd28a8d04b101ef004990d09afbf7bb +f0bc3b20218d3270e0a3e3446ed7ddfbac2c37c5bf8eddc74c008b170d912bf6 +b1da8b9377005a6b6fcfbff04d0250a74b93a1437ca0a7cf497637106c239017 +160bc50eeefc55e12d6c3d65261c238e00b0bdd7a7c0cab8d1e3902ac8d22a11 +a7ed80dc0dd04ac63ccb08399b92abe56b4cb2b29b2bf5bcc4e7ed008bb99881 +c74036842e45e41debec5cd4c652d37ddfea9049fa439747e6b700f7baba635a +ed47282e91ce7eb743571d533b7eb9d09f0c70081dfe408e503f14a0e117196e +c1e7960f5bd60a1f5f076e31c6ca28c9ce51061d4bdcf5e35beb3622e3424529 +ddead48eebdafef6d30c02dbdd5f1b5c00bb52266a8ac0819fd60371053ba1bb +80a8954a4eb7464618ff70369083068f1b60f059ba217291b6585d12f9046aa5 +e66dd926f9d802e694ce1dcd909ecfc14b5f3f44c4f73a0efd3e1422a747a308 +06ead9d72deb9fcc1a33617fd94ce9cf6e31b027b86937d0dc58b350a3230d24 +2596131192677c84137f034d015613e65e04fce2fad699826a666ec8e1f758c0 +f6fea6d199c6b3fdb6b81ebf80fba48ee1192e0731eb1b6f439f654fe7f419f7 +618e1e00dbcc0dfbbd1897678a9e4a6078273233229035c98b0e1fb4f4ba5102 +91d44e807c37ba07dbfac535c9714fde3de3114776dc82e28f7906c342ed5688 +44c2f06a45de22c2704f3b8c6293626fb9a018026a9bf7f688dd2c25a6f35845 +fc3bf34ada6e71c93249a8575cb6753fa9d7d8a2b10f4b0979aa234326185387 +63a8a532543e427ac650c67aec94fd5f67a697d93baeb2c8d1fcd83f04de01be +37e4b8d966f5d91818b80bba52c34e80897521bbf46172c89247c257c77be91a +39c8e4b4eeb5d54215def158219b0111b7f9a6c3c5b32945a5da895ce74fecd1 +c89c2a3933fdc1183edfc2042594fb11d3f2ffdae852be0443f5c37765b3aa75 +2e94fb1a0ae436a38a5178023601e903851f015d1a74d1d132366af6ab2e78ff +5493e19ad35553ca6fe7dc51b6f5dd62f22058c35f2b0ec5755aea9722491f8e +6a7f5d3e855f56533fb9e5775fce5aeb0ed6af76c3e7b24eabc352548bfa2550 +c66dc44b2795ac40d1223b416c798cf1c3aa90a8b404bc4926b3bbdfc2c8a995 +823857a98bc528813437a0b892530fdcd05f1fd496340f528b8bd245a7cbb8e4 +a77482da0f6c2a00e492d878a13efdc2f280015a6864657ae3226ca00477cb3d +c5ba741aa7e4bd3a876c6d7100564be6f6a2de0613ead5f9926c2e4cf5acf5d6 +5035e2a79e286ad6fb4289ec577bec28f51a8bff37423f9f0751a79b91bee5ef +1e18ece169ed2723c9d2103b675e335641cfe424360ce2503ef49dd8d158b8fa +7c3d6bb8d1d0bdc607a08630a67be00625786626f6ffe698c3dd414215b56ef6 +756720a12c1c32fc363db28ae0e206181ea32fe554972e6bae5fa7bf89ea3c5f +85f8b274b9fde63c7251e43102fcf4aa7180ec3829c55040bbe511c619de5ca6 +95765172d5c832691f6c432be0397bc401e2e54ea1b847bd63c85c5c9f62cc5b +e1ddb4ed907938472ce6a6a3cab60495ad8d5967150732915fbb5ba40a8130f0 +5df637309f37d4249298cd57619452601dcbdb1ac7f022f6a024d7ef53c0eab2 +b00ec3212764ae73ab88d18806c1252d0ab508951bdfa2afb67b9d5a1460c11f +c24eb5ffe80440260d212923432ad3f3f9b67b58462a66e7313e5c886a046e34 +80a23e08048ff3c918f26194066e29c36841b547aa3e374c1bdea8c9802509e0 +e787ef0aa8a9955e1824d0ff95e294dddcb644a292e91e8f00109994cdf9681d +c84725604b266b8ad4b196791f2752662189ec0e9fd076ecd5233b3a436f39a0 +388be1ffb33d075e55a4683b9cbe917b06c1d18de8f08bc06df4a8946869355b +dff8bc9a240ed22bde34f932d90ad2994c7b001b55957b9dc7a7931d1a87e215 +367e5b424cb74545623d8aa9539b66803581c1746e463079f3b52fdad364eb68 +58d70b9835b140cd6db9ec95e50a64e4b88e88d2a79fc3cf7ffd469801bfac17 +1373ebfb52e32486416c387c27f0a455ae5023cf1259e691cf5b5b339a2ceba0 +9a2c556ad65734baef23d18acb009564a661f59e1e93fc163dbd1c0f2fe231a5 +8aa558be68f033d219b0736b42a0611fb15916f3058b3acb9f9fd35d81d6e1ac +665a358233c0aa23367ec3adbc777539cbd7bee88e68849bc91037670e8d9df2 +5402768f04b5fcf34fa8f2153c37ba7ef356b669b5cf4615b745d8b9968b6009 +bfa5ada490637faaa554106d24d4e755e4f9f3a9f52a1b15a61c35b8ecb983b8 +083af04f9fd3511fd8d36f2d822dbdf884c61627d81020a0acc19f5e36099daa +53b0d6d98d0394569fcc93833b89f87e115f5cc26317196ed78210afa8a5f0b4 +9abdf7ffd38a892bffcbf30064176ff3c7fb3030da4afeb5af90610abc321319 +020412a91fb03811741e1b0ba8a8c93e59161eb5b41f82bf41a5c21694c8373f +58e3d1dfba33a6c5665d8b73ed95c9566d67df8456b2f61c559b2e8d60c6e2d2 +f1c85d4eb1ee33dc4718a4f37e6a5b965ad32f8d16cad21d98ad189721a79aa5 +454249076a91c684fdda1a1eeff70dd07274b8c402b6a37012b89c0c6870537d +056fcea0c6fd79efd834fb29f8ca28c25c57de5123c540750972b2bb08311835 +c11e6a5bfa0c31b18ca3f44899a8e160d97715676ae211ae8ca83cecbc6bd654 +e1422aee98c12ed1fbfc834edb3229c7a693ae4e6c759bbf3cb496672469d856 +cf7da97eab3042ebc9bd3b645c1d314d3e7b38087a2b0e7f5aad5e880a4adb50 +e2819b638eb42a2cc2c3b84a27eee2959e51811af80b3abb38900e48a8bda718 +078a5402c724cb4080bad3657b1bab969e2f0a2a088fec1ad16c2f7100370b95 +62753c659fe32401787f51e1649274294d3886e7fdeed53adfc66efa195a546b +05bf288823b178a968a20f8af64667d75e3e8b1c492b571aef01e55623e33e9a +f88bef36a34d620fcc742244482747708491a1c56611abd75cd8964155f602bc +60b24f38121bf53748455bd660f17ad52eef19ef0d16eadaba48d5b4e0cb0422 +7229961f8c1d14cf17a7e88abcaefc3eb54fb656c105b2babbd90dd6ff7d44bf +9d29c6ccb09b5c8ef13515e6184d15939fc90aeb78b4e064e21e2d376dae6dd7 +3f4fb1442ba15e9161c62cc93acafcd55aa333ca496803927d4e40371cd7b5ea +665113de3b56993e991c966b7777e80c8e0b82dac778254d6d9b3b4c661db3d9 +f2cf96fbdc16a936912a0781cd61af375f314fd8933642fa12b970a75cb813b2 +7a2e900a742de7d1d762f780fa3d29637c1b7dbd66b7d4f7aea7a3f51a6510bd +8dcf5c4dc4b5ef5139a7f3f0f654588a4848e9d642676ea145d5df301ee491bd +4784e01170c4a5a4a0787f83db24931b5d9b761b1ef47302944b8e689d56316f +80cdfe37424c484c83c02ae707803169d1547cbebac170ef5779911878988333 +1577c0f514131c9f94914d942d0b4cc6d72a9d06c250e0454810862a0973ba63 +8ab9d4b424ed51d5abe3e39f0befae042437bf1acdd364d20d76e3737956a0c7 +e666ba52a889a52385496273bdce52e307440c4db4a70e7a6da7c655469d060d +4353f090bd41f70dbe4b30f33c00d8964f64029c41ccae18243551afdee211b8 +9744d966c63913a6714ee2b4d1b82fd0aa1e6d2b296da04b3377f9b621f2fa39 +0b23bfa275b1342f62e6dfc4e3ba85dac525ace7cc2c170157b32dd13ef9ab65 +63c62e6c44c45affa457d12f0a8fc23e1e0cabb5927e7584fc714d310d3a5c30 +71d204f98979405a0edb83f468d58f0cd82ce3d84857f928124b5d4d592c2dc9 +196a7b32a7b8ca9f3877a9d6463f1a4eebd736d02e543d2ca7675702e06a5c54 +08f5fa709feda49a9b7e202610ac9dda957eb65d5615d91c2fd66c35b88ebd5b +ed398fade31d7ab65cff138e211f9014ac86a994e58d20183908ffdb55f64da0 +39d1a1f86f28d18f9ecbdbe7f6abebb2ac41ac88e385c64eda6fb9f73c47c6fd +b29f0b4dd0595e5c7f76da3ec7b81da2a516031bb54ac9678eaf2c16999e5181 +1af80b3abb07354a786e339e812ab142a59004733178d3922de9a23ade1bb2d9 +23234fd2a2836d3c99f582778cb069c46ee8c14999748c93f7b5d0b607abd3ba +cc79739ba4bc945b8cc535ec56511c8b184569c7428ec82f5ee9766acd217037 +2b72cf351729da098cb6323a724db4561045f239731661d2ec26fd014f57bd27 +07948c03ede03875bff01c4972530cbb129359826e1081c9f2fccc0d9e6098c4 +4dd980b1988c77bb4e04962c501fd7f8c5d8cbf00e97b2020d75d1d73e4d19a4 +929f282565a130474ca0777cacbcf429f995873f54031469e3095e39976a6877 +92e3db78cde4e930213f64d8ada47874900a2fb611e18c45dbb8e219d44620e3 +151fd42a61da68301334c7c8883c800e7a851ef4072aae38076c4f11418443af +7e22c10fb99f32b8ef835156173e00f37a1457bec7c74fdf0af7f75fb1cd15ab +a72c0eea8ff66233b2bccb79ca66860a3154a16bd31283d0ebdac5fd5f54df28 +190388468f1a102a99b733781b7674dbcd9faa280416923e7331b6f407d8ae09 +5a380d8ca81de6dc066ebbbd1341553fdebfae0e60aaa229d6a80a419991e8ac +7585cd947f6e026f6d1abdc3ebf4280d3292948b1ad434f26b98a05fd19646d6 +88894412749bfd5c15d963696fb5b8490eb5d0eb4a72d15be972d115db0be268 +724bbc432e470a467971c3f18feddca78ec38e60c79fe265959e82fd986918c7 +ef5b7a72361ab3249272ffb6e55b5608dd6c0a4fb1b72b50430f230b2383d8ff +bef2b686cec585676616033e1a0c66287d6803376e5d8e689980c3a5bd5a7bc1 +ce993e47ffdeea6f94d8c562d4804034a3b9a910c4d567ba82af21e4fd778bde +ca490b1c5e4982fdebbe4ca4592da9e70d5fa99fc17ee11963b866f7f62efebf +e30cd690813542f4fd8a14b43ca849c323c8d67569d279406b31bc066e8a99b6 +284586fd6e7f5368bfca05466560952fabe47658cf67b93207b004a9e7995a8e +49c81472e2bbf23fdc86466a6151e797bf086f32282a9e55749f94f8977fac75 +e2aa9e4af7784c533f50c8f1eabb82f5c325f8b89604d635c05878ffd17e45c6 +5f71425cbd6df1354f76a48ccd20d009e6d7a866bfb654fa0b1f4c1003f96419 +b49b5fd675698911d745106d7bc1d14db6d182fc82602ce2ed91deed5a07e683 +36c1768e8e0a87e1e112fa37aca99b4d37768120930c71cbacf45b58f70f767b +3db154fd31061251ab484ce619129b2d5c13a76bd15cc92d68aff8773c65e212 +399c6d54cc6a5fc0b48ebb33b23b916421dfdf26d4e8afb814619dbb9dc67a07 +951192e58ffdbecc7bf82bfa10d37cff66f5b211da9b7424fdf504139e6e733a +b1179cb9b56cf570f63aba413cb12872ae76eeed4ae160f83c977282f7c9a692 +cafaa72a6d89a9adfbc498625cdcd53fe9fe591ee00a625b157321839eb85784 +775665453d8187cfe0aea8a671194ae185ca9db23537356c9061d934de5249f0 +2ac01055fb32f110ffba4560ba8bc94cbf657ba57ac8f524a2d01a8323326777 +b6ff3413220187834e45da6076051cd695b1d51ede7348cdf8e51b675ca293df +dd1101fc53db5d7f8de55ece38a55e5528cfb4e8266df99d41ae7db821903111 +bedd329b1237bf7468ffcb8f8ced0d4416b36f7b2bc0231aaa331bf2474f11f1 +3657a008f9279855854ebe123ef3918acf58530ff76553394ef3e72741e9fef6 +ef6aad2e58d4ec10614f041698e78bbef2456260e6842dab488d96d609f4c77a +02e18dd13549d77925abe02fa098e923baaa3c0565028522fd8e7c0cd85e15ab +18f37d4ef871b91a11b2b5de8f5faa21bd9d1d312d923964c2f608708aeb6301 +e31d028eeb41c46369ea39e99d0ace2a3739e5f8db16e86615c56eec5ca95f6f +4195b39efe02a7ea9a6e7941baf8332f224bb9ab9ecb4b0dcbfba8e084ec7279 +24a004938789150a479da66cac3b054d108019b4745b3ad8b87aba19b39d00a6 +104e04eee9b26af64e338bf34d109b12b79fe268ea224a827311479b3a3b527e +40e7e864ae56cec78bc5a487590e0178a8b6fc25654c60404661e09c1f82003e +eaff3a58c0c3730cb34415c85a5a1f18d71b96cbcefe4685609aad50c106edf0 +9cc002ebd9fedff5e401affb0047bad90130e144fbe267234390b70f21d8dd18 +c43340c360bbbac5e15a745ec971d3fc7a07d78d9414e37ab6a1f547d7630c8b +a657883d45e788c499157b37410934f73002f10e6183b696b1034248e449ba93 +9178ce2ae5249d4a4db91adf295fbf3bd72d201e90750a60d9224da50e2644dd +6904b958fee6400b27cef19671c51bdea071c494acfcd1cf8d85bafbe9b2c3a3 +f39d120303ecd5636e6ea61ebc8af0037be2789d8d885953687df1c7207589fc +62441bcb3e7b5fb34092d8f062aaaec579a29d0ee2eec0530eacab19356a0587 +d143aa46fd5f7748859fb088646edc3778ac9f8cde1da8684d62feede0ed12ba +3e4efd2f1f3702edbba6f881e40b91ffe0a10ffe7f52f14bf975509bb43b2516 +e05ec913fbd145e7a6efe70d770fcc43700e9585432f78e3cf0c98a8c68d738a +dec7a4b809014ed76cfb8fd1b12eb02ee8617f94d0f3a3bd273f0675c2371410 +42201b05d1d131af293d460105f728afba25e65d4f8aa3d1959fb4e6166b6ad8 +fc2d6d41f5b1d11143a7fead000e9f46c3a6c2610f013f39205e4dfaacbe7bc9 +dc534ca456f44f95ec4e573ddc053cc124499e20ef2ea5c4989a9fc053b48a87 +aa4618e403cebc2c398af7ecd2d4aadf65363842e27bc5d20f24ea8ed8bfb829 +506d5a1d0739cc7e5716d0581618a1125b87da79e086d52d030603da88493d4c +14d99bfe5a30e955c233d3aa98f4b447aab941f069dff47374825d012b053733 +922c16fcda14aba584899d2766f4b0dfb3b2bc505149aebbe63a9ff68df22cab +1beb9476ec1b69d1f036f3abf79799e6fab6a7fb7fe7f61878642b5a8fcd62d9 +1218e6e52585dfc3321798d4d27b147be6dcffc1bab7c372570c5608e0236f26 +2d9e81d2c11c06e453f40f8453e3a4df34fc0dc124108a9cf176d41f7e2675aa +030d9c9a0c3eee010e2e6b53416b07a07addc43e22aac8a78c89f687fcf10924 +2b8e323b666063e23de1fb405d213567807edc2edf7955f4ce43938afd21eba7 +0239d81517b14c34a320e62ce46f48b10e3b8f0d443cda27717a5a416dcf968e +93ccea00568c42b31dcc857ed537d1c32d4583ccacc21efbc9efd7cfcd22a88d +4594dc9c9cce5c6dbb68a6b6a86568712a79321a3ef48335fdfc2a3937447b89 +d43a2fb9e0ec41085c249c571af59b4822519aa496da159326458b5168d9312c +13ff0b9879a8c96dea99cdd10966071b12f2a3f75ae6b150bbd0e032f7a2393c +6afbc4ffc9acc38afe90606c4f9afb95b5c2aa160539126dbdb2ae9d61e5c4e0 +ce260ba60a5c289eca44c0898637888e1bbaff38a4ce83a342fb92c64ce086a8 +5e6b0048c4282631bf1d6a42dbebc647f77e63429b18cdc8e89b2d0ba8040ba2 +7fc47879bc4eec51e5ea8f4b5628929a0859483cfb2089660cc15ec5d9dc577d +6d69a076ed24e02e80b83f1444a1aaade36129cdd98f91697f0b28d53a56418e +ca65cd49ca8c49863a8f066ddc4ad208dedaf2e54da80f294cb0211a90340771 +aedef1185653f5a2f7925894404a9c12a50b6e8615c2e5f48de9f9270d79c70f +61599223c0a8e822d8c60c56fa46100f85e5ab43fd7dc58b8330563495317ef5 +8219cecbea2f11d8f24ce226b52fe0ac472069eba02e29655c20c272eadcc1c8 +18ca5a0e46eae3a5fe1f050fecaa2485899f8a53f4234baec7c38343552c1577 +10c72838c76b82bc6a323f1d8dc68ac54f8d468da99c828ded907e6f7c1e38cc +bfe55c46ed3c2676335891a0e3f0f3e660435607a996030008f28fdc34ec67da +c93e7062c6b46c6149ebdab9d8378aa7443fad6fa5fa52d76834aa04de524148 +e5db4023e4de3ca44d245b94d6d96b503c14abb03d7c2207f28439cb338120a4 +da8d30c55cc8976c25dc4affa410e8aa3749a6a08b7d37da55d8fe73f95d0b0d +3c6b302a09738b28b703c31c3912646b2b64bb6124ed529748dcd032b4832174 +38c51c3dd591f4651a22f9fb00c91124c84d8717c4313437c014da2e72b62f56 +22ead7a96d0daefe66dddf7cd9d4f77eb17845958bd97249a5896cfdd57c4d8f +24e3ce5dda5629409f881ab5e8498bbd473e61dd7160a5eb6e6b5f47c2e3de09 +3bc622e2d1aa235d4eb341ad4277c1d6261c77bdd27d14e8d0f5a226957906b5 +f6e86f1a72fef7d88a90bd711cec812ef92f08cef71eed903d8924f5493aabdd +94cce69e2d4b04f111c63557f460cff4702b46f2e49195eb4f749dd4fc67070c +e2770be237fc41a300600e8e4363dd2d57da17ebf287fff4b3247673b662c7e1 +eb74033ddbaef52f8a00c406e7b01875a54e2e41b9149cdcf919356aacb0d2b5 +88cbf5fd0088a65b789e51d2a0ac37f1c833d62f022eb47d0580e04932cf332b +b7c6220ef8791981944439bbdd9934007dd5fdac813cefffd522164d16727705 +7078e41788ae6450dde5753f39edc4bc21861024aef6145aafc70d0d3c7c509d +5662ea004699eba1876f6fcfaf1757ee7f580ad9c071ccd3d02bd445a8d2155e +8a1bf1b8663af3102b1fe47a14bf454b789ac0c5dfa3afd8a47c55a7f1590c2c +2f520cc3046555f35bf8a847041d54ef6babd4c91fc786336ead55c3e83bd9b2 +fb4b4a0e84184f0bd7130800760ea587157e08d5a2390f84359dae2b7ff1561d +94d8dbcb34c98db6b45d0a593e2b0cd398e1a96dfa93a7ae8e7774ad57cf2ca8 +1028349f8a5feb9652f811221368bdb34eaae8d5e2e7e16cdb6f64ce04c37ba2 +4589e43481d723051f163789334a5bc087f2796b96d58cef21d82d0372a919b7 +93d782bee7cd8e91e26166f2041e371464ed4cb6a73e08048ff3a596f4689f6a +7b09546d8984ff5931a5ad2c772eb59ba1386af0281de907561423ebbf7fae48 +225a4261359bb445959a50a34d4f6550a582d152a83066f90cd6d99029513b9b +ef7f182b22afc41fdc2824bbee4fe2c53afa59ed68c9c2873aceb7e4354dc0a4 +75c03dc0bfa5697b7327661cd4f1e61471c439365707afa1b73377bca188774d +a8135ce7279ee809f94a5de196b97dd70e89a152c11c57b88ef540ea1c083bfb +3c99faa22248c786e216dbfe8fc6d60b3f7a5e291ff0870c61485a051264e213 +58fc910521db6766bc77721fa8ee503e40efc848be05822ec37f4aef6486cebd +e693d839b7bb902efa75ada15cff2040d1ef45feb81f6f69010ecdcac215f5e5 +f11186cf3dbf369c11275a1874d4d8cda1e17565bf6b7a4f22e5f7452071b3d4 +14a1f17bb32ad088a7751101606c6881e9d2c1d72d88e05410df086d62936262 +5bdb1fc4d48bae24abe9a8c49238a194b009bd7049914897ef28879f14366e1a +9ddf1f3bf2d55eaee7676cdd6fb111eeed0b67dec4ab583f53030cdfaa800a71 +cdcfc5fd361dbca0ae02c754ce8de1a2dd4d19d8d91f338b4f4dade9a5f10f6e +6a0201c2a7a11ffa5bf843881b5fed41f778111cfbaf373806c1fe279a686b32 +a8ea253b2dd83d6af13c5111e1bf990300fb337672df16d47f9b988471775229 +337151a88011d68faa093c4439185ac1d4ab96c945a363cc9b599f1ea0b9a4c6 +6a53a7e5c49cd875f0565a693a5b99b4d70046545549e32e32173d1a33660de7 +a9104dc3cbaac08b6cd22095e7492aeb5ac369cdf9a5fca87d343af87d625d46 +b465d0fde1a5e425f6e6509808a775bf65510d64ba9f1fd4cf83dc244f637c05 +e108512d9ddc088f6fd41a4f4185e664cd906fb33fa0ccc4c3c0ce1d546fde4c +c06919304f2fdb24500aa01a61ba0c365f6ca1b57bec0795850c6bbd3eb63218 +9fd7c118689b7a17793ed9d2165a51d563a96bdd2ac062d0c25e055e13965af5 +c140014d039ee059075a208035a5e9acdaeabc61b08ea51802be6cb592cf1e8b +c276d2ce5f4ac5d914e8f8dbae3799372d0bb33ed94f8077bae807ef69a07758 +d442ffe74d01f6f960b8938140e83f1adffdf4f0f0393e73ed41bb2bf11bab8c +aeabd4f54fca2aa26bd5bc52dd3e4d5c598e3af226deb96c3efc96c479e0db19 +6bf1debfcc4bd8bf05cb0e3dc04be5b445881266b74eac4595198addeb53dc46 +16781a275a481f4768f607346db394fd23eefc63e946a4357e8da64ff14813af +0a06b51e6f9180a48cfe90f3c9b9eaf82823213d605e56359ccd898414fb088f +6a7c483928d5ecb72fd544a8cb46e832b97653efa1629c4890b90e02b9e54ab1 +ae990473adc54d7b687a9c559734574248005dc2f125d7ebe7040eb23f4927b4 +d376768793b666f7acf187b985fa099b8890cb17e211b67ebd09742f06b224ed +96a0c969d8bddf909afb02bb05cc66ac0a5bbc9b80cf09fd19611da7af1ca69b +87179d1def40bbce64ae68a52e41978fff34f91a2b4369f0edfcbb7749b042b0 +d9ac767cd80d57438fe5108b4536b72e6e5e504a6e5b4cf70ffadb19d502bcdb +e7e3e566d1269d0a9631776c4f5c52ec3c98d63f41fa32ef489b5b697e2e4998 +3da756a7791a3a036c258f59bb22ac004c821ade383830f0277cf580fb1e8972 +7c75a27af24910a338df6a4fb373c6622fbf818cd71a5e891d19aa95a0255968 +619f356d84f6b430bfda80012396a2ab3bf91ace171a6b3f6295fcb701f3573c +684f445ee96b38ca3b53db61954b4de9250c487181f548bf9b2a20d62bf61c23 +02769834fc84af37612595d6e57be1c80c38e5b757b99c3c073a490356ce8099 +ed09b5fdb9c9e1d9f9219033d200c9e5b31846f4c14ccaa679b3d7fe2fa688b3 +7229c69c984c5982933f0ef41765b1c1656e4fc98a2086ff68b910391aae365c +1d88447411145f885044a11f3e11110296d9a81793ad31310c1041fc79c337f0 +9d2f073d28ce537934b841c41bf677b24ba9826b6db142f36886f45162ec3679 +fd46d7a7c219182cc2e2760d8d2de2c975ba4d29ef94b65ecdb2bf1a75a8459d +5facd5dae80fef1ffa72b0824165f25e7a47b100e1aaa34192d3f017fe5f11a0 +a9bedea570c9ccf6f8d18f5ab47ec271e5dfe1d4280d24f76b471e2d1dda8313 +4e0d760ff6f5673ae87466ec2e66e7ee5aed7bbdc5ebe9c723ef0e0bb20159c0 +d41ab0a2f609a0066f627fdb132fabdc28d067a4fa8f313421d5096071b17e33 +3311d9e905a42d49d9c6c2e3a09e7afe91fecf4e1ad5e6acc6ad0c91a79d3046 +c9ce741f9b2796f2d021f8494804eccd7e256fab1a8623a014060f0b19b7154d +2aa1e772c9ca5c68b6247987d190cb0043a9d2ca7572bcb43a69503570b2a374 +3930210d268fa1b528ba3a2260e6363df7012857c411dd5e6dadf4286ce805a3 +f03295e3c3db0f81c6e4db5faaac574ee227f7b3c98f4b738c45c9bb39eaa1bd +17812d2cb45fcc54ac785af72420ba310e3267d97bef54c29315eff146b2867c +d300d8f6c0b943e2f206a3d14c9d8a9ab4358cfbcc9cdcfdbb9b2bde4aa8155b +69c929f12179006235dd1af1a906d9769978fd90e21b9e3d2369f21f4b9e78ec +41a67909a2de30cb2bd2c10d2b9a6020acad882d6ff778c4a6223899f1832b52 +a23ed654236c8e09543e2c6afbf03f4c1a150c0ec1563db17931b1304a8248f7 +76fa88792ec90a34d39f885c95af9ea39ee8e93f84a9e66785431a7a99a52bef +d1cfe2b871cbd391e6b3cee6461e42d6837aa46d632dc3c302f07bbf934244f9 +77ce851023a129fed5b480b3bf8321488939288de6d054a55ed01a97a9f6364f +7fec9ef87b9b49b1edbc3fc5e192c6d9aad582d2fb1ef161bc2ca9c421ad5bbe +33bd0828d5228cc9b4caa49632781511789186c3212437e72e4914d5fb17698c +74978dcb5f89b066b8804efad90b3bb8b7246d4943c71d54122c2a36d9f71f87 +c3c898cf272e017ee9e2cfa8a0c224da23a460a96133b13f7821119627b325b9 +bd2fa8f30977d85c690723bcfce51694bfe89439f2c39222bca6dd0c9215cd1d +6b9bdf9f912c470d204d2b7b5717e018e03417181fb10685d9eebe592ce5dd6b +626094a06dec5a89b7795d789519ae31f43763828d6075eb023983ff6fce4e21 +25d516de3b380f04c1f498b846d945a32664b61bab4c28e68ba4037a8e462be6 +8e5622372c5f8d56c2b6c0cac890918ba6995e1b03a4340c9ced6ebc875be611 +1f445f705f78cb117f3396f707d2736be5d32c58d98ba4d4f72a2bf05bd45271 +5f1da83969880e4b580539a3c06d4415e89ab8f17729bec04b961929834c9c2f +05967038a7100bb5812f618a084a8d137d8fba8c414a5a0fca217e8f4fc0e3f7 +0da232421dbe0a2fb47a0d078ee4b3b484356ad7889a942fe6b29b4dda5734c9 +70f668a614cba321a71810550a84678e71f43f845cc47b0f4b82418fdbe34234 +0a28f53cae7f2ac0bffc4a9b4a4448cbc7403594b9c1570d475837bcd6277aa7 +8983daeb3f31442d4a0cec8a41b362402b7ec3afe2cc8c4372db07cab32b44a6 +3a00389f097006b1b1f7187b745a628f60f64124e845e16a8114b1d6402d3898 +158ed0573ca935bfd23bad60da9c6fbc0b10117dd56304cb58f81de3fa0feace +1957bacedced8e8f626752cd755f067bcabfd234d4f551c684524a711a691fa5 +3be61de5319436e86688ef0f0b23fb1a8ade3a78a1348acdb47ca5c327305555 +156c24acc760602f133116649bcc5a413bf919a083c2dba88306dafa66f73382 +50ab5e70ffd8e298883c620d3a37a1dd532c193f7976051e8e2da980d5603ef4 +8bc2518775ff39b5390cb7994be69973e3fceea2a99046cca5d72a5a2e9fce56 +d1f5f31f9d05f4e95de8349a6645e936ce02825f55785d110c3843399c726129 +d7ef56bc39b65f4fe6bdadab905206bd305f034e6e64489b7d97da2d9831c988 +8a94cfa8ad0c0130154033bf82287160ad0340938a78cfa27aa291bf4c0a4b09 +1db4f3322e3f76e556fb16afafb55d9f90c0749636e71511102d3d2cc091e8a9 +bb0ab55707cd2fedca6151d279ca75d90940b3f8ccbff65982143af38d17090f +02f8d5b6b25e1c49ba918cb6f3f2b9befeb404f150e593162ab14e277ee0ccc8 +3fde67c7778195b795519556db688e4f76a9045e029886f60db89fecca97fc9c +23fa3c0ca5fefb0de6a923c715e90b8360b85a51dde11776fbc01323b578ef6d +86b76123e3c41a2e9e8470034c64783072e549ce2949d5c2bf6b0d42836a60ab +2b51621b608b2e22c16e6fd23a3288c8f721430b22043cf3b48a1c8a74e84aa3 +7a06514ad9f9a697328571e506d49ed1a7e1cdad6e1e9f3f41a99f84ed060d85 +41f56e88cbca3267e0d496857c103fca42fa3d4118396d494c82250c0273e939 +94a09f812dafa45efaaaa6194a234ee39eee66882798bfc41d24cc303f58a445 +5733943c10c0c10f6776b663d0f59286e2a127a906e8d7b2d55654b15bf58016 +0af11f67c20968d2b13139456385cf84430a425dfc6a48066a59f6a91ef3cf15 +b3c8e068b91892ac2218add4ddd8d201579d6ccf3664294bee67d3bbd0b2804c +5165e37d567a70de26860b8c13e90d280b0a79776ee6fe064343b1350094cf41 +a5dd65ae40fa25a4a579bd9fb74f47114cce0c04e6c7f6b044fba8509f456b57 +81142522088226d82a95cc38a8823092bd3d113a61f6439fd78f70d781b0193c +773a4c5810cd352d2febf25ec138f5af2e5ac51b4adb09fdbe4ea683922032ce +1b202d30876a59a3c0009139b87b6cf0c37ca07e0d585435986fe85a9bdf2743 +da27b85d5d1a37de840d7fc2e5d92609d65bab8192f88b758a6c631df196980c +2fdd706a2d8c28011699e7498aa1c14e47a7a2cbd54312a6c5943ac0a9a3f163 +47eb0d6a10f5ad603c080d9faf3571cd2335fe4d1c92c7315adc25f639a4f0ea +609e73035bc24bb5d44371f19a7fe7c497be059904606007ad153b59c64bcdba +e3a613c2787010cdc081df84ad9a44495d78f6440c9a7bc7395d04d776169c7f +1ef0b7621e2b440a8c533ee3660d35acc3b482d20b3515457173bbe7faa9751d +f1ab67fe48753834da25917b746ee6d2e30ec6062221241283d8c34787455db4 +541a04752313bf45c844a9ad0a29ae66356f4bef8fdec5741c19c0d2d7bdc699 +ccda2af082f28202f443a789e9b40bd6491e777a49a4be285d5f985583c502b1 +b2d9568e493bcc1498a90589e5981323234426e5769180d74a5bbe4358492875 +337845eea1381ac1be58745711667874a65ef86e367bf298a27b60319179294b +d2138bab5125b6171150ea426a6158164fd3390cb51f1fbdc930a2c1ff6dc802 +cfbfe3c6b6e34f8138a0880a098992b2824ffeb149d5b136543b326d30520063 +42f2a60e79e576769de0e65da6f65c88ce9fe8d7869b1687d0912c518d1da5e0 +5d4aae80fe32d8f25aeaaf53865e022590056983221fb8966bcf4ecabcc6df19 +8f03ef373007e80e224e1a45e03b957d39fdcbdefe916b32f9afc8a48c91b647 +6ef437aa7768588068977c97892eb1d4b5d1c9c9d49b6ed7e0573345ef971304 +119f725e0f88fc8794b0c9cc35c925e4db50726d82d4788bbf8bca83ec533f2e +7c19d7b153bf2d4cef8d5c7f46ed2f1b1a6ebc7f547a7ca5289a1fb0c7ea14a7 +34dfffd1543702cbb4b2b67e8cca16e54f971d115aae21019cae5e9b24defff9 +a7d4b50a44aa37015d68f3064f9c3185ec444cfa3af32aaaac7f4e6b2f71f7df +02ba34a4d51e2886a2517ce0b21ee84b1f877852b3d5932840c14d523576777a +114d80f83c8b730eb41447bf168c3a2d259851f545fdc15c5812c58c79c8cdd3 +f8e9eca6e2a41b53557beda8f889df48884d521add83e65e7ce4025c5187419f +cce51c7ee43dd66baf2409b4bcae3a94ad2d99227be325ab135c9b38a8a0bca6 +3bbd58e7f7b0d438e8b01e441786d8a5faa23f6b957dee7c01e2172b09c7fcdb +cebeb62ede3a36b13a3932a81f512c6ca6f69413a83ee30efb5513d2b5a6d15a +ed4eb95338d01879109e113515553402c994f32ec590e11f4c0845a6729bbb71 +de7d4893839da80f1d1200a2ea5ded805b3f8b8e4209fc74a16733993e910e8c +08c3aafa543c04d9ca3947cdba12a285466ae3cfeadb0cef83286da68a806e56 +62ec73ce7913223adf0c88deabfc3c5852ebec0b67c72a00650314724cf38bf1 +eb463820e829bce660104921f069bfadfe4e3454e9d6342abd2b8c5bef56f385 +f63c2e0d095687f04a2bde230fbc1beb95a19bc3ccb0e454967260b13313ac23 +048e48979aa0e379903fc3307a97aaa6933519318a68dde5bec8370956b11b07 +46a09198235e6a5d3a21ff337be92d5f291606cd3505ff41dfecef31c4d5804d +3f361277028148653bfe090a8a9322d797c2f7c094b7e302a7cb7d0a6aef8533 +4db7dc06c846cef50a24d5a463f461c23b24b171f964f4733c1c249401e791f5 +088b0eae5cf16bfb79d5dac5532a7814aea77e35c072e6b69e50fb18445a6130 +2b19b60969afdec3edbb0b66b914c3973d1836faf2ea01c65d75401a57bef394 +8de682b7edd50be4b7a946ade2f5221d6cfc4b00e94ac2b390067f2dc92161c1 +d73f7e580de3063d112fa8f27cd5d6d37ade4149ec5f8b8c3c9d88d13c235a7e +bd04cf1a2fafe65da20b949322b50dc78a485119775de3e5ee70ef714d598c27 +0b82d4e73697111d0fecc9552d8f5caa3439b7a52f5f445b27bba45c3606ac01 +0666c4bc2a39af44107750ac6bf3a8005dfa3248413d98b000bf5e55c3188ade +5287349a01041067cce0f841d6c2f828248fb96e6ffd770789c72369cf05a9dc +831e7b1b2c01bad69d465e83af7b3c291cc74fc5ca2e69c2060eac386abac347 +5d56028547656815f50f46a251020ff63ca64dc1fbeda490493a55b285d1407f +3cd803fb15906baf8bff8aef2eec3a738fa9c011ceb51805ec77ca1a4e8434f0 +9fb36b45e8d95afa830e6ce6ab350a4ca06c463444d4184b681df11e04e733d2 +9dffa1a3a68c502a29e05be5206c5d31c3f260f56b5f88901fb0aa8d7dfaa992 +4045686222cece6a868b664a533571b19fc3e1e69397f3d9d0a8bfa4b3df5a6d +40a52946b8bed057167e3c3ad3ee2305d7af4a16696b00bf5463e8fb76892a34 +8618ec3d153b3878c8bd72c21ab2c90ec88993b855e19bb7ca23e454415e9977 +3def574125029a9cf24540c6f61ae73ca96739ba838f1938627499014708f2e4 +1a00d397e7c67c74436dfbab39869975b9ad748b90abdbaaef6744b796696c19 +5b8b2d0651b163bca5a1a5b6188a29024ca97449dfc87a99ffa00f05c68c3906 +b2588be6003f1f35d16d2e4f52185b87a0195f64cce629f9ae188c4f21936b48 +01a34c69b570b67b4ab176b30f23e28f40b25da9d5f8b30d147c19dfdb1c5f3d +a8ab8fdd2c22d629fbea477afdb3c230f8488b6d24791f76a53ff2c21daf7ea9 +08ff9fccf55f0712fe16bf836032f104eb2c454cb4e2a3bc93493f40f9dc0c02 +c121cc50ec16ae11128b8f43202622a4eba117753eb656fec0e702fd1f680ce9 +1865b792896d48aef87f5bdfe71429e5963c74a77b24a036cade70ed655b4271 +2b5ba33ef9166444840df7a1e3b0f6c5675994239840ffa04dd8f4cc8b47d694 +e6d6d601d775c19bf504ee8ebacbee258841aee1dbdadb64cce7c026897a3ffd +e77b3e0043af31eb442ef7ed53dfcc969b726eff1f8a43c13c13131c6532ae0d +9e8703618ed8af07ca8468aefd047658ed08d6f647fa2809cbfd58519adfd791 +3f970d65a3f97f63152d9dbe9af502a2b6f012d2a81e32f8d8cffbd56e63a9b9 +e49a301b2c3699706088f94e7a3f11c7fbd215cfa8fcf44892fbe4f50062bf95 +38fbcacca34099f0370de74576d768f1f199c1457bda68473729f390543aeead +c9be3985cb5cb4e01febbfba7021d69b9d038a326a76fbd1aa2becd26f7979e5 +bfac785b8dbcd84cdc90993b553b694449c98ae3aaa0d1fc59953dd57598fc9e +2062cfe07d482e20f23e1b6b8f397b797656f38116853178b7b1fd8a78fb7071 +c433fbbd9ebe90897f52651aefeda189f61069f96d195ecc93692c417c9778f4 +0b23525ce5a0f6d29bdadd0abd029089b9c255201d7d829d12e138538dad4108 +1826ce5a43d78ec57f641000d191c9631106268f64ac7f4946fb8ca5599aa3a5 +017d03a837ed1c765bdfa4780f3375d95041526cb137250a0af36b9f9d055fb1 +98fa33d374baf553aa3bdccb1f4eff10f972228355144c7709a6cb45052ce6e2 +bc667623b47c220498a25caceb28dcabaee4ccfced7aa6c14b586a2e1c60a9d5 +4f4313885970d4f824c9807375d8a1b70c7b5fbc36eae7affc902c89e394a2c8 +39dc7e4d0c7faad918c768214e16a3e3b38e3a3bb382bce607968c8c970a7bd5 +91c6d5bf50341ea777a3d64538875fd65a714c881e73818c61a567d1ff2e4d78 +0b2851ec0a9abe877f26dc9b7269cea5585ee3997eb314a370724caca582830c +f1e1cb6e517528360930a1b81735adcf20d43511249f520bbacc0d94f7449d60 +b62c90d220e1b2f9afc749b9178829b5140c5471074b074b42ec5c28e600e8c3 +b596461665b2fa699f33ab8eefbb7932d383814a402748183cc59289b27f19bc +ac8b64cedee4bb5bdca401e1714cdfcc9c0329d35939a76229b77f629fea9551 +ce87384ab083011c4bfc8d5e3a1367b48ae5a964785b34827aa72c7b6bb4e8b0 +3c6990b6fa4060dd7bd1eca5e2b6efe3c8d9915940525d6d70ff2b2c8fe45128 +22d4cbd4490ea070ba7b8688aca9ad168394170b7169979d7c223fd1c67c02b8 +df0aca0cc03331885c384c8a573770e5ac87b01bbbb8ced847f7a4d68e5e655f +ea4920b32bdb79d3d7099d942f07c18b7829b1ec7d68d187c550081a4831ea95 +c3333e213aea8f45dc8aa8a5b7d925e05979cd2b0da0560be2367b9d1fc368e1 +837cfd77bece8538b26b9306e054fd86cddb668e58e487a772f89138c00cf8a8 +62b913e9ef8be9fb90cec90bd6a74c4e96f55b3a73be8f223eec41958313dd0c +b0094305eb85730ba87f6827d6a5238727030123fdf6566581105d0645454553 +0cdcb5069c9f1ced3cebb1f5944e44979f17bca52400c98932e6391d5cdfccfc +da6df93f86b6da1832f83683fbd0ff6b47ad7f2734fa4243520ed9da9521e922 +9fd4d1961d36f1fe1f0fff958d4a12caadb6de73b54ffc64d72c089090af3fd6 +24a712e60c9d7c95c030827d1da39227d5e6537f01e149f084451c7b1799dfdd +ec0fb4d8b3655240ee03ae14b08c1947da7a66465d5accc205e0d4c3a25ae300 +2a1f991a5efb7f592260e6576a26d168c568deb32919a5f47325044e7ea0959c +bc65907b731957685aae01d3fef2d9f87b3ab44cbdf72f161ce92240734b3018 +ca6c963aa5b29402b5f12d539672c4ea7bc1c66ab6104625d97f41e65abbedc7 +5d3df3802f9c2101b4cd6fc7e559873b88e8dd54309c8f53dd2d6cedf292b366 +2fffd38681bdc5936dfec644cf6b7a7e415bfd7fb9de469266927e5b82ef3e7f +011aa4d70ca53c6e71e460a7be3fa42d9307ffa701ebe91baa7875816e1901a8 +15e3ba35c3b4cb00a6c87b98eed8d8095740ec71d3c00f8b578daa88b3f33dcf +5bb6635f1b2ea62eb9abe181dff47374824dfefcafeab400020191e74671a097 +91a6757c880d4dd5a7e3da51241876415d9f70c689c804b6e9ab5b2b87f332b7 +c0e2c3bf5b2246ef438ed81ff8f7808859632ee8fa4458eae295eeeb9cfc7b03 +0c0b906d4805f9d33a39a3dea89ff2eb56db4c254579c92ee37286385a5c67e2 +0a1399a73ad6921b46082428bd84de18cf92fc9f8058b7bb3c193a4a50b34403 +358600d3d3251a543a6bd9ad3c5db4138dc043876387bc1f55d919fb8c35cc11 +cd707aa89a7618ff67f427c74998a6e75a84f261a2030710ce94325020dd8814 +91384f4c83ea17fbb58f73630613552a6e9a905a98206c8adc56b67419f996d4 +1da159cf2d8695507ee04fb958ef554e30d482cd8f214478062d4fa026f86b13 +3dbeb81c957e43ae99142d2b9eee13712878f5ade9912228bea38b1d42a835f6 +45f056ab9b40681d736ba72a9b4b5ce2743e92931676d8556000d32d259e163f +ac90b30944a2cf1c52a236b4d71a1b2c0c8d45fcbfe447c732b9efa9d3e103c0 +381211c00da6df127d5f57aae449b9699466cb369b996898306722d85f8c24de +e5ec2018a7a4042b07178fd55632305cd5bcc0467dfbcd5ecdbfc9e494dd5a65 +8327ef45f0ee3d232622646f56d7764398dd5d01e92f5aa4fbb11d95cfa277d8 +1c0d5a15007cde0aebd5436103be6833beac9fca1eba100724eff0924dbf1569 +97f7c080f05ba7eb68e201f6bbea8541a94973855b800cdb7ef6079de238b758 +e465e27c2efa56dc98ed8e4c2861e2ec8df3f2e919678ba369890d15b8002fc3 +546a3ff1def38e2694941a702ae77e16fa2e55442de9248110a8739e58cf4b76 +664897bbbe30c2b6d172b2604da84c60746a7339c7971a83d516ea4302785c02 +e508a35efeec0b61a42caba94b28bec74f53e66a9a54bbef4ea1171472e34bd1 +dd2072f460b24283c8217d6bdf8ab34210c08cba89a7d761df442ca147effc4b +4c041cac1774eca35d106b2026d71615b4279207039ecc03b0404dcaaa7d61e9 +d18ef74eb9bdc614225238ec4ba8ae417be9a6386ad0327dcefeb5a25412bf36 +e6ece299be240192d182508a51c1c1ec7ff65096f0f6219f25b8d07d67aaa3ef +d4bb00475135483905e87aadb826a889cfe5fd3af57466b0cbcb91c397cfb9ac +f17bf93c4bd1547c6b196cee7741726321a55aadd02e6677872f6685af9d0030 +f1c331a926b9c42ea8b6832bca8ac9c607a73b527da6c9a2fbd289d781dfb35d +7c5a053f8f91248f1c3ffd96a1a5813ceade13599db1b3ce32f5bc57f0335693 +c8d4c405b6f9a956e704e6e99163ef2f0b6787f0bff18623dbc1158e34006608 +70434bcc19164b41d499feb2b26fbbbe4020728e4882a6a123a8d78bd1f298d0 +5249ad33d6111b4a9c6f3ed2fc7b5a552b79af79a0ff935775823729936d3083 +b7b93a0b15ddcd84581e28b75451682eb6bf9d3c8ace9b275a510cd6561058a8 +8406173d4128c3cc60170d911246294f6c6f8e71a8de8c587e84d44b78e8ee6d +b68a4e4dcb14d73b6d3b35f2d8c3aaddcd0967e570516ed9387382f78e741c05 +1093aa322dd6b0a42cdaa10e510ae3905d0542513d348ed98c4c9e01e0505f52 +2ee0b4658e51a433252f9d10cc18232783d58f88997634ecbf89a2124a89754a +56a4b88de81815b3a17fa42e5b229f80aae7b8559459a773d408141928619cf0 +f56cee08f05f8748a201573013e41c6f6bfbfd740759e512a1e48cc4da24da1f +aa24672d4164234b31c631da10260e2e9e788bc2289501b083e926d63152b46e +6821383d6065e28d61d7a6b57b7d9859289dd3a2327d3251ff65c72ba121d0bc +81b726e38ec1a2e9f2abd4827a6ff5d19f3b58ab955a609a97f221fbf793aead +e245e3164f2824210a5b97912b0a71694c3cafbf60e0af983b31ae30b4b9a41a +aae396d6433db119aaa6a174e02941a4209e3a7ec58581701021c3af19b12925 +4e16cfcbc2977089ec85258501494eeee8e21a4729fdab90efb334fd2ae0300f +ee893650e27238444c5a8c0511712d6c00afaa55b83a258a691177384a7f2d7e +17da838132d47c18a528098888bb160762d1d93660de8de402282c4df7492ce8 +920d1ac9e9886e4d9a1302739890fe2c95eb37f9dfe73ac4fc51c4b0dcb1ef45 +d1dba50df66f32c1b2e03e2bbdf0b151424eb2a5479dc085a84ff7940ecd5651 +7480a4e7653edccf6a147d8af6da9977aa7871708f6dbc0125ed0e4eb6a2aba3 +656018e05f90831ec7d00a9fded05da231c00b95779b0cb9780d9fe96b1dbbd2 +291d7eed562204c11393602fd2d90ddc31d438b420720b5e19a7a760773107b7 +8e2c1aa72e2e1fc16ea9474e7167ae6be661e6d0f37f3beab24d3f9ccace3dad +be68fe29e086a62b2882eed800451f432db02614da4d1b7440d2c8aead012aac +e32f90080f444b368755d49dc24b05e0c48ef3fdf57fd112166685773c138ee2 +36cee78ae6d93130e97e8e633688ceada23fe3aef575af02d5bd3c2c5bdbfae0 +7c83cb2710fab57f4fbbf57a8be81415c1abe8b6318db53dcb71e8850511af89 +4d43b842cae1e9b4f3db6304d45d99fdb452ebf0ca76c1d7592f1c9eac61f785 +c775c0cd72c883b0088cc2cea72367337a0af42b233da8324b02b660cebe5970 +ca1858217a3d140556d5894be895249f04a2fe9a03cd39eea05ddcfa0c757fe5 +0122410c80274e6fabeeec6c0f8181718ee6e673229a0a0ac2cb4414da14c4d8 +757e44d32207fa9f01cb6a4f04a6a67c38b219d1425dede228ba157b4d1ef96b +e16bdb889e8c9527a0fc4cdb2fd6aca296d7c06daf3f259f0ad74fd806c047ff +0250339e1c1d650d8867ef37c6c42cf7f930fa6027445692ed00f0be90a79ada +9de99a986f81117165404bc82cd33a64c1778eefaa123c3581454a8334ec0529 +4cee91dc0226be0dd6e8a229199a069ed36d5b76ec66fcf363d749ce886fcfad +d6cb008f76f0298be337c8eef13a24ef7c3d774010e2e4a7acc429d8c0da7a32 +f8bb44aa9389d4f594be75a2f764f9cdab9011a3c65a3555a9509f81c27dd091 +221ea30ec6ed8449368a5d4ffd302fe809f3ce67f4738e96ad29d93e265921ce +45622608522273b64bc36454a7a2d3ebd334aa8acf9e4d4ffa863ec25819e7ab +2ed613933fc57a4afbd0811d4829d2bd9802885735ccfb251ef38766b436deb5 +359278fc0067aa17cb27310c52cb5ac59802aab49029ecda9dd1e02696d4fd20 +75becc63dca6908d1ff00efce86d5ee281baa70f62e3738ae4f054bc027829f0 +5a57e15b9326df9fc56ff8c040daa752a0399db4d265f221103192fca2b3c88b +a6d90659c0d85556e58c473dcf3a1f851b4a1c96cbb48971e1cbcadbde7b6799 +ed6b2d77eac67a7776eb7c571f6dc43ce0697f4392e75978b289965920cf17a0 +d78aeec7c733c885ee89ab9061094d0d01022bef4839951faf991876c26e5e42 +9eb7e5a57de0da10b61ce825a06d33df1989ef3a93b83130219f933ce36e4b0d +1f626265306898140b6d6f4e4a253cc3c6e27304b975767a38127a0b8d906f60 +53d097e7a588648e71fff1fd9415ac7d7141abfb33086171868fde663f6a0aec +ac7c8f8e8cadf5827ce72fd49d319ca5985cbd50341c30967084b5428cb488c4 +859b000c3f0cd1019267d9ac317e02cfd4f7d4480309e7f6850bce35c850155e +7cb5f93160d33fafb4383ad3924d0d665647865b5b9835519ce1ae14cd4d26a9 +c46f889407d0d984d2a3e63cf6aca920262df305ed31d3d1a965c20422fa870c +d860c3ec7d3b5966678c238c0e4f69daaca76fc006201072facd2873aa30db95 +626cf97cd33eb47950b2b831040be0691f451765f57824ff493c3d06133744c2 +9fbea2172f3097881cf406da9cccef1b6be9ada1909886ad58edb99228972dd4 +240898cd356432c333673b8902ae243686912f45ee6bde468bd3e8b09448ec5f +00d7a9213628fd6743f0cb028707ffe5e5b8a8a24e83c3750d68c0e465b820b6 +30d209d39da1f548eb22aa88609136aabfd98026bdc4582bcbe7cbc50deabf90 +49d4737e44f1f899062386edfecd5dded3a743db71a61ebd8a81ffda6470612f +7cdf827924bb4e7e75e6c91dde90e698b319d6fe6fd982955eb99424e0f26aa9 +3acf642ee1c9ffcebbdcb6102f9ba206238cfc64d68036129817a65a175327fc +f34c379fa002c5a2b9112d5b9064ecd77912987e28883259a6ec9f2c2741a84a +03830b31693492ea5286ee18a52af05b41a6c379b6c850b5cb4d31f60a6e519e +981c22680db193fb72d365f0260abf3389832ab1d78759c1482eb1ffae6d8c4f +20676bac1407720c6d3cb33d0b19106c6f3059afa85f3c782918708dbf809228 +81552754d6fa2c7ab482e703d664aa495805292274adcd64e7696a5d096ee928 +9e350c8294d7a1645354674e66213f18553a72fbeb7fca3647ebb5828f5a452e +03941d4cb822ef0839254516c2e6fa668006bee04122ab89d1e958b57b98f0e8 +ef8839dda01dd884e0bca9cecd0a9d6a037f5731c7048b488f8e972884904692 +c0a558358d736a25b7eeaf608f9c85ce45bfb13fdb0011164c50f82513f8fa5f +0a53330cfa24ca4c59c50813974c2307480a47c25044b2bd1360df7c82f2f482 +9fdcd0581ae31fdae1e36d59ed2a6b8cdc97f005d32333e27d1dd49444176a4c +71887d2757d1034f27dc74793ddcdb0d97806e9e16328509c760801174dced00 +316084e04d488626ca71a824c2e1f36c7b325a3f1446b21d465b8870f7a6b05c +ec4c2a996db293a754d49a6ec448b31cbcafe353209ead320bc8d963432888ef +1ccfc29e46c0c7c8e2849ffb6bb680f5016670b639bb411a399c63371fd36c6b +079077160bd539d0f253eb437d3c3f8bd522a05632db51872cc2b74cf505da34 +eda8b3039e636f2b8e9dd82951380a5e5e8bc776e996e50938b8f9c5a470f366 +e26e719646a3cf2e362a95f8ff6776cf5edbda555846f284c75874399d211240 +33cc43062237e479d024a7c34c6310b81f3a299a148c0510b78ef9d01a2c0db6 +151c80d7978a93409e2c7e01417bd898fc2d091a4f258e777f5c18dfc432cff3 +7a13005c10deba3b25411d93b6426cf9c1e25d3eaed39f8f7d1c17f8ff23bc9f +47dd0674ce0ffd60e12c1d406587cf6ecc678220fcba0ed870e0be75768362c1 +2b8158c19cc70560a058e53b83b19560ecf18d0acb4316b7061a9d9dac63fa9d +ee3a0da5f7cbc2addf7ae5310aa833ea1f45b97e7698558f73f952baf03ec25c +ae370256a1f81578d360814dcf29b12764f88ceb7ec3358e923f781bfa4f632f +de9414f7b98ea0b063536770f3fb4ecec21a68caed7fc7c85b9abf613b94ea8b +94f49a2c22e23233d65d4d16e4e6cf2c317da20e8f2307d4b4c654ca9d215479 +9cb625b53cb49947961f81ed2ca5fdb4d64f97edec759265788cfc48333de518 +fa274828bdc27394e4a0888925d2d9270716c89f82c2bc569be497f7ce930924 +b4f16ceca99254efc0965a3eabd78da5a16cd9f8d581cb7106ec2e9058b2c9b6 +7550555c837e57fcb453174208c072f26c717b88ef55bc13bc3188e8f768aa6d +11026d3b69f0628cdca2c2155df354f24d2af4c9941b0172acd73cf9c7f973a5 +394aebd41728178dbcd55e73a998df39cfb66a287c0288e8e0e0816ce5ec98a6 +804b2d1ce83f2e31a17d32d47033ed9549b0b0119df7e2736bc89a21ff725695 +018ff19d096d87e8b310b9c0884d4f8fedfb889538c9911d4e3fd53aa570492c +98a5f5a822886c60b8b2a72e775d33d0509a4b63e016cff3b2c767a6d39143ba +995cdd4aa4a8c4de041c27343cd57715fbb6d48a46238c18d79ecbb2548c0374 +b9af808dcdbab805c520b63b30aa66a4cdae35e4b71b45c3a2db55c34c2aa879 +29218f60b74af83e44b1ab43906a3a54a34d85891573c594d3ae52fcb548d177 +296b52fe2253195f97c568894e8678583165010db416012acfe3083431175563 +6d1dc919105faa02f9ca5878a719aa7f0719a4ea81ce7bbc5c2af1ce73a5b403 +c12ddffcb317a401a4e12e3a3168a04ed036f04b973093605d8d4a9be6bd4cf8 +6a8b57b37633a1fe2791b281f40c018bb53ca08a467735377ddecdcedb939d8a +38f757b77970cbf6f174b6a6c60da653e3e3366ad55890e78f61d293c4f96e4f +f03dd48b2b23f06b3dcedce3c624eae1497e5d65eaf1723447d2f0ece09c8f60 +df0976b17c95dd43edb503237218d7a36346d08b285ed0f288fffe09ddb03cb8 +d2d76449dd1d40db1d11992055f5494f9b8137e4c918a33446a616f12f5e0683 +a4979daa9b97d3acb1fdac75242e1c3f2bad66e3dc8a9203333e48376a6ee721 +a86b34087389370ce971a7057d608e93eb4d7989f487c874418fe9a58bedad1b +622192bd5f8e012b1d1942a6d65bff9cf5af14cd6e4cced7379a77cad8221dd4 +06adf2beaf7b32155da0b6b22a92adaa95d206ecf5a7704c4760d14d70b7c268 +4812a0ea07f20c02a797cecd44bc22e147df1c10d51c221e0c2161633616da82 +53ab9a727305515f5e287f7ec56f540f1e7e7d9142811123b84df2cfe7124789 +447d50bfafffde6ee2d7f206996b2fc896978a06628c983f5e33335b20a20fe1 +a71f01634e917ebd7996da19287755e9f9eaa0efdd7a12934da4849121e0f52b +da07c25468a7cc24e792f5d8b37443a72e2e50c655bd80a7badd47e4fffabc67 +7d7c4190824f88b63c0606e93ec889184c70e88f92dc556e7e71239bbd733af3 +0d781cd85b03ff796bfcc24e7ace070db05149982338665b57ada0e7c2b80d27 +a64bbf46940f28865292f05f249a1b0d3891efcd184f32f85bd96a2623c5329c +c59686103b6593dcf33a6b77e263167dca4a067874724d57efe3786f97349854 +809d3c8ddfd04d3942877f5def5aa3fb5d8be234abe999704cc133dcb3fdaf1e +889f6d43cd4fc7fb570460f7ae4c3b2de650b6d9e8caf3c6a338394a68bae1b8 +ab46be4452b9709240803db075bcaf0a5c36008ca4d8080cbae6adf1de652b8a +72d6f9b1bd1628eddab2c1b1f28bb144f9cf7fa7f86613b5b0e13d3f870954d7 +6e358c7841733c90d28f8ca3b045bb494392d36a1b2c9da9fa354c0909fabe20 +b9335158f0258d231301e9ae5a2217e566b520bc87583a5d67d5b1b9b0a999d3 +dbb824d88fc6510e065329ebdeeb33e7e7ee38ab4c9afcf46b089f6489287a22 +59a1137f6f31978958e1c425c2b8aa54e8808d12fda962c912c44092646d2fc3 +cee8190baaa232d539f9b453aa07d1e0527e6493d97b970017bec1413409110d +3709d1a7faa79f1f07757be5d05718b09cf1fd0fab0a442ca9d14483d95767d8 +d8538f13c198e4072c332b3e0002a3a77c014a1682a5b113eeb65155e5a0b464 +1fb6d589313a2e56709e1be53e8acff66fb138e8f18bcc6b684457c16aca8a02 +d063a19b8b2849205dc873ff1febbccd7778f5948e8f974d85f74ee9845716b7 +d431708eb918eff9ab80be8ccae06fa58caa0c57f6c3b0c4f24fb07aaf81da87 +e12ddb61435e564ecb3b74759374e8e08d98c011bfccfc824f1a7d9df9d83fb2 +cb3a4136415297410035b6c824bcfd9b01f7d6f19f065bfba1eee8d560045dd2 +c552badbfd6b03ba6293d12b01985eb156c61033bbfd2553c4f96a77559061c5 +8e9e0d7737316fc1a1b4fadfc662ef1caf4aec6c2231d50cd7583f94af423b18 +ab4b9dbff979c200181921d84a63e4e722bcba97e42f78170f9441d0001dc280 +451cdc1104dcbb65df237553e3baeee3c69153ced25001e6fb970e6072ac27c0 +fb99138c0c63a107c9ee8e9fe1de42e534180dd9ab1a5c2d4f4a5cfd47711c73 +f55ca3cbd2e074c1ba4700ba73d237113e9f1908836c5a334c157b903113a9d3 +5ddb5608d0efcd863b973fc55017d106e68bc4fba6eb3129259854d59da2b47f +e82b837e5c9b44ef7f279c0f6c0ffaceb7f48a72245216e5ce316a09983455a5 +089114d310a111a4b11da77a68c5e965265504cffefded03b1dcde16d3c3f940 +ebee6cea1616cf132b0658baf0bae5d3cd6043a8bb2f071df65f1e5f16eb0e7f +84411556a2a7e5fcdf6b692c3dbb9d9fb6c063a2ff8eadde118501b4edb0e647 +324860b5a4402ebee015b663eb8ea6fcc0ea91b97eea89545ae93c5e3cd5548f +c83f754e3ce0ca0703c2a0f35e0343d137a499aba617f83d46c7b7c0597fa84e +1e544dd77afd9cc36558449edd033fd4e7dbeb57071cf624c109ed1ebaad04c3 +15eef5bb0b004895834dbf6b867198688c9b4117909aef484930e8a31602452f +c799fbebacbe7b75d1ac37f6afc8c32313db3c8e4d64ee504632c76654e984a3 +882762b78b8791e6e46e974ddbf7ab4d048076aded03b6071f373aab006e89d3 +87dc28db2580559d957e2a1626b1b936a869da79be30d451f42e583f0d9feb53 +14a59195da976d1b6f42472a9cd34834e3cc6656cfed7a4f56a00f721967c384 +d664d6a48781058652094ebd87350c6a3a4692526053edc59963e0c5623d1df4 +0a0579224fccfc98730df4e1e0ba9b258bbbbe9d2b4c1db9c33e2a4311080da6 +bab0e4044ace3f56fb92c99e3cd0229c4cd9c1cc03c1f1ee32e772ba7cddeb6f +4057a68a458414611bc2eb218d824189818cb4a95cde2fb9a6700d412b3503f9 +8ddba098f014da81df3344748d1229fbf801c1e2316d95ed9559ea16c898ce9f +64f4e41fc35748e1efc299c26dc3b42c26123c330b9c8cb7e001da5de642e6fa +c44c19f97b20e47ecaa5263bee98690f122326556c5cb69e9a21286c3e462332 +e10721f7747d3425cc204d4b4f514501e14840aae43fb523b89e8b2abebea979 +c6762a89e4546531afff98c36cd30a38d13fc19116873917684fd3043c3446f3 +7c6c5a36ed36eb3900bcda089778c671d6711ccb2f7a7373aa6f519b27e7ac73 +581ea404ef17adf8c92a1f8e9edeb0201b3a48866584806e667d7eabc955e19c +2abfd1bff1f71289b2d8f694937e965bcfd6de56844f0e5fc980efc777f50f18 +9cf4b2d7c0fed84513f215845aff1bf3e4250aec7d7c19158978110a81d73f44 +92da75ed640441da004cce30d28826514e409baf6d41f7661c4668016d9fa019 +380a21444e969a6aeb6ad3cb2341d0287e2782a409675295227fa2ade601e1ee +33dadbbaed9ea5f0715a88f5390868706ae6b5ec4473c15e65ff58e9c8117106 +c83ca1b91001e741eca076cf0cda6d9e44de4f8dc762175f422e12382dec63df +164388ffb614abd40924ff4f6ed0e57cb451b320136c34ad9e3462ad884e4472 +7fe5f7d5c6e55997355cfcdf375f3ceb4913f23d7873731d77435e78deb10d07 +d0afc29c261ab66f2b5d1ebebf36e96b536218e85de4211b5be3bfbbf0c359ff +3207f6d35ee4738be6233e4fab21002039fe208f10fdde73d0ed01e117a69c8e +056a048757242b698bc4567f0684c8437d5d391fe2d95ca241f09d573654fe1c +cf138ac60ffbdbeb15f975f8b1fa3dff83f552e27844ae3f44c4a874feb1ba98 +5237293ef7cd143d83dd6ba9cd08cd0dfd63d3cf8b5536dc9d65ea582b2b5a1e +852778730e3a0ef6853d3126dd7ab94bc3cb8c41f60c82aac4d82223296fecfa +e01714eee59cc4f75ca5bc0eb875f8a4c9a6d499c9a7e1cc470987404dc820bb +c610db9470c0153995c2ac7cfdd334174b91923efcf4de1f3543d1e9971dac29 +a6a67169daf36b910780d691201638783401bd49010122d7456c7d8c1d301fc3 +243103d48e9fda5982b07f7300315a1abd3c84d7aa3088f00214f8c2b4ade1dc +d82061a23adb2d2112efdfc648dfb995ea7da854793df6cd6b3d6ed7a1120832 +220c9e43f05ba4af43913c5bf74c1d3340d4e11ab7d68f6e4b9f785034b64321 +1a1ff2fa676fd0cc367605ee99f1c7f4e618bdb26746cd879a8670c3506707b2 +b774104efb3596ce07ee5966c7a7bd06563f7856742b284bfbda52a2664e264a +5f781c5fd79ba767a19936fb3a0ef2072c998e1b916a2f2f663b4343afb8f168 +f2f00d3f5e1f583d20ba03f6f41a980d777c7c5fa5300d457830c48faf007548 +b642a7da2ce598799b042d03f4a1979cd0130662cd81511a5ac2866097352329 +a93cf79be94055616a889151b66b0054053822de0248141d4d3c0471f3ec95da +cc00eafbcf9010ff26f90c186fed7adcf4383297311c3dc317c5bde2da60ced0 +e6dfcce2f0b25d00b1f16f5884981a210483a1a4d7dbabe00baa1e2ddf541a8c +cddc9e051a54be5f4c2d0ffec3b83e931fb42456d49b12f4488627d3d3214c4f +876ac4ca7e3a4e09a13d09c0741c7511361ee2726a8973650c7af8175fb81882 +245d94df87618d1c17632cba8bf34c37f91681670dc816afef4ed278f63a9140 +9cdcda8ca64904523eda55908972827693cf36089dc580743a9eff42e3f793f3 +100bce00a6bfb089e595c736eac8444815aafae9654d9da0accfaddddf283629 +be4a00a9f6b464bd3b84bfe069761777f71c6fd398cef5b915b7729dc2ec8cae +b4ef063d47ec4ad9a0d8d8316a0deb5fe7982824c9f20ba43f907b56b124a2f1 +b3fe3d644e9a6f1c1979130b56a08e9a91d71de0458777c461a93fa416246373 +81d8a7b70639422ecc3841958dda5cc2ff32fb018f7127b24fc1f8b2a97f4eb8 +a5ace935d51e1f55c5ac8f2f3627efd76f052bb517560359f6e139080b19f328 +46f0bf11f1a5485f055151b5a802d3c9b042ce62e367446f59519a37dabeaf46 +9c7951ae6216be980b97c3106e1bc77516555ce6a82a25a2c348eb0078cf5a49 +ae48b25df34867cbe4318b2180a68f0d283ead9448f3a93cf5006c9fb4105c38 +e3ee2a6a0c2c68516379781abcf30bcdd3e29353c08cbfc7c71cc33080a37fdb +5eb3054341ff059d1b0adfd213644085ec8f1ec8e0ed033db2e69e5c0c479925 +1e7996a730640b1e16ac49341478ff1b73bfeab8dfcff54c4f10dd7f10d00db0 +16d2e673fe75ca7cdf656de1aece63bc018ce97c53335c140cf8b98927b869ca +cb5b1f6667d9df1d62544dcfcf12a15432e31efda2d8f4d96b73f6128e73d9dc +932d2babfc3220aa8c6319c9fb435470625f259104bac932b7cf05c222dee3d1 +70ac1627567417f41f4db1c7fc7b892d18b2c53f12995344466d44be856cd953 +49f4b959b4749d390f66bdc6ba0983b377af879fabbd02f1311b6d87b3a45075 +516e347a9bf9c30f0c22573d03294fe0bf1d86490dd5e0f1800e97aa4cd34328 +325d62c753ae10fbd5098d1659687f930da4f195b9e4b8616bec2fbd0b6c941b +09b03eaf23bba7544838473f2b5aede4a712d754a117591bf98f2a534057d7ea +4a99ce86c87ec2b12619223c8046f9e9947fc8ec69018cbe93dec5ea5ded8ec8 +56b1d03f7b57b6ca0d8894e7a26c721956a66df5d582c397beb57c6c120ea224 +a7d5acfbc6acd556f5a08d60e5c1a725fcf062c8755df1d6f22381564656446b +19bf6518fff2bb1e04aca06aa90cad4333f10b16f9585e5d19ee150da3931c8d +a05618f6e4e188b44059ac3758c930c3ae763267ceb422e1b4595802b374ecf3 +2576af6afccf151af304747e2405f609f04509f38f17dfadc6383ac24d18f5ae +f8eb5125446d4d9b0c67001c84edb4032df4bf86e8eef2c113617f3771c333fa +c9b4e8d10be191b4f0b62a21c839a52f75ab070ad8d7b6fa6fe538be4844841a +d1da0cf4948c018259ff3065dee62ea4a2a586fb09550b1e32ee006768065f6c +a62e69542a84ac74349e4682988f106f944da6132c49facfe3a71e78f15fc928 +ba3a391a2599b16fbd0624504f340a0854332c12215bc1a8638275f6bf3fc328 +8c9cbe92a0196afe73ce3ffe76b146842cffb10446e80edbc2675458f3143366 +803d716bc0254178f6a3412f9978dce95ef93dbbdce9dbb2e8495780a784dcae +7e01eb627febe7ba97e715d3439d55e3d86ed0764b2ebb4e09a1a44a4f187fb4 +dcf7edb3bdd615cf4d8a2ec78483f2c5f1480cb520f50c370ea1adaac5d105e3 +1299ddf4c84b810164d9bd90500b956ca1e9cc387ec7b697a220d124696fe475 +b963bed158dd5e6a466e0674ab8fe21413d2bfa7b890a2f75447bd75e18f582c +7b94f812009f9e8c842e68e3f4d8545ddcbd12b522adf6bef2db3d9c9e417d19 +ead754d89c81cc8355f3e74d9e83df3a5502027be852275d5a292e84fe0f3330 +f0430353f25f954b08c7798719e59d889814d0f3da68006c3866e1ce7d4e4c6d +1637a36b81c57f076c2a534139a3fbd06e814308f41d534a0b8efa70dd0a3334 +28b39be5842b7ba882ebcb7cf6e4e39a8ef9049304661a35067d684d4338def5 +0651c76971c635cc67118e8fc3e14b1f4593e855bdf58cab00bd96c4b9fa3fae +06e5f2f0453b9785067720fad4fa2bce85e75f4c7627ba4c9ff60264b7e3203c +b7ffebc5a030ddb3e9f73e43476cb14db814f6582ae10880bc2e05d2b45d6703 +fe5ff8fac1811faced4a873bce848c67f21dec481e5bfa16273b317ad724471d +d6c000d0567054afcaa249b29fe4868d3de14f3aec71a9a516534d7bcd5f520f +4b692be725813ad0686818ecff6583db9caca9217d917ef8e95b4f0f65b359a7 +bfad81b047489b5a27f25e9d0083f3857155bafde723af49d89d12d0ace5fc57 +55ecf06556351af4cbbfb31ced64e43741e00effd88c100126f6a9ea7059a29e +e676d797f763662be90baf5888d003a90e1b3d2972ce2d2692905474fc3ca302 +45dab5e679b2649139d087da1c52b573f720136584590951849ff1acf3fc3a8f +3598951f265080079accc4792c81607e426c7c94c49235defbf99c2ce7cd6f83 +f6500ba6df15e5db02a83f6fc92a707f46763f7cc3e061ed52833ea1d5e2c3a5 +e792d30003fc4442c2b2da5a7b6265ff74c554b66cd79bb3f8fe8f925be0b8b7 +5539a85ec4d8fdec57744f34ff9046971df2cb948efe784244567ba3ca7585c2 +d30e9227fc65efda488c6258472b8078e4d53cfbc75a54b2ae83ca83d25eae24 +62925ec4c6a8a71f1659c30a40c27a8002d5af1f808e305584a987659eaf20c9 +bb9149bc90071f272e1668f28d01cf753dee6184f401dedd303e41270d956b3e +e8b162458a0b5b36f1b44730faadb167a76a906e4d515640db77355c10ce489b +f531944e2af613ddf4e8bf63744073505c11b7a2391f3bbea1eca42415e72784 +67ac2104f88c79ef1adcdd9708241b6c666a0d9376fb23ba488b16ba96a4ac15 +828e8d286635b79c99bf768f8fce273e569f2f1c6c34be942b833a1fe05de68d +ef04afae2e78ad7d500d16d417b517459820a3056be375cdc94d51b97bbc360e +918e36d526c1bff1242103d6aee802457fe39deed5f80f274a4a76930ed84c41 +08eb6d4ebadad5d97f9e5226af8bffc0366b13cd443863ed1f3ac1a43656997a +1562b520c57ba0ce60b0470c6200fbb418b567b575b76cca63a371e05b44bacb +8fd22384616378260738256cb80100fff9d04375e79f8740923c4f87d02eb586 +40b9af5147a7f15a8278252473c6a757900ecffb061aae3ef8437bed0f443f99 +7e1d41fbd1ae69e08a4b72f3d82c0c9aa74558f2000cd23feab368fb9fe8adff +b1edec68788c845dca9093d157db4aff2385d94b615d680dd2463cae985d94c0 +bb1e898d1ba8a26e8fd4dd75fa1ff158032b42ece876dc01ef0af5e59889c9d3 +3867a41fbfbbacb9f2b182a9e88fb57f4abf2b4af4b76b262f8b04e60f41e64b +9b54b05972a8c8377db85c8c057c7770ef3859ba3e6d4317246b4d82efec05b1 +b06749c85bc5a915b8da1d3ebdcf13ce8f09427bd6687eacc75ea0a196d22616 +6dc5dd288539be39b3fc157e957c1ae0c61f682ffdfbecb384796e603b33e5bc +43a3ee16f854455cc1825a2fd49931dfbc0b76acd783b8d6cf57ffd909e44e0f +65f51296a1be58b28ab759390ffefd476cdd169ede92dfd5362137f2412f76e9 +ab8d3d7c0829a910aa7866ef6d7712fbda2223ee1c672aa42584d3e5dceb6ccb +e16755b381dd61e83c43ef2636c33c5e1a453bdb8f30f51074ffa5ff9b427639 +4bc83edb449f5dad51984e25e77062f4ef7981b0cbcb6b8f97e938aa6e8ebb92 +2d7f2c599d714d3732caaabe65994e20e56795579f7feaf5ccb5b1448b7cf3e4 +c59366d5e5af71390116e2d7c545523fd2ffecdb8e2a59766cd2a8720b3bb898 +063b54de265f82d6cc34e88bfd5707b1ad047686dbe9d434414b73ee4cb2bf32 +8882565e93a6434d7d5e40faefffd695ce65bcf0014232760e63389558ac39fc +23a295ed68fa43957428c359b5256c6b7cdf7f4bf4de03d6e24dab79d709a27a +0ca54d84fd365f67d85a0c641073971e12260b03c0d9f88bc45cdffa45bcf544 +77e564efee2b7d8b8fa4af0745b8f4eefb970e6072ac27c0fbcfff9444ea7126 +c7befb2dd02476f58123cbc23da0ab4c91c8839af709a516df1db6acbfa7874f +50f41b707e2edc5cc705a64f3d9b1cf30231d422b97acf6a37b9c5d6c0f6ba6b +0768ae1b907aa7e986fc583178c251b36bd3bb424c13bcb9cde19644bb8b40c7 +63d2c192798218322f63e82bd1176158ed074b7293e4178e9953766f19aa08b6 +1765dda1ec557de4d4841f98e10f53985d111edbf0e132dcfe12d8118ce78632 +b67ea99982fd3cf289ec0cc186ee5993acfa41113eb12f9457c01cf3a13714f0 +f3523eaf4229da65ef3bac70e6518dc954570033bec5bb9c49f2bdd52db14a0b +9b1dca8b489d0e9992d9c44720f9e9039b920a69b36e31a27f33f105bc700e1a +dbf42412f827b364c91bd06a57e22097806f615ff8cf20ddfab163f32351b638 +c39bd7b05d0fb10df6ae8bbbef8a47870af4198ffa6f35859a308513bb3cd6e2 +32e50206aaae2f5e14d5bc6b8ff3f64a9497ebf7566ef04ff1394d1997ccf7b8 +31629e685294fc9cb7468a919ccecd64048c60a44e217e775fec9d31711d2ed4 +839a68a91e099d16e24b813817aac1c10e6aef41b6c616dafc4f6965eb4641ea +db27f46ac00e4aca80488665771724dac1fe2206506f09ec75885d5fa3129bbe +4e15f47090e9310c0d47835c5e697a634bea062a60c4dfc2d4e67bb8591149ee +30ee8c5d284d332f4d7058b1e21826ec6df07a1b12ced9b109af752cb4aca0d3 +b2f64eed115d963fc4356953a62dca58d03c6a1574eb46c2a902ef65c2d41e15 +677eedf8e0f92d99fe465d596ce0154785f623a6f21d0b293e211402870271b0 +a7669015f8fa46740fc7f171f42b1450e001190e0dec67a83f96e24ebd79d9cd +f8767571b35a891f9a7da04ecb6d0b0ef28bf4be1e1e6ecb634a3bcf8d48f797 +89fef27a51d3da06742a93f5367ba9dd87932d6f41fdcdebc7313673a427f172 +b142a59879ec5a115ba6e50da31c0c65cc88b2c012f14e7acdcd39aa96f58b3d +8feef0df2d568a41874b0ba77aa07ceb12fb6113698279479d15b5798d065431 +22d252e11d1a8ad35a267b8f9699f36c87e5f9e84f931f1fea9d9226de70a6e7 +e8503681d81dfc236d06bb2599f896cfb97ed5d287f452c7bfdc04b6c25bcd40 +5624a580f4e3ceab7d7e13768cb014bf82e1988b458a1d98f1e28ca698e5e108 +7be4a8f26c3a25035c6ca7c176215877b2ba1e812d79a37eb3914f2eb5ea4414 +7c3f38cac536f3a8d5f7f9a17e6008373c54669e00c937771e8d6ba2bd833648 +8f5b9b61fca0099ab4d8acc4b5df4a5dc685fdbc90a6cbe881cd4fb561e8ec6a +c76c3a42146a5dc2ce7f6dc221d0717138f03e7c5a93ed07cf7620975f4fc4dc +5ae665540f85b795e42b15df5b82644f6e817c831087e2f7b1a49eedec62a9ab +6b6fef18ff94e1e1f9f60c445ae93afbcbccf496255b1b64433e445b8eee247a +18d7e43f90e084b0728f70744f87313ff6fb2c7ac61f207abe55d9bf4f0551fb +12ab7d62e77d0eccee2ffae62392d6cd7f1b70d29046933384cea2e2c1428d33 +4a33ddac649ec5d4b7a65bcb483096a6ac1dd6408f48102e378cf71dd4c872cb +772c1eb0ca9c8535a757478b30fae38098b92d38a2972e3f765b8b302b74ead0 +b41dfd21601497bd746ebf9392bc35c358ff0debb36b6800d254a10214e0196b +eb8150a66c59e0926813c5189a777e924cb6ba0ff1c593c6405d5709e70af9aa +e553034680e3af6afca2327983165790a6be4850b378556b29f213a78ef91560 +82201faaf9cd64884a12b176e5941f4783bdd9c4ac23cd7b33aadc49d2f2ac11 +ed6b4196e3a1546f2723fa0cf4e74d51227237e5be8dbe5b61e2860100c8a212 +ae75d5fa0f3cf636ce9db565ae8503d426f7eabe413920d7a98c3fa47414ba75 +af6580df563f70c08422873e6ce8e1282a6058f87dcd2defb30e25bb3bea88ca +c4365dff510d9ea8e3c85967d70d39c035f3083c3624d7617bc5dac707f5b993 +78ccd3e91f5a94a67413515a21233f1b09a18acee0602287bd3a1031e169098c +6dda3771867c4b6035ee839a1547ac0532ddca75a8b778ae07ec9c917cfab4b0 +ff9298e54fff5c54b4ddf6e5c3c44c1cdf1acd48f7b70bf36fe1a8c675f957d8 +005836caf879933b4290dc7cae52900dd58897aee9f8d6d91270aacc08065815 +3753a34da04548780f70ba1ce29c1019f16d1193d94366b0dd071c323b4b65e8 +e0f8580ab8b9c1818fdf7b2a92a5dd7d4cdd005d5b902135f0410fee82cfe1d2 +44bcd29e599d6d5f95643bc960779083159e00905cd2fb3ac66d4bc2565c4aff +6b0ad51d1a051bf9212363f5508a98035af3c89748249af4b08253891fa1c26c +e2e47cc4c3585450162b3e94eae6efbf5314d1567e240179d642c50096fff099 +bfea2ed1d2a1aad5164ee7554deef672219fefc240f979ab9e97e746b65927d6 +ab034d96066e955a3c53b8e3f2f2271e977e6ab006293b2b3c1fd7f615eb76ee +faa64f082f68bbd8bd690d154cf62d48a7aac61f37d325295724dc0aad8edf92 +d24eac64a11d372d132434dbd70f34a67ecb0fb97dbdebae6d738446949de8a5 +de1f039f4b49c7d637acfeb002b56b1b97dc504ba5f00f18881454aae16f0793 +baf18badd0dfb6b218aacd7d1d878cd9c637729924184c546de16aa550e81741 +3218f217fd6fb7ea6145dc73ee00b0c0bc6a93123706333ff6bd82cc38aa848e +b014ed145236d5b8ef7905f9be3a98fafb89e811574779f482bb9b0cd4c8fbb3 +0f12457defd87f6576c0c37f542d5ed7dc35f09b1f382718c535893fb1c2c5d1 +989a1245e44738cf6a9c49d80158796a90e98b706b03ae10da2d58a3cb79890c +0d45d554667aaf0b110deab7535656ee3995dc28b34af6796c52dd0fd682b048 +7dc06a27282d141cc02bb880a0a87756faf56972e53257af8ae9c362121b0d93 +0b8321683cf50c57a463600936c43bfb65396235837910fcc1a0bcb79c57f721 +c3cfbfc40643583d680b3162e12794979c6c593f9c9525060cbc2b77505977c2 +a88b40bd2e25d8aba89801a09ba7aa50c401647e65c89ac200f072231039f7d1 +962b7fd0104e04636114cb84e7317310b590245703e54b37781e473265d5db82 +a19fc83b9725f1aee25ef915815b3d3399de9ece699d2c54c2a39fe2408e3f2b +84010a6ce7dc04d192ac308a3209dc0ddaee51a502f198b2f74913c2fb6cfdf1 +b39c7051b7a2b2c374cd33463d784da35f96e0298cfd1950c4f2fd7a64050e10 +98c07c3f8d4f6631b7aa1a0456825db870ccd2b8187a48dc6aca0cc86d5c1cd9 +1c062ae412283578268bb9241946644186bb61a71cb80fec8ecdbc2c1254d4f7 +cc02660552a8c46871b574714d9bfe53e7ad6315bf022fc769eee9988e7b8a06 +64d6c44e3642b9d06632ee37449b26d733f6201d862d7a4137142d7fafe95f3c +1f63107ef0d183f69922c2927c9b244ef4efb28c9b1648423d03039806ce157e +ae5bd445ca51f3eecb05f104ec9eefd3bf76a37bd23494768306f143f1170177 +2ecb2abbc0ff27ee68face57b720c0724e1afb2ad4405d35ce79fa406102cb93 +d110fe7c707781904e41a48fc4ecd9819cd5cbee4e606a88932172cbc37e1d66 +2f0f2ca2379f5c5a7f554c59ab6c151209972825a4b5fd4a20c77696427ea5ec +1d30765e4ba579742ee3c719a9d93c77908ad70394669d66321f1200679efce9 +7257b2f7c5b2a68c7d097c8fb900b415b490f386d9f6c439b3067893eaccb2a3 +c376da7e13b14bf196bc9940d0aec3d560c63b8497381bb16625ef73b1f4e71f +30fce3196c7643c0eb9683c4f311cb41f6825d736911b294117ecd759386db0b +97def1aa3a7e433b89a8d8c7d1ee8b89e6e6c8082d80e71bacab06ab48b188d8 +f27811d13c04c03967bee4322dde4b2eb76e58249a74397fcb632a3c69ca5021 +10aea31c1f57cc1c9ab15cc2c8e66ab3b9c59e23b06e08782c9217cf8f2c6459 +3b0cc08e7f6c75ee74701a47c9504d6bbf5d2b5468f7270783139ebc2c14de22 +661522d175e3a847aa72db59a991f005bc86622168bf57a3d28c2ae1cbc06ac1 +319c4b8195bb715501fbd26cae0827ff92058d7a228eec31fa0c6eb70554a256 +1fd9b21773a3f765255b6eb4d4379ab3f599c11479f5085cefd19bddbce533bb +9465f89e493a7ea66cdb039c2e85a0fd0aff5d7dd8f4fa0f618e248c837567a0 +9b72aadb2bf3ff6b9d4307e88c206ba9b75e0ac844848b5fd2a08d5f7c1848b6 +6e49bf533c94346902eae08ac41aba2836bec511d8bcac30986a18a8405c72cd +0f189c2ccbfce5dbbd09070f0f916ef76683855fed5982bf9b1760420eb45765 +994e8da3f7033a5963c244439a7ac157219fe0a7ccee82804f641591e6b66fe0 +2b0d55bf5f704a04dabc1d5bf63739e6cdff39415a5fc216a55479fa8e7e2647 +643e302eb4205dfed647b3b8b47ef2616df65784347d5677b52e9abc82c18666 +0b786335ac635e573aeffcf8224205d947b0ea67b353640237a63bd73510f828 +3816c87d8f12be5f998b727ae398e1fb4e46e7cabe627d8f6ed455edaff7d8e1 +05dc0203e7c407dc05aaf9b9df596313630f683d408400c6b41ea1b7e05c8471 +a22d583135a9df1ae41b0a2ccb4a739c2844730893585ea7586c580a0f66eb87 +7066491a6835c2b3141fc1dc23e1bb1d5427860a996ebf4efd3c092edc54710a +ec4da96ba61f0eaf6f0d5d9680bdeba2b6c5fe6d71c3ca7a425622135634cc68 +7aab3e9ca2bbe997e074d251c1e8daa885aad2c9322e6cc85031f9e205baf648 +d257f38b320a958e202ccad9dddeda59a8c0e4939aee0ee7fe1daa0acbeed8ee +111214437e6695f25b52f1386ed2b5904b2cfa095a8ee8f0ac2707239091fdf5 +ddada518e04bb44580ee924a8c38d681aa160378fc3c76290b21a9cc03f1850a +6a277de7ff51614e67043cbeebfbc2a473993b91bc7b31150ac22fecdc99dccf +eba2d8ecdf38f46dead509b780ebe45bd0879b68d9052fcd50e431f299412272 +79afa25fde7a63961c924ff02b0990b938e96683f82537c0073e42e58a49690f +369813992dc8049111536a76e1d1db712fbe9a9d353793e4b1e31b4e6c836a96 +e542d207c6987dea794d9fb2c23ce8d1cd9d1dc6b13222963320c0f3c5053323 +37744b297e3c1eadcee45dd8a0b62bafb7f6bf33c628e20f40c4aad75f19cc91 +c5832cc45aa9978c087ee415be15681e3abba579d8bf1f33c1208068a8150bd0 +deb3ce69a7cf00852a436a71f9c5065a3b262238910bb60fe4d08a6c74873628 +697c148fe67f1a59cc1e4f9d18d862fdd6bbffe395d9ac79686ecaf001cd9068 +2f6a838feed75ebcf706f01577fee2a437cf11cb392881cd9108223d71a95edf +ae83dea1f6bd87dd0240edeae67c7ee6ca99b569d15deb7cb52a2c768882fcd9 +846359dc48a34f9c93cf5058d60342b01feac20aaa60ec0973dc5e3af0198a84 +052c2beb9c53e6ac865ba4567e42dbdc69e888f6c1ab4eb7b547a41141578c9e +75647ad89fdc7c31b34a9ca6aeb332b3e6942b3c41775307a59a86275289dc84 +9430fc23784b0cac2a581e4389b16d17d83d685822d09e47113c3c03c45b90a8 +5de29e346636f864801b043d1a1bedbcc0c610144a6900d28ddeafd5533b5ffa +79058fa4ff48ce1c7c7ff32024f4e7aad75032ebf0b125466356f95158194a5f +5750c3022797f5d91e6ba6648c62b7e754fbd6a74b82f9671234020b78689f47 +638850f2e1a57bd3441c51716b6cea8d53a422ad81d7f35014709d2c960a6697 +0d7d8c00b63d97bf188004d78ba34a6f60309bea91c077335e09f72bfb662340 +156cee8710af1551e940719cf9f22d9a0ff51a0981301c4f1435450a0c9c16e0 +de8d669b759bf6796e6653a07b305df4c93e62dfb869c5c4439c79e1011f3676 +c8b71f6c0900ec9f5acaa83b12163a912b0448ac5adb76e29dee0ba832938f52 +895f878fce7bf9d3bdb7b16e41504dc90df6abbc31f2b9f50cf7edb363998de7 +3d77e142281b2d02067bef95da5e7429d4d16f41cfd94f76b139baa0b96576dc +08e6e8d6bef850f2c530003efa2a12fc493f1432ca635512bee93893be90dce9 +6c65ba7c3472585bf1d37e6c3eba0b9bc34a438fad5ea0799c1bdc674951fcbf +b5635d169110a70d9034cd19be6d7ee95a06e542968c21cd5427c8ace58f52cd +8769ad774a2e46c8e0d8ea342fc39c683072bb821fda38c1e3fe34bbb209eb21 +e4d9f44ff3b252dc0df3361cfd671749023b1504e167a3e72c2f38bf20ff58ee +ecc0bf2ffce73d51cc8ee71a43afaa6b5b91c8b27218f3287595ef75eb8c184d +5386918ac83903ff8eac18e55ef730abf6262f36b7e3a58a25ba0219cff270cf +eba11d973e4ac3b3f76a1cb0f6a3cbb03a8c17c92b89087347ec273db0035838 +7398603c291847da22ea02cd85cc438a9bf69cad8e6e1d44898d927d9e10eec4 +209c642383c700e644c9240259ca6ef8eef9c9a33337ca0f866850851e3e62be +aea1357ced843cca5d5494d30917b78454c78387b15185748a852a91f6f9a981 +c7de39732653ae16f28b7cc2d8feac6da414de43621608e2fd7b2855de0975ed +3e7ac410e6eedf48165310e4fb817a02800b9ce0be655e035174abfc073064af +0b999221ab0e169b1afca5642e139f482771e4fd1fca9c2c197c0262094e6a71 +a37ac0c0970d89e7220a1ef66bef84c959f444a0a7bd666935970748c0bd4670 +604614d617e8c54edcd7c0ed73912cc074629d0fdbef9fb6529b82385adc3cde +b0107b8b2ce9ac4c8b482ad14853f78be96e7b99c8c70ad7a0ebe802bdeeff5d +b2ed7e836651db037f2c345f63285157ddf3238fa19130790e7a603afdc693e6 +ef58cb564a063050abf1d44ab800d754d354256802068f0062ee06952e95904c +f3e456831a6c58214f9f48c507777e847a5408e7f1a4eb890dc97503718267b1 +45125ba0e28636d20caf4baaecc17c5545f1b11c73dcf7d1627b3abf6933ca21 +8db138a9dbd295818cce7b4931751c8eacffdf7110d9a37241b12b8906b6bd69 +6a8841a83b3ee2b85752e4cf927751c6cfdf7a7138a4aa5811a1c858e4b555c4 +05833d5ec60d25920de78fb347af37b50f1c3b2f7e087d059406f81ebce8746b +8ac13758aaac6ec1cedbac0477927a5bce0564c1517f6a20f140a868f1624e2b +20332bbb61fa5dca68c18a20bf9d1397cc0e991747ebecf1f6305c33aed5055b +bd1bfcf15007ecb49b61334d1e2d38e5ef24339fe6d66948846a55a88296d2cb +12f47df17c72af4370565e1f73a449a9b0d26c39eea04125fb9192141265a122 +449ff568a1f3654585dce47622ca0bac147715cb7a1275d02c1d083aad411878 +be64dc4da6ef276ea20697436faa00de144b11d2145a0a0280041e0618ceac52 +5039839261ee468bd1ab9a22a098f195d3853155740005473b0ed526751ad4d0 +d671313593340b36dac33b54bf78cc87256c6930a765f2fd927a3582343bc8f5 +8ec18900b67abd359ce7ef7eca1f1f9411943e057872f3386357300957e9e75a +314835045839468e1e5d41b890f7f83255c3584ecd26e2971367aeaa1d3cd22f +22121826d56aff35e356dab010747c2f46d46629a951159b6b69117fd548614f +ec9e7d0a917402628829460cdb6bc8ce3f93f96837c594eb29c63500866d9ddb +fe78d09876d3d2f8327c3318f96a1327691195afe12065448493411832ca1a1f +3b0d4a9593625d8da1b359398827da68a7824255446e6342364db03dff29c917 +e44486cef063382245d06d9fd5a36a5ef79a08f36a66409a2f63e9235a12fe2c +bc9bca58381b4d9cc7a6d79caad7d1b00cc6520836cf3794901295935bec1975 +8f473e0147da152eb2127f1d9da2500fc70be6811dad855d3a00ec44496a4338 +f89664ef47b5ae81fd8ac944448d1908345f3f0b448a028cae01e0e6c7c12e18 +30299a40196e5de461d5184efe63a568faffcf7c4272a37b8af0fd106dc94e7a +9a55c62a4ef9b8d29b5d85fd0e596bbb228fc20a84641700ab85b33fd420163a +deacc45055ffae165c50473f13119d6ce2d5ee143c52ce41260a22059b106529 +b87a8cc28917a38d5aa18029a96b3e095ef78730f4332c4f59eb02e686be85e0 +ddb57200449614b8209fdadf7ca82f4e8051a7baa6501270a3d1f00d99d552b6 +316010b7a51c23709b23849156adedc38379fe4be0ee796986674e2a73e34c7b +195eb533fd924a2cdf6e73c1a02de2b3e0ce5ff89ab08383fe39d880d4dee544 +3dbddad4fd25d3881d8d5fb4422635e72a9c237249ccca7f926e728de0d293f8 +f5fff6b9f13ff9343df8a1bc3663d7786cb6d520b2a81874a17ea112e5b8dc0a +b3b81ad49837767e7879ee03a82e7822c57e265be60d0f6b2789a3059b673da7 +5da7157f777cfdcd9f5c004ada55d8852952d8364c696e762dd8f449783f9290 +6b8f1c9817f5b3564c1fbd5f2ce6bdba25bad8a38b29dcc26938a7285577c391 +7b972d3fa1738737089433fedc6b6c11f2d9eac832727abff83342cd4f99e14d +25e7463585c1be15989a0a0bb377ac009fd8ca8a5172903fa64566b06e2003da +dafdd852a6937f9522a23711964b30d4fdbcff209d824491c0d0d46e22bde4b9 +4e33758ba1c3df8429ff69142e39d447d54caedd9e65ccd5a92015e979871f0b +9d88029dfb4c74f286d7711a1dfb1c40fc3b697f3fc8feb4ca281b0027d8988e +841a4a6ae8660c7c54d335322587693ba4fca91e55df91006a7626cfe30d331e +5b518d2110e317d71461d12d8a908028c0030dea4fe6ab488f213fbcb97dc979 +4a844abe241435ca55616ae41715df1eb11558fdf3a39e7b854ca99d1535bc87 +98ffe95ff41816bf1d903fd839badcc7ef963f825c7c18079fb521c2c0f2405d +397972e2038be57a51af173480e23b8b0959573029c386fbef6c0bf83a8ecf1c +f3d6e1f174fecc45ca6caab7c90211013b552c6f7aaf3e837a02a2c2be6b4cae +fd267fdc0c24da26d5ce30388a69280465886121614b029130325aefb656f38f +5b56a08c2c379a8dbaccfebdd2d3e5217f75db4d7b0cfb8952aa192248e4bad2 +545fd3cec2c0cabb48f25817a4dbb1b9a0733f0a220ce533665abddd39a39eee +9f4784cb26411c7862c644191fe63fa81dd9c69fb2c2f32d519ff145e5ff4ab6 +88a996b4e43c5289274aa0ce8b67bb95b9bd6ca6ba4e86505dea9dfa153e58fb +ce3acb84b1d5b156ffc84eb9ed8d86f5dd8db7ea1a44a70feff4d03541199760 +0246a0071be64ead64a82f6f370a4f9d39555622e8bc09f4360aac8442c64959 +544189deeea7d78b62953fc6c1813c23f77c72761e56ee70ecc3f07bf4b5ee44 +ed0a6a7dcd4dcebca9925d39d190cf815b0585c1dda5897842e7dbd44b9a93ca +9afb0344416c7e12f6a69bb9ec3a0a5ccd176839b24cf375c7b5aa63fb020ef3 +86d1a5467f5be498dd3dfc7041627ffc4b9ec0ae397c001a3f7703ca4ec8d27e +ea5c798083c4756cd0d4dbfae4eb389026f97ba04094c0ed317efca15ada576e +5315be4d6b84e91b8fc41b4ca765c508db57265a76dfed2ba23f2005ee3e1666 +f0f0ac085e4151f698661c4a69bea8061ea0d86db942164e18f51802ba4a4cc6 +2646865602d3d5bfab3dfd4a13d9127075dada545d9254dd39cad08661ee1891 +40da958aa1d7f9ffbc5d2bc6f8c13a54a4137bee3472955875df9643c71aaf89 +cc4d0b34313ad78fb100347e9a6ba236bffda2c9120f728f7f9dc24475885a7c +6d647b40e380ff8772532f649a0a8af8d5d577a75548cc53bd93b2d94975bd82 +6058f644a247ddb8af1bf9169b39afa10d810842992d9503e869439b08958f75 +f255cf86e4943cca9ff8190955c4bbe52a22db1d33b38a8ceb231f25fe67d7d7 +1451d378083f32232c5f1f46a654d87705fe42be37f24130ddffc294ffa72d63 +3bf863e3668310562dcf82853af99ab19d16e015a5c52f718dbf998e20316811 +988fbd4e96bb4532e180f9f76e7089f7d15ad1530ab7e3b6a833c4ff4ac9a86d +41c91a98c6f20c27d816b5cd07924e3dc3528f7cb3922500189f429ca8568af1 +fe89130ebd9c11860be49ad45643ec0d18993fdc9b0e50a166ff04b409a9bc3d +99215881c09d26949749cf7ca37b0b89457d3b392cb44aab689fd25ba7b5bad7 +06257de81cb1c50d2b283726b050d1ae03fa491189c8b9fc1b22b373dd70e86b +1d40de563ed4a3a80579255ef9dcddd6853c8a757957ce2907a0cec4e94fc5a5 +9641afbd3cde23d6a31dc99bf9180c35393e8e6fa092f5e0a5e215c618a6eb9d +421d9eb8087fc539daf2b707856d59c049b650c264105d2eaf3c5c383b8c9665 +7a53e3aca0f93395f70a078369facc3cfcc8b17367e6d88887b4297644309b12 +8f4116185b756509d9df731553beb42e51e78953a7d9fb81f5dc3a149de0adde +c7f7f517410f474c218cda7880bb53eb0b27d0e3903e1d50d641aaf4c510e03a +4a0862d2205572130f86502a4fac7ba66e5ded860eb07cfc0d90e908eb7c74b1 +334d1783a3111f249055e620b622a4600224a38ef5ce99fa6689aa9fdd5fa97a +f90e3c3d0b44a0090b840404686ad0825117bf9fa688c989597039238cb3bbec +a709d680b9277d87eeffffbc5c21e8b667f1c3830c6feec3046e70b3f46431e8 +0fd084aa78463ecb7e4dcc7b73c046236372f8701397244950dfded1274ef63a +74b45676af1f34b40a82def94255003583bb3845e92f656d0c553155016ad73c +21c9b41d25876b01e1592384222e6c8af08f3bce00c1785aaeaff39fac59771f +858c044ba0a298866bcd42fa82d6e2b1d947d922597892eb38dc8bf3cea0b556 +80d643f58644c80d55b64ed144a03f6a9b2b5471c685c8656f3c19756adbe22b +be33a8f9b37e9b3bcb84c13171abc2acfd73fe7f20a8f6ece9ad9de3c8a08e75 +670425356ddca1f26aa9afc9f31de830373c71213d2b84c29fe667ab899df5fb +9f0b5102556158112a095ba239a299b20056c981c17f2c06614a1a0862f084bb +f420bd958d1d458169124d68c5299d9b35464588e192386347aece5e2a48ba84 +43213219c87812647a9410d34cca55a0a62bbab770ca79b6959dead30f6b5451 +8a20a077406e39d2d126b7e13375104a1ed7239b95a9443b95dc24079d0f149b +08123838d5c21cb3e8d9fe656c5736306bdd4bb5c88393610947253ad725952e +7d9b776ebcb6617e74de8e9c62dae3e081078a04c492c4a35f303e0f600d7d34 +eb629dee4f5531f86916dfbbdd1fb9f6b1e385afd3dae0cb6c15f45ee49911ef +2a8e2ddc4c5e1570f512303d94907fd941bd7f7a053a42f990e7f25fb6f8d1ed +e7d401ea0e4d3405ef89d47416aa7d24dee907fcdd88cb2ab09ef07261f45f78 +733903e89215d7acd1df74ba26056f5c7d3d0ac61d2718d984c022179c98c658 +4405af27a3c9863f1c8278dbde150addbdd057d5e11587ca2ba42c1e6b422932 +6bd7314e190103af64a33794b3ed12d8023483e8d17ee4f8c0bbef5c9b78e2e4 +f350c487df51e966f985b5ee5da43991da55362f6326324c77ae53d320326ff6 +202a089c8d8aa68c588ad9c82768c1f889615ec5b6ac79f75d95641a500a499f +1b57a6758c9da836b7124af1d37ee04cf01478edecc008521831381f6225f593 +f371fd87ec832bc3bd853d579a20244c3030b0eb0db3191d900b654f1067b0e2 +d2a07232d032b264aeab347be9abd0d2a07b6caf85ecd57ec87ee34ea40733e0 +94dc88246eb7fe89c751326de8c008fd1b55e2cb07f3b6a08f7a0041540c7d68 +fbc4ece7a2d0184629adc0cfa77ac198901aa5a1479f1dc97a0b3ab87458e1fa +4704290fc5a744412454a2d3677d9d7565a97eee239a5c5f7eb94793899cfcd7 +2566835d9998e772fb3afd9673b3c74f4bbd339095f2f71c93458484bafe9741 +a1a65b3e15ca5045fbdfabec1723ebbd4e7ab85cdac37df2141af2095e0e16ec +bad6fe620d2e1b874c4e3bdc34f656e9604c6e33cfab4438324b8958c8a7528a +4404b2b8aec31bb0420887f4a6f3c3866e370b1466526937851f6851865b23f0 +0245a38682f68990351c12f34e63aa96d729828bab71327b29eb1a96f30c36f7 +65d4cfbe0769864f4a46f037d2798279f914b8b2ae86acf94385c79db5095b86 +d684a976dc1e662c6e02ce94e69fd20a9960c304626aba2a113766c5923dd7fd +fccbb999567520ff855248bf8377f01ef9dbd6ed1511581b3468d11e73ec622f +6dfc289cc17026fb10143d870b68e32e6f84d19567e177fd4a48a6f003591c1a +83fcd03148ba9f32e6ea26fb33e2b7626620acdca5b302caf98dc6cbe8f93d09 +a877d7cca4d52d75f4f39ce9a17aba04fea7707c097f5a8c50657ade42c5adc0 +76d6ecd980b068651e8d4c630827e0226343c57b39d782faa3f9004585cba68c +ece0430f332e4501d2ca668145020181263aec4a988db312995df391c9638619 +6ee6d1810a9731cdba8632772f844feb41e34e7d046c13f3346b1b4af62f6f8e +da0026e5b306830c0aaea5f3b91eadc7ff9108008fc1081e0371b08fea45ad38 +ea17df8a9d1b7194f1ae2819a2c1fc1b46fd054f5b98b84e4b221a7c50ccf1ba +c995d85664cf8646e2e5880d847f532736d4de8c9fdc2f91be71d89b062d2246 +ceeab03bfa0f8e5e3ca581e958a8ccea868216178925614309f2ccb1616c44b1 +bf772125753fae57762c8a617e6da4d716aa20a762316bd91bdd080a30cd8751 +7462a59f7a90200980e620811ae9cdb8903887effe20061f3558ab479f365a06 +2a8cb74720631f690dea945f6149a4e010e73ec5937c180fd71e68fdd9f4b101 +0ef804407a9b2a375a5d742ca4126b102496c02a6f0630a4ee91089a2beef12b +97f7a7ccf7c2c751aee789ea80cb91291eb2dfc2855fd792bc858a9a0df22e09 +19f5158f584771d9446bfd864fba50582ed52644eb80cbc73b37fe9f8e4f8ca8 +de234351e56df85ea853fc6bd27f5b4f0c1d45cab7dc0aaba49585f3d2e1086c +1f002a8a6585816270be2953a6e6bbe0accd129e201423582909b00d7bb2c73f +c2296a4769da723f979915a82363a457b814d97a2315dc448d3017681175b6d9 +2184936f9784d753644575d5ce4f499047871e30c84263722460ade708d0c2ba +e7998af8194e6d041ceccf6c7ed6d937322b860081a165bf69be1b47490453ff +0e2aa9f0c08c1856c53015152850b8cba83cb82ac6d21730ac9e00919e78f994 +0a14c2be0065b65351a4d130612afe42c09567c277dafd4e74bfef17c252ba7a +e0e8480f0e184c93e34552d4fffa5e427fde368d6b1583581858081613e9074b +a2d0ebc6965254a4d5dce59ca92a857873bda1575899839af87f456faba850e9 +16d06d3df6931f04330fb719a8cc91ecd28821bed1e993863cf9ea95d9e03c7c +b67490ae6a05e0ca47da8d6d7777ff553477a949fb16864ed0ced4613dcd5e73 +5517d0eeb3b86b5892efd3f91b7a1d9eb11ab7bb7feb32f54a1e63788f3a4854 +a4e16f8e81459838f341e5d288d25ec470c18c29f8e5d449bdd29e40244332a0 +4ad3233d92beb334520f1285aa1b11d8f844d33ffb74edeb98de1923c0ac07f1 +92b887d19a423ffdb409def765678047b774d040f771a6b7b675814b63011cf5 +0584368a865b6cfcb4b124d79d7283df63d601795bf5ef80b747d3dc23276610 +46cc26d90ecb0f3261d1750958bf19925e4962cd95d10824a47cf1406e8881ed +1bc5dee966ebb033a5af7a74d7183117b380fb848d4d5890faf6691e9bc3d0b8 +ee3edef892a29942544e1cc7bc2017ce7642c6eef265c916a011c4dc8fe47b45 +3e338d4655572c220bb50a1a05df970834ac6d0b91a86cc416eec40de3cf50c7 +0caa0b554698fae5fc76e5073a9ef47b6d739a8ee52758b82811811e32aff60d +d474cfeb8ddaf5cd242c7a8e7747602aaad0de7f1124194eb3e30c060d3476fb +43d520389df0b15c44007dc97245ca41f3e5b8fe0b283a1e238b57774472b73a +da0ad5b739c912e42864f1ca568e7f8b3c7525ab752db196b35937a509e24596 +73ebd59d66a82daefc60b87f8e21a2bc4e85a5bb2f858a5cba43eb83f54bbcf8 +d85731024babb818063e68ebb3a7e0978b45fd02b7f3734777683cda727312ac +b54f2606bebfe66499dbd8738fcad5b26e749a8806b7116ba138442bb85f55fd +49049434878537165f2c573241b1c1a56a0f961cfb5a269556f3eabcb41b09bf +0966d4cb4a0f3682c212e251310347a2b6bbb258f346d71dc4de399a4bc5529a +dabbe008d511ede8a302a407c7a4095739c505f1fa1f7a51de21b542f23d5287 +2e8ed319d7e867282a407ab35b5ebbc72d96a4cc6d6cf8322d92a82c5ce488e6 +f7a90ca6f5f9b9972e29526031f9d5ff881bf951e0aa40c6b05d8651385c7eea +48ca375b3f06732322f3259a5f92206755336a2579040d6768c85c4ca0afc4e1 +d28eab5d5f1ddb7d5d4f1a3b3b2b01cae132f4c0731e44f103abd7cdcd0d61d0 +8fccabb2471b66249c4ffc31711013cda5de95918cc50daec85398288439c7e1 +9a2196bc68ad745adc5fd398c3189c574380df2c2e4486a40817c23a81f3f316 +26825bef951991a1208cdb551d300ed38886ae677713f4b9d4092c9e9c76e5ea +22f1ec6be10e62200f4f9f591fa0255f249739dc710de9addaa9d34ee904641c +9bcbe6e79a6e4484fc6d0086ec2afa5b8b1926df580af637e73bf126680f9e49 +6e5bb8c21d6a428e77521156f78430ed51dc2e33284f88d78ce909fb940ceaae +0a07dda0d9739b8a3d2a304c2d9f8cb443d4d4d6fc3047842cda21c0b0073e0b +b52f5e1b7ddc2048fa9f67486e2496e0fd2d09ce80730d5f7d0f7e0ed91b6bf1 +87683b6f62f263c10b36b01ffe6fb601327450cd5a4cd8ef322277f942bb2567 +0b358456c29fe2f529d334d5db6245c1e8336b29af092689764cb1a19276d9e3 +2b4b77f0a1c3313421c89801f2c2ef5f75169fc2b3a98b69519c9a7c46b40148 +d474e7a98f7fa7cdb85c471fb1171da6de14027baf64315142b75f677ce7a413 +6466f817519848f9b9aad66b34e3be10e7fafc53571da25ea3b449d7929ec079 +bb4c3f6d513b9174a49bf5500a5272fba2d95362a562339eef996944951e61b7 +38beece89882bbc5580b7622f84adcd3b460828aada98e5cf6789dae52a41ecd +7ab5fcd2dfe6aa11cfe66d6366672c46ef3140f2e0657da447a4dc2f855895ac +b5a79d11a9e45aa7a457c11b4df4ad291f25a925e4a01dc7a64f848c64f2a739 +bffb51c2531e6717dea38da478ce0c932a3f9f856cbd2aaa1e148a0692a92642 +9d77254e7adf8aecd46a8626b7a31442e2046b9532817d285469f59d971bd398 +b6971a38e6d44f31cc46e3f48f10722641905d7ce093f5ae90fc6a56e53ac90f +7f1cdf1ddcac29bc60d3202de837fc9d659e30cfd707ceb5453028d1199a8a6d +87af5bab407c0a78c571e01020560bf1c77936521405c28cf79514579b017733 +70470f68de4e7667237065ece8e2e9bfe2b5d3df69a0bfd8b17ffb8254aac5f1 +d7a8c51d3f93947f7779f368c71c343159eac60c5a671f81cbf2ba05626f91d2 +aa7887e41804f5961b341a5d06b849cb52676311c81739a96d5da0d480cab2a8 +ecdfe115dab597f553767e59cf392a536dcc9d52ce25c424a9b840fbe6413361 +ef591c196e6fd7954ddfa457e7cbb9d5fc00c45d1ea21184f29291c54c353ffe +59d19239224f9de9f6595d5fb5279fd19278e93b366cefa22b41750cbf2e03bd +7b8bec58170e6d3c276f8dd4ccc99885a5582ba4ed5253a17910580a7195d775 +6e10c5608e2499df08572d1fcc0ea139beb4f0bffa5e18f7c1c17ecd20a9e400 +95e2d469da5d9403dbf146aab0a04ced94b508bed89375c6253424f6fcb2afc2 +a8019b6fc866646c1b54c32858992abf31da24399f89ead105a4056526d52965 +289830fb4bac1b0cb6a629104dfccae1a688563a271da0927cf2a644274d2a3f +f90e5c1845205ff935fce3a7633cb8f14e01167b6a0368d2a2e8f072c1bbc6a7 +d6f441ab6d23cb3111d8ca1634cd58dfb4d704c5aac7dc2df32ef43c0fc490bf +86592326f415cb9c543563e6c2204aa0e58eb42163bd9d7209899abe51946f7e +7505e6491711e10d5d125fad62e34fd2e08a0ed0028fb0234768f7948ba2626e +d037619703b922ef43225732aa509b580e92bf5adb3979bd8489d5a50a132b7a +685b271c2facb092739061b8ff4f49b2253db3e10839827fc99498d5a44a5806 +8d9962908f92343b87f44a8bb92fe1830c362d29f990e861461210113ff1ab0a +55436ddc38db4bf16131d9d96784f3165fcd0058401dbec514749dad00b6af4f +73afb28ba5b5ff1a023cb318fce617f5f55eeb0bab7c5bf819edf6a7f81d38a5 +d75355916dcce33cf2b8e771f9730b385c646555b1137e9416c70d5f860a6138 +7d131a9d8acdbe4663772c07722c4e4bc85451fefd08dfccaba1c8f3c251cd09 +3fa5a333877d32ff4d2ce359e6aa47dac276bce065cbb7b50c0e3add00f41c6d +be9778dc241411d1f9e934be7934c6506686ce7c8d619490f2a3f065ca6f213d +9b173efd5541375438e9c6e58d664e8a61aa1f646be623688b1934fbad34b627 +2e1e5614345e8e42ef1456785fd526f21078798a49b61c106e23678f1f593c0e +1ee8c5561147fa5bf38847b982228952ca06cf4549e210ddb6e37cc2921f98dc +162b175bcddbd5b8ad6c58d59ec66c5e118d919ea48e81cde2c17149ab133d78 +e1f45f4c5d931f09526310f2bd8f0233fed3a6a64be805d626115b35b0b5b39e +9cda7b197fec956504ccd72b71a29e9526a544957068c9b7ed6fe04255444d01 +2ecb4f59707fb4cc4a1636c37f9b94d0eec7fc12b70a3e88c7325c5524a5fdae +bc4307a8ee518fb10801bb3ba4e17a2931b5596155171765fcca938fffb35693 +82e0b69a88235c65631e4072e3fff4b3f00a06624db945db691e97986357a509 +5410d64bac2774999f960f332c9050bee455f229061ed099eae00dfc3fb9724d +ac85ac49b79a19410649f06099df677b8d0b39c4c7dc52e0aeb1d35baab7319c +f16795131e2a6d83b4f30fa42d7057ff9030c348327c91f1a780209ae58ebbe4 +188d8ef5e354491d38bfaa4626736cce69132d6b1e71f0962644dc09ad793dbb +368a8e4cffc7a8cb1697ea1b85f5eb9a831458c968ed6b860c344b928d182afb +677a88a431acf29e76053bd900e3fcafe19cf96146b492cb0b046fc4388c326e +1f5ba7f4f9b738c11af96f86cab033b8212716766c1d64675a52c304be62b163 +fa483e426fa8a8066bf82180f77909029eb1063b861ff73dffe14fbf7a25cd7d +73a33d520f6349b76459f83ba004fb60e3dc4e50b4306fdb870f29cd7044d6cb +20d345621ec5ea26ae9ea8e66dd198087e51e8ee972f6435b82f635c83fb4d95 +585e1f88829beeca19a6ea42157c10f703ae52b0c0df309a4634314327ee3ece +2ce41c7dd423345ee25bb7f64f5b300002e11463baf80547ecadebca51b18156 +09c7e479883cd404756e73cc8411dff1dad55e88757314f155bf1eedfa94d1c8 +7806e41cbc3d89eec743c50aee90d6b69bea9de11684c85ea5d0a64cff534085 +f180ce75bd623afe1e08ff4fc4902d88f769e1b3221831f7559867e35137fba3 +773f7bf4977cc27997b9da44e1799353cdd563c88d067b13279752179752ad5a +68f300640de27cf42c42c5e235f5d7d8b345ccd63bee391206499bee8304ea0a +591ff1b118171c51ba62ececf66006f78d1c56415178b9c144ac2e83457126c0 +cc7266234abbc4c1ff4ee17fc352e9bc830aba16351a937cf1304173f0aa12a9 +f79575ba5e45e6c14b93d7a34001b29df1ceb73cae7fca7f34078f99a72357a5 +c7b040f377b8dbe90bdcced28f5363526bf14f0ecf89c919d53f4c3653528b79 +8dfc4b4244f2d9747e09ce16fba69911dad746356ab3f2db59e871b21b10939e +ec4fe4d11b49055c5cdf81f37a0484978dd312eccd5e95d5ef7ba378196396b6 +cc3b51de1e27035f62fab5d507b5a95493e2ae54a6b600d1727db436933ec9f1 +1f01d50b0c645e8dfa94f43b15c47b2348c3c387010989bc4d0f7401a024d351 +0914708a6015b66af6f255efc2b86a535806de1fa9520889f566d000bd185ee0 +9dc171fe42079ac3c342ba13607bced1ecb521827c465f83ffd8d45d50a69a34 +8b1f0d3a524776641483ece863bc262f470c3e603b380c92dc8e5e4319428fa0 +a5a8cad19c001868977d6c36c49eec7a4e3068507b075b8071ac787db8a6d3a4 +3b290f01b24b0fce5c77ada9b89704a5fd3de6f5e8eabbc2c51daf3727b9474b +8e2f4aecd0433e0ffd20671d68f64254db38847ecaa7b118bdf0ba25de5c45c5 +1815d08c82c6ba3dee113d34a1fde725ba8aa8fc05c607487b703c1ef2ab05e5 +575602cc6558f7620e43450f7f508e029693498e2728e4b62571e36e02360964 +62a9579264eb4baf12402284f0bf498d116da62e81d6d3b11c5fd8b0231d3c5d +009a3b0a5506f2c5ff195923a8dbf04768655e63b48d22ebeb97f8e416925e76 +3bda061a1593c0233ac9c058b5ff5b6f483cbbaa4bac15d89f3093909a4d50e8 +a1f61bb76007205d4abd546628cb3d17202cad80f851ee95567cb313e3155258 +23459f6c8b3f02f7e1cdd1499eb58c0128b83c9086eef4e1479a915e75e06905 +f08ba8678f8ba2dda7a15a5461568c2a44e100e078fb41b49bf2e34a35774c59 +cbc642f03830c29c73c8c8334f7f0b8ae263235dd2acf4325973ae353194c10b +a4d017e0d61602715e8a7a3fc90adb659da741a39b2dedb707d5446cf0a12997 +f5df3044fffb50bc9b40c0f551ca4f7b012bfb033e6324dd071372e93cef41b3 +8e29dc94fb145e8c080ca7e606dbca4b292ae98bdee61041e733140c638de3d5 +2e49482c182b75d5d1ea2a27cd8c40926b7aec98d97d80547fe840d1ce753797 +e8f903f0c59f5390823e6a15941a55af60a6b0f82423ca76acb3b0e27bf4998c +2d35e08c4bd4534f0b43facc2b994775ab7c84903605358015445ab8649c8213 +8b1ef913b3c9a3d46d4d9c863c07ea43ef77f04fa4c91f238a5ddbed49629e62 +a4c84190f9ff58575dcf46392c0db97a225d99dc1e7ace1376ac9f20ceae14c1 +8372673772db403747b6067992238fcd257cdc9961f30cea0bc096c77936bc96 +51e8529f52175ddbfce202f38ef4bad1e437fa76c8801b7569c347cc9497bdfb +d693d6f46e66aeeeee2f2b0d4d1784234064ff0f63a730d0c0c80669ec5b7ad2 +3e68a361a69b4de9663426606cecfd2b13171f3e1f8d278240803a0f9aa067e7 +24170d8ad2f4850e1cbf01f0460561a2d06b32c891f15727fb139ed20fe35875 +b04b174e9292b2be4f30f2fb783c2e35f6a47e5626ec3539c0ca7c78a8c65fad +8255c95360855297e5baa060b4d0821ba56c95db62f42d5aafe040ab927d6e6b +a50de0a1fe6c404bc445cd13d1ef1f6f9ac1591d174687f4d5e4b80f8c57f1ee +e2ca56e6b71ee222fc3b75d9c8275b5ae804c530bcbaf814543b53b3cc333184 +f259717a387c6517e31cdff3742506dd3fdfac9e86a00d15ab09c2f381029609 +d34f14fd5a799f1460472115d8452882d250b72325f273261ee8cbd06dccd1e9 +88aa035ba584ef6062046704f0ce3b19eebb71ec933a174be1087f7e763e13c4 +fcd95a51745025643ba2ec4ebf6e7d08cc2661b38bdd189b68d4f5057cc1afec +bd5920178b7ec3bf3073716bbefbc0fb0fff6dd56b32995245eaab7d686d61ce +cf8d35d7ced60e1d8583a27803cc31eac0dba9dd35ac730304c057bc81ecd5b9 +9a7eba791852d17300c6253de776cc756614eea68c940d787656887930b9c38b +74ebcd963254a3a116f15fd5e0568deb54dd076760fefc82e43ab8caf157f2a1 +0934ab492ba04b727b4a12380d8620ecb36b234ec23ea06e1c01b0ba6172c505 +b5fdfc5e1808c9050c8a9835859d97e4c626d48a3a26e077b86970a4a4f1f924 +2e056404c1c3c750c7e6de295c6b9eee36f1ebf4b7813d335144884068f1d8e8 +adb020e3f5971f627fe12b6c4d39e56be8cfc9855ac76493ed4994e9be17c9cc +3464585754dddb9e577dcda000fee128090977165fb6bec6e90827bf7902a887 +ae02126496ffb08eb85095cdb4e5cf63afde1a5a5948793b163feffd60cfb9f8 +428ecf3bb84679c18356122b74ae5efd381d63e496750bbd3f294c55c4306df8 +4c4c5bc4d7e7aadd52704b1cc066bdff579ad4aa3dda718db17819884ff48c16 +18a6fc03cf9954436d24005f7d0975d8aa864660aa30d3bb3ca001ace7b6a0b8 +f115b6fe459915616304ec5fbdfccb656da02cae21b5802a9dcf20ae0e06c5cd +fe92aa4bf2be74a17f7f8f2b338d3a53600248bd394982f97239089f5b7c6c8e +de8339b8d17adf2ce3cbefccd4e6a6daf5d4881131330c1eb4c0ade5276dd50f +2b0b4fc97ff5b6c887fe7bf378f58e5dce3d85b98a4a9fa335438158ee3cf58a +f17b2a4553afa66043e146652c23a69e6f6f747ea368637d4e1003b4251a43ff +71c4b12f7e2dd6848cb84316b9ccdb4fb282615f89384717a5016a0660adfca4 +7e9545b2182f553d14660f38ea41d327250ee94d9d1a23d0b395303295a6de00 +312ff97e49ccdde1359cf3d098e7ec51df6e7487b4f9b94a69330ec7885a90a7 +b294a8e5ef7e99aaca70ef8531bb8951fa70d28f8e94216ae8c54d03d5fb5766 +b08a89c1786affcc5b771581ba4ca4040bdcb201262985482c346fb3a00b5a38 +332ba95e627431fbcd2811018044d8fd34192c775a0025868c41c34619cdc4c3 +e07c62ff21e9b53ad927b473643185eff0e0af5dbba7a79cf8b2cce506c0f18e +a3f8e23a4eff5c581bcbc6dddf0442780c00346859988f464557207c2f3d79ae +830f86148daa52cad0fd0e768fdfddb665f046960da31f389460790c645fc65f +ae80feb3ac5e96c07267175b41d80b79f8bf05eb5905aa917dd65a95b3b90b62 +5e692400b6bcba9c60df3de780ea6c3d39c3702a4d0fc899e26d5466c3ce7924 +60529634d54e61a992d907923ea6a831f94b1be0a311abc904dab3e0d71e9d9e +4d87d50e6d99e03b54501fc78c3f57de92f6c336cbdee2f4c03728cdedaae12b +1e28a0160cc0bbe6b332e5e0442763dda2701556c351c4f81ef3059b06804a1a +da267bd5e1e0846e23f8472740f0260c9d5c82daacdc931190e7f10011a6f718 +80218742749e3493db5f64b500e53dbb333a87926b413444c0db7b39cfeb12a2 +8d4a45e223e651ea6e6c65f5b1c89d4debbc133c226c27f7d8638a4af9803b72 +e29c308e2c4bffd6285910b9968dd1eaaedaa84f335173fdfb51593384a9d128 +3e2e49c3d722e825f67c77b9bbf2ca5e19e64bd7dc212b7f512ac8835fabe249 +89a19f724e474456b6aaf6b0cfb951d3a522510b5556fe6ac1d993f1ad0ab9ef +1d29ab40b6bbf4b8c1eb90db2220f3944f6a70f7dab210e0d2bdda392b85522c +079843ab8d38903c54f2354520cea0a4c1f4d60d2b6d6bf97b9b657982d5d3c8 +4a60ac668bc365240bbe4b5c17ce2c64a1f2afdb01997851f7c405139b3e4c55 +eb2d2a9aee9d4ca05b3d11066167f4bbb75ad5bf8f35813c1692fc2338f70a78 +efd212989488b031ff8239c56ab9c65f96940e45422ec9f721cee7bb73be2a08 +5921862a0a039d658534931865e17607e35372e501562f074a8d7c2366faf616 +0e47317e3667b2abbec7be0a3dc640b0bbc7336db58de5ba26f1f1e910adb1e8 +5172e182308e9fac6a50cbee3e5e22c21026bc31a8ea05577a5aaae1ca049f43 +a9f930ff5994abde44ed4c5cdc4139d1687f30f2b414e106dda8c246a54497c5 +1e9aaaa4d3e2c35a13a3350514544c4096e4ef17510d59eec945a7825f560b98 +c96f5a51e05bcb8878a6187b607f135c69f1dcd1fdf7a88c60da3116c5e46ded +2238210eee6bf3872c8b95e0e70ba4d7194d4aa51b356e060e2ec150cc9a666f +4942009188b80f3ed33481d8b754a3e7f69b1913ad6c7a1807bf05c5c7f06f84 +5ea967d0cfdb1ccd8cf14a02183f1e8ee7c20aec2ad2d4882028df0e165fdfa9 +c06159026bcde2f858d7358819795d5460a464cfd3fe23bda12f4096b62d2039 +4be06a2b4b08f94aed653608dd59684cc9d5585a9ed606e2aa9cfa7191badfa1 +fe20e83d01f42f06e8431ed876381326e2a31c230aa834169a18e92a9ef20b98 +0c96bf695b7771aae13d335733c96dd8541b5a6e3c7777093955f598246d135e +ee64474ada3f017cfed068c9f3115921276f1a95a1a2162f2eefffbcef0c3aa8 +e36f8c45889f3757b51af242c64fbc3d2c04574822487e014daa342ffbb8e1c5 +f0b7c0ad1eaea5bb5dd6b9b36f661e029001b40845d011dce1a9188718384933 +c0d3ec74eb27768cb5dc08f86b7914e2fb3f2b717a1f330c29d91e89888d83d2 +2f1d6d4531109a10f3b869377422cac3d2f89c0390b940321a8d0dc7f343b56f +a417206882526ea43ffd467c2aa969cd80a09a9eafa0a103c8f8206178749c1f +549a3393c1deda03623924281f806d8ed881ab7135903e993baad767de650fb5 +17615ef40209ce1ac15201fe094b32dc870208c0dd032ab639d4ce4b8b1e2a76 +ff3eb9f0472ad1bac009e3e9ccad32eeadc5047c8c80aeda16a946b558a4fc83 +6f8b9a897b415920a946bf2c81e2d9421ee21cefcbcc7f9ca6a8242d47d495c2 +158531ce2831f5da195954f10fa375d24d7e4e6a92af21972e02696780333cc1 +ae4b6c6bd8f43fbf196b2f7bf2f2f277e628e959dd51bbfec1d654fe7220f252 +cee9a500071f202a8567b6137551de985d5b0beb267d044c091a2e5066a0039b +bfb96bb94cbf04dd2fbf7700f42b68c9be0eeac34915c212d5cc6c781c89af77 +9e5acd11d425c13239fa07f0e28f2447d63109d16f909515389fdeb76c930791 +9c4d10959b0b63b39f49af938f109e45e62d2e46abb44a873f291eb4d078dcbd +c852cbb032ab7533ac8d651cba2f1429532122ff08967da9fbab8eb8e927d718 +136da194ce2a6433d6b92b441a4a9d06577c7c8cb4cd740f5cd83ebe74fde770 +229f7f090351a048893d43330247ac80afc9b28f7729287d54ed1fec1731a198 +a0642b50adcbfc5f9fc5dc00ceac0b4ef68f16cf5c5cdfc5c047ac5cdc26c357 +d8d9a6340846bbb4dc81966b4e54a550ed425b260da1b45a4905e6cd1014f197 +495ccb262aeb75b56377dac775b5ecfdc123eaebb617c48224c1e3276e453867 +65102b0313aa262d358566c9d518ba3c67692881747954e9e87e7900629fb73f +56537924923a4aec74cffaa5f32b4fb2fc0eb5c599d80991c02f1369721cef28 +dbb86f5c67f9ee5bd42ce86dca1872a382038926277a1b7d690ad7ff52945536 +32db74e9a632a5554221871082e4c33d36f5b0d225f0f75286d8b117e7d2d3b5 +7c334aaefca81df6d585b767004b6bc0fcdfd7296e8225b3af501a5e6ca4b3cc +3363da4c203513fc473bcf178c48a71e9fb1feb2d86d815d0c684daa1b2cef8b +7a17ac40531b319250803d658ee867e7beb632307701626d55460946c478ec2d +55e7f3f71c059816372a7ac7110bb97f6e86a782ea114b0adae033b89455d3e8 +19fe495b155971f926b139f8d003b9fc9c1e612d61508ec2fd4832740b47c14f +b1f194c3e440e9fa435494135b6af2d9aa706b7516ff853dc3f13c57862d7406 +63efe646cf15a3a54823e9302d870204e8694857f5ab8b8152f6c5332997975d +2bbc57e321c4f328ba2158850cd40a6227a64195817575c017f5fa090ae0556b +a7665849a46ff51b36263392d22734551a6c2a4faf5159ab2ad481825fb666d5 +653006265ee72e32c8230e733788428c7a8bbf821a8c8ec41b2b7ab77142b626 +1951cb548c93955bd2b0bbac1b460b1f490a2b6711471bc33e10d412ef004577 +49760ee95cd989440f59f188458fbadc10780dcd6b76633f3f60689ccff06f4a +ac24d19a052d25bb5247624e1251329b9f6e9200785faf56efc7955ba7dadfc3 +4bccb712a5ec29503cc890f16f14be12c9a98d27c4ad4ae7fe0feb05aba081ba +004391f5cd198e418654fd240d523ef4df055eec36029723b311bf07c3388116 +bf4da3aa56d5b9e3330aab618736d2a5029387a472b437947e2b9029e05b0218 +912afd8d21d5aaabb3135ab311778262455f2a559e166f48506dab27e0ca87a5 +315d30aff6499bdee67e4137347133a9edbee671d6dfa01ab4959858b2c1fac4 +5aca951a3a87f45fb859d7c7921deaf989a56f12c09a899d5e2c20746d44c380 +a88c5b06697083996c3d7690fe1c268e772a68651fc36936a36ea4ce8dc9057c +05f0a51898a7bb4b5045e2a58cea600491f21a09161ba7866e8d7f2d59d502b8 +ee2bb74404d02a92962d3c04a05659daba8ed04d8d92f2951863d67ba045f217 +bbb3f09bdcd2676bc970c34337695d053c6bbcbed78315ae82270b4aabf8f3f5 +8826a965b7ee29e3e6c13bb4213b28b0877a91145153f09ef866dfa1831481cd +87df5322e6464ddf257908a35d2b49a3f41a5767f14f5ca17c0be3ff13a8bedf +d59283abf933f33d7b0db0bc4d95c903fb422fd3b82c6ae88591d6fb3eddb7ab +3966850a8bed62c957170fb89607fe22aaefddb22414ff7a55ab50d5f151d86e +600889da55834432fe74afccc7be5f16a6c63262d5a788b3fdcd7ae98fe4f3e0 +a3ec297ffbb9d0875ffaa52ceb8894ddfa269df08d786a0e29102bf5a8d58d90 +293ea4e6f9d50bf4e7f19c10d805dd5de75770129639be680e06f25be7d07b40 +4001eb64a6b74e701782b42eb03c689d9b9327fd7fcbd0925f95630d3336cb5b +789388b17aee7e3616e43f935f30608c02acdfba2487664865f998c5fbbe6a2d +ed471586c5e68d4beeb65597c9ce368b494983548ec6fa4b15c556415bc15b27 +8186864315427c9aef3c102193c013b424e6ed789dbb0d21d75ce2afd3d9d8f6 +52f158edffb99e4e38b6df1ce9421e7eb130dfd305b5f9d88a94fd645a7a5669 +a5a2f447f3f1ed95ba822bbe972e4ab9b75e03094c3f23163385fc551050b982 +9b059a5a530f4ccd5eb0d4ba98f003f95c8f90210012830b76c89792d1898b9a +76c0308878786c3fd23199701f383b986c8f5cdd99fc86223b3d4cfb39587800 +35d33a7e56428ba3cae9283aab4d5280d952d5d028299d958dac4a23fce6ffb7 +7cca4d88a720d5d47fb2cdcd69a1829235fffc728d6a4b98dd2aae73bc163263 +ec6356d0d9a909a512735263a1ab810296026a7b0141ca44afde4632c5e31f87 +116869aeef9626d5786ed2d25ab3a1cb3adad4beb38bb5e3197f18b678e3f5b3 +8923c5405121f0433167b3f8651877974ccc784d92d9bfdef8205f6cabb2da97 +5e2871b2a0acd7c5d4998f942af4d67d84233aa6ea1d54c8570c3eedb76b0907 +e50d67404fee83fd79623f0599eccfde0fb9c7e8dbd87baecf9cf68aa07992e0 +8ca55e5acb1948f6478102ede178577b1ecf8eb4851742c25a20c39a12774513 +dac23ac5b53be148a4bb4c80d55b273b58a7279220c377b25920c4d89a6544f5 +f73204ab88bf1ed0f9fb756d28696ba1b3ca2ddb292115cefbeb71feb75b1427 +12c238c978bebbb9584c63fc9afde0b2ce3a6ec8e8818b040588187e3f03f1f7 +d01da8632a8b74347ac40b419da45c6cbb9d76c66a97caa79e44dd5803d898f4 +a3f22409aa49c0a837b47004ca324a59ab3ca4d4b8c23f8cbf99fd72ddc1ec46 +205826b8ae3313675fb819e3d62a7a356e68f5b65dca8fc54e98982d9528a279 +7fce2ccf3eed85944bf571173c63b0911f1a34a2badcd67fb385468cc9d243ee +f66aac6e15ed9add917ec73497ab853675c7721a1a767bc75ddd2a959e95b06c +81d92ef8773b221334525fa10ce0829551bc0713d1cf062908c439448b56cb3b +526742103abaa9e254d573728e902bd053a9c3cf044a99e509cb73b8d14a8dba +05492c2dd922b7f30c120fc1159e6f442cab60ae23895d0318254e5b07381e5b +1a2eac1bd664a9cb018a0c68b407dd84b17c21457e0c2501662f434ee592c6de +8bbe5fb8aa2b88f398b2ab790bf10431abe91de30452704ebfb4450b90a99664 +1924960ae32615374b33dfb3669569b69cc60cef0178c38151c17887e3b7708c +e0a473b3edc9aca81506cc0962786ecfb6333d51cf3c3d01a4f4ea20cfab0b75 +408887aa9cfc740ca661a7edd6af8e0b17ab5713165286d2ce1882ba9302e5e5 +9f02527ded5011eabd72ce5ff1f12350d4e5130a990857e9676ac998dfbc4351 +800e309e314cf6dcf3750f3bb5467fb72de0b3afab584e4915ba93233c5e513f +d2f63bee7721881aa14a331c979028d7c20889115d626772b465ea0d9fc0c775 +b5edbc3f3e27edd6b46ab8c3a76b0245e14b755a308ef25a8dad6d9cdd64b890 +e169114fb7e06afe3b91ed8071c91235b25d4969ec9f03c1452d22b1ff2137ef +bd3d7b465154a1966f9b203e94c3f136a92faec041f74af4470cb54208ea6ab6 +c92560f542b85dd9f9b31e8ee2b5ccbe4ce674dd9be8492a161d646b77cbeb49 +aa5244cc402524caabf499c8f2192cc1a9fd5517105999a0338a3648ca03f9b1 +1b486352b68ab7a4816929d4d2706b5561e3e7c91eb5b116fd10f9ec9ea529a2 +e1ed87699193a44c174900fbf685f5cfa2639ded75b2e40fe9b0fced8da05161 +51fc5db43926292602db810b3a412c6f1ead6428aa7f45b4599e611289b31648 +8e9304e1da4d49d67d6217564a1bf74c887a2b595ed2f7a43426e1a7f1851c5e +97f591fc95625614cd115c03d8a3e2497b99c6b48510cb1e7f556e2d56babb27 +0ce9af4d3c3a37801e1fc28cf9457368737bd90d2bdffc8aa9e03ecc0f8c4eb4 +666936e527dc0efedc81a8acbb0f925de56566dbe14d187a862b43f7c56a438a +97331856ba272c57653a90a4276186d9f16350ea0f59def08ad5cd2d67316254 +efd0b990048bf4b88af600ec5faf2aa5369ac7c81c6caa59f8dd5c7dd29f0a03 +369037756c72ed98032589a86d9f31267c4932fd5ea2929992035781ef53788e +f64ba08a3573ce1f4eedf19744737486475480b4afe3cbf2ed608fa651d77047 +e6b016185db1503cdd5f17c8b515f40120f4a676ce153f8bcede25e0e998f7b4 +c9091b98d0364f599a783fb5ee99c24ccddc7bf77eef513b06753e26e2ba763c +fc67abc3f845719cad166be74e582eb74884345ccf6c265f4ff6623671358624 +5ea33fb16a4a4c4443c3d3c217b167e97c9c0eab334cf6f4f02a61a4d9c6f41b +5695fbff38e8d4d91733ceee4b1d93b642f974b510b1407d7992f02666d26ec7 +aba5eb40cc4cd100cd964df5dab0a31d07b36fa48efa64cf8c591c04381b3a92 +31c8f11150b820871fa64be805d62634c38a7ddd0855c315e32621fb962f7baa +44c9f56de9b712119335863b8e08652c9ec3cbf07279950b11b2eaa12ff17909 +40abccfd12674887866c008f06976d3d3aa9bfb4bf064e50bdcf3823b7ce5d6a +66732655620ea67c93ce77cfe64cd3e121c5ce207b6cb583fb317c1704034dfa +8d7d5ce9bc776e2e3f7cd965d3e5bcc453842f07fc539dceaddb5d2625078735 +ac550c310d989a98b4eb17ddcbab25e709cfb854880a51109be883d0703b8f33 +c64a47fbcfb7c1a336831f666b18a7ea57ab7b090e54eff27ef90c1795920917 +18ce8255e72339bc4accf7c4a0a832b3ad6d326218954b6ef1eb2b1c6e283fdd +1a84af455f2b88feb1e445278219265e36560e12262640f0b8c39d5823ec44f8 +f7fb0b0b1396706533621e3d3f1504f526224b9234c3cdcd1623c2025675be08 +89796843913c5bf74ad911974728626e2ea150b990e11027fa99ef57c7599702 +c0c8a8f3bd0a4453abcf0ee43b9d2f8bc691c5bf000c8d39a57e3a6061c7da19 +0332b98c25b3a5eb14181baf64d1ba6e846e962a5a3ea875ede2412419533f00 +0927ae15814e4fe907e6c002aefe845e32ce23a785965f87a4433e3d9cb40146 +fcfcf5dbd1cdf4cc5b00fcdec032af3383ee52d1bb019178b5d64ffc4735f4c6 +2350cea2f0c6c844fa492a097dd45af2692aded617e8a061d2734e40dd12cfac +51565a595b10c4c6eab692c7d1898bc887f0664ca953a4220d49585b6910d048 +bbdfcf28540d9a418881877dbba6cb7214e3adab8da4c2fbe47e395900428f6d +4b4b2f318199e3b60476b81d65ba33486d6581a95532ef5a8c4a6182756d1a5f +19a35a156896d16eb1cbdc3c71c34cbdb15b27fa08744257f7ab4df53312cc59 +5899050b9a1a484c6e7d7d2b8156c1adc9e65fd3a0afffbf77880e596dd4fe88 +70160f117e7f994f1d44d82b290b3412c05094227d953cd8d936253e70bcc45b +e679f3c37cd829e2210262691d4b4fd2715d235ed932fa7a4f3d6a51cd2c1c2d +98bfdcab79d94ae5a0c763b5ecf82beaa0346c55591333a2fe74ddde412b5113 +4ecf85c4f33f16870585929ff3a43ca183880c3b342de71d0b50e0caec8ac96f +84d6c65126ec6e15b475536b0cc310ac9f4b2e878f82c989f85aefb499cf31e7 +617300e920b4fc4c08a75760000fd68dcf357301c58a7d85d259456c19822a33 +33df916e8dab10ed7533e4a5cac1b999c30fa597da3fb3634b8c2d3f911ffa10 +c77152e36ddc54eb66be93aec9d38b41040fbcad8582789037c2752b45b95d89 +748fef565f2a0db42b2a5811388302fd3f66854ee861d3941f833051563adbc2 +ca1447923350863fbcd08df7b2014a1fc656bcc14549abff4345a697e7971457 +2fe7f47f74f6fb110ec6c19a820b9b8b250629ba3e1c5875e05b4f3337fb4964 +a4a4ccb5e2b3022070fbc8d443415baef77dc51cd2fc0e563a60ff115872eda2 +386b73b755eb353d84589804462783d6f2e47c88ac22149f64e5cbf873c41174 +7da691f652905e230e04457643f56a0693083c3ab6cd488d25b2ae3d4d093744 +4e7434e673578a3bf51005f94abbf2e2cec0c49bb157d6230c1166f890e7d888 +af0eefbdeb7a8c8e2c329736fb1abfd1c28a236f48bf45ad3f9800208e2c8941 +d7c2646791a2c6a9f77ff6b14d7a4cb1561ef7d5a1a4cddfa41490ef06be0dfa +4dddb8323a2ea2db2acf4abf56bf4f0cc6f667d1ffe303fbea1022063007e244 +03bb1e90bb071aad2256fa48458390f293b11cd33588cc1360df26cf9d91d9c1 +f5b300a063059ee65641c58fe08b5ed6fccb1f67e54cfe0076b02ca362a45f97 +245ed407e9f1931206addd15ef3784dad8d867746dbbe36bb2ce156744a87b3b +a15af3e3cb363c364563a81cdfcde7cf4161ac8896427d02328b951359a912d8 +1875b42c28813384ec0c949a6bc976f6742593e3c9a99448636568639dac3c53 +9a21cdc09cd7bfbc86cb8eda122ab9d6eda9fc0e4eb323431d002c6a8cb29983 +be023d9d52f147d73773c1f1380900e0072662ddde03b7c9d2e4db6368372608 +e0496a71c64ef37b03aaa37b039bb034e6a62ab9847c99bf3f9099a6ac828649 +32a248d723f9382cc93c76dcb0ec3db065bd6ffde538058914c02439a92aec80 +a66aed7b67ba8d5b75eb76e277c198f1f1c2f71565bc0c23d25d6437a7c69017 +c72c73f0fba4bfa80a5a046dfd0ca7a783d708a338ae2eae71790312ecf250ce +a7fb1b69c6c52f955bf1b7333972d48f6f479e96f8fcbf0ab105b92ea72d0613 +7505068b025f00b576831cd180cdfc27494245d75802ed8220d1dab513e5927b +083eaaae23ecc085b27d6ef444ec9fd98782e35f45b0347b55499af1e7a55526 +9ecd6b6b0b0aa2b711e5d3032ace6fee06d5542c686215133cb7f158c65184be +e20041a7d55c838e396b3e50030d4ac5c5831dd6cf3be395aff8d416a1cf29c5 +88149b83c31cb8bc45a3f900ba4daef0564564dc006c44009a8c5967f87ee50e +3fb7b500da32f03ab2abc380fddde8c875c19701d1b9ed54777f2a33030f1aa8 +def1ca0b3720e9859c189fa70462a3eb074bc25c2b97c2be9813f9dd887cf118 +6126db00de2b454417852b5ae707422cd60b337c63ba1acbdd549c79f0e16fbb +ac549022ccbb79a62e2fff0bcf1d99a016304e8349fe6c7782f868c7ecc3c27b +b81fa8c522d9cd26268c3606d529d8cbf039020630e084b6385ffe35d911bf6b +138a9afa6174affd18a6204e0b67c8ca76c229c30a13ee2de45e35631fc03f4f +9b1645ada82e4aaa2504df003f8c6f7ea621a0d2bb693feac0e68544e07acd39 +ad72aa50b3b9518e87763a52f92f7d2bfb84ebc5c6c7fd83ebf6ab660b5d39ef +3b8ad3d47743809397e04c52fb109ff9a99a3dc2f462db485b70068b80546b58 +a77bd668c96f83fecd4947ea612638502aa06285885913c3d0a55ed59fcb5717 +4d6cc24d070d554074890f9a30bc5f749220def451ed203fa509e245d0022dec +80185e5130ba4c2d55f2ea3b518cb97cbdb99c94b7c71de53416cf63db5662c9 +314bfe5972e405f56d9c64fed47f2403d9a369d9762d045c51a81f49f2dcf7f2 +9b4b2c95386371755169be5ac5c77bcd5781b0024707f89703390a57417224c2 +f3c071030c29c5362d86fe7b0d6fbdd4ae0d5f9d88b0b6b3f3ee624a06d12a3f +cce2f10522acd3b1627264a10d27bf4e4228daab35976226415e2b5580801957 +580b9b57d264ae556bb8c19aa894a68cc203a4f1c61b8f736c0056a6396816e4 +b325c498cb8ff2163bef8775f0374edee0975c0e12664f28c91122b2ec426e3c +bc4040b96af0a0e1f1f08181a125ff32f1deb1541e765d3f6c395d4dd72cf70a +0c8786e78251339ca115ee3f5ad2f2833b3299b88dd51dd6e106312b6d2863a5 +d5be8dcdfd3aa0c23442f5d9f2c52e26b7bcd93f651531083cbdcc8a1983cd9f +7dc0de8fe4a2e226196bb179f8b06c12041c55b3e8e8919980bc4dc1b7c40ff8 +37370003395291883fe84981a3890f0c7dbe8e528cb2a81ebc8af0faf17a9069 +a7a7c9ed225f696a36115daa94dfd10dd270ae15fe601a9987bab5c9f66b69fe +893345a4f78534651e6a1c3c3569ddb6f9a055e1bfc7dd93b698d98797ec1328 +a49c6af1fd7955f566b8ec99300711cea2d99dc4bb2c6aaeba79af44bbc2debd +d43bd144d1d53b6232dec21840790213b586fc630685c69e438ef6d245019c93 +9b506df33da438b20df1aea4a4e5c246a8e6e5d3bd22fcfee85566287ec4f7e8 +8e33762e9475279fba8c2a21b334d6f21f189dacad1f5df0e6de190418609ef5 +9dae7a86830607c5eff55bfa5dee90f611d04f634b19b68f3ad16320ab5df8c4 +ebe6a153b8aa346060bff0f079c765f5b007d5a480acd201cf21205f3999697d +23868cbea55866d79f3f44bda0140212f0790f51dd9c8d6c1b6eaff7443241d7 +7ae286049962a7a2df2f86d77817eae276876498128bbf9d0bd0d8afd6b7df05 +640a58631d71a56095d048d54e43b95e2f63a09e36286bf5fc9caccc3b353eaf +3215a65f0bd46782fa6eff4efbb0a35edfdf715e7a0cdfba50c6ecb72808f1cf +e2fe93a936c821c4fef275c04c4ce10e503216d92f41dde7132b70e78ee27753 +5eb60b276faa9b10b2c485b6522741889e4d80ab8adcd269e598ac4fb359a4a1 +ca313b71d5c448d32f7828b9c0854adb69d25caf61a7fc418e524167ba324abf +78995886c0a6edfde425d5e2171de85b609152f30305138418f76f9c3d15753b +0b2716cf8f9c412e553a0b7dd4a3b1aad4c6d5ea4f18f55ea03b91305e2d23b4 +96b5746b9060aec17db39fdef6466e99c99dbaaf458d19a5290969bbd1241fee +6f8d49448d81521655b7e24f5c4d4f60f8d136d4c62af41ec98611a04a0323fe +51671e40ce6a0ebc879ca0823b42ef74758648a09bb7b6491ab3c87860dbfa5e +1c55f515d43d55074764dc43d7fa8c9f +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/couri.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/couri.pfa new file mode 100644 index 0000000000..2822ec2a75 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/couri.pfa @@ -0,0 +1,1893 @@ +%!PS-AdobeFont-1.0: Courier-Italic 001.003 +%%CreationDate: Tue Sep 17 16:31:02 1991 +%%VMusage: 56675 75599 +%% Copyright International Business Machines,Corp. 1991 +%% IBM Courier is a Trademark of the IBM Corporation. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.003) readonly def +/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def +/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def +/FullName (Courier Italic) readonly def +/FamilyName (Courier) readonly def +/Weight (Regular) readonly def +/ItalicAngle -16 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Courier-Italic def +/Encoding StandardEncoding def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 263787 def +/FontBBox{-48 -288 800 841}readonly def +currentdict end +currentfile eexec +9451d7e7a4929782edaf756a2645851dbcddfea354f61d8628b8cff733b549d1 +03a6c4f5bff18e7f42cc7ab902ffc194c26f5e122df5e4153316cf8bdd34f70f +7f4ac63c058fb15bed425f41d00b0fc3ce2bc7aaf11938e1e62955f527022fa9 +101fa95110e14387d94d5f312dbfea32c17f8467e82d9c3c014699e7ceefd421 +346e8b03a0eeff980f4119e6862a5e4c2acf990756a4c25f41289ed051a09703 +966cddf3bb9f59d54985d5473684443849535c5c052a1a9fd7bd55f5f76f6e3f +f7eaf762c3144175458d38e0c1cfad096c5f759c52459a0bceee202940109f4b +7e589678aeaedb32e62789199f908ae2c370138de2b7d42d9fd5f24a1a39526a +16f99ff43def7d9cc15cab7bd4984a978c5004eec4dec999af4f79cfd01ef149 +746140fcbe1dd3efd7bea7c6ad6b84229d3836f4d7f5714424c21a13a941181d +cef9ea1d136feb92b96b3e3126d9529878cd620a1fa3e4cde95853533f067ac3 +39f288527ebc6ba9eac0e767731a02705d581144986ea6ac8eb055b550ca00ac +d031813c1ae301f907efde4be3eecfcb4a5928013475debe556f045ee0df78cb +cc080be9c5628a6254b28b146328f10163a09a83267de2cad5115f778a369cbc +84fad9d59d6eee9785bb43e2c96d13476cdcecb6560ebfffa7de0cf4662b3490 +36859bde1974b21efb897c498691cfa294b724a58138e92e4a32b138302362d6 +784aee399bddfe6a40ac7a1e473d9eb34e949ea7fc42e7276591218e4237b50f +b02bf78be202b0972447920155dbcb8fde70e74df1167fc2ce02a96fac4fba92 +4aecf5f4f94ced70e010eff9147c40fa6ee88c7e5b06e5f761f2c222d414cff8 +12999db0535504f922a533c7538d77239c45f04c9c31a48bded20106cf6d885f +1f428e2144d399a8e589c3790d572985a9b26876960e31eef7b8ef5430d391da +9618103b8d95452d9ad4fb2df2fe324500e205f5830649bb6688ce7b599dc96c +884d0564a73d7a3bb2e2aa12102079ea29ed01340ea9c2e6cbdab1b2ab6301c1 +815b16b46aa4cd714d2454c81a5c65fe62bc038c62f3db91431361a832fa801b +001999d79ed82fc813e004b875f8f0b69764d55966952482a015cf67587f3624 +f0e94e983980c9ada89df75eea4b6f3c0fec7288b07a51bcaf9b50b7316c4c22 +65da826d30372d94e3e01067b305907a6784fbd29b427dd950a27a4569c9a93e +b94d553d5698f8f312e015cfbb4e411a521ce2f0216f900eff711d60a21e0487 +1191cd8a870bde5c7d90ef2c52ab892db301513264ae73b2213c6eadb474d7b6 +03e6fba747bd5532515b9385eb4da75f6acdeb8d5225f01745158ee38c574b4b +842962be90df91632ab92fe2af21f8699e670bb3ace0f4b1e5f252f8a9e836e8 +baffed5e34f70561ffc24a440bb45129d3197476d9446d4d15929d957664c3cf +a3f238ba39dd636376e86414e7b1efcb42a6079e1570d987916d1c0e3abe739d +bd70ee831509b8bd6276adadee7fde2a39b015884f5a8dde60fb6422a00dddf2 +84839f70f58cd9674d2a5b3e6608dd892a76425f4a719d999846d53ee1a2ba19 +fd0a7144af29d774ed2d707e6f5c409dd262ef6a1a76ebb0f326165e41578203 +492fd1817cbfe7c20e4e71ad1e708f72aec944f42e097cd71e75e530b853eefe +3930ee67d4765fa79b2922884a4f54f5ead4f149b3d7397affd32da788d33c0c +34c7b6b747685680cf8de88352869e58aa05405f2100033aef8e07e465421ce6 +1906499e3a9219bf545a2fc6dab9363c51d28778cedfc72a14124bc174868a5a +6b077a5bc3fab24ddcdb66ce8f1228f2e8795ca00d158dd85b6ce80bfa2c5b33 +54582dee7138beb45b0b795205263cb3922fdfdff57a077395eff212f13dbea7 +595159bf5fa6ef014b84484bd27d8cc405dca16b6aa3ed6ea9b0b69ff2b160ae +c0af127322c7f3bed8b8089f9bed60aac6877faf30db93b59e3f99f751c03174 +37135c58c3c43e95681e4254ed00531a086de8fa24f68483db6a97fdfd3dac5a +6e0296b4f2207e2c301e3e424e49c7c5e98f48bc1a545b3a1b7e4bd5b6829f20 +0e5663995deb31543a56990850f6614abb032a91994f9bf380a8d0a22f6e19d7 +006edb7e5dfcad6e01b9e3d791fc9326862e72aa717fa3b68c537202cd6ae9c5 +d81773186a4c30c5a95d86e6614e30eb630690c78a40eb87c08e6f679ff4f862 +25dce99ad158f978b63c037b51dc5267c11d2d46d5823f429ece0d1b1e5225ab +092cadb0c5ac32d54404b1dc2b6b340e7b2d0b478ab13a3e53d1f365a50c515e +8d4bec663f52a818faddde2cb9f05aef238b5cd55a29382faafa3089d6f69379 +ef72942826fc4742e7beb16a452d0319b6b3a3e08bafc4f69bcbe9dbb938e768 +b392c9755bc00415744c0f850c855a1ba009b1e2b3a8c48ae92e4b4d95bdfa30 +aa0b6e310854ce3137885f88f687ba590220d27378d0ea52145b84429071ca41 +fbc3d285a49c55f32cd0d31676e36a2bd406f33a0ad837af2cf35602f9c6921c +9167ef568466c90308107b918419e3245dbfba44178559abc36fc6c1818aed6d +91c79d4fda4b4b2a47c068a11bbb899ae064327238fe5b4816dd820fc81a8871 +40025ede257cb64429dd34f9a1632c60eb44f3b24799a8d271b5059b45092b23 +a4ada866e017c76c8f7f701a37169fe6404a9c2f3987f81b9d13fcbadcd2505d +2793770da0f40850a837fa1ca9b6aff2004b92c5ee6fab82895f7b7b584d704c +94345ffb2f055d296f79fd2adcb5b1c1604290913b8df0f49df05e637266c882 +c0aab6855aca04b6bcc488a4b4cfdd8314b932f50e5d2c72fe4551390098da93 +060d3b350082b6950e7c9ace10f3063f9c24956cc7312ee1453defd2618392ac +b8c970cac9a2caa289639c4a3540fde6851e0801f5fe97b278e42280dce79568 +a4d459defe3682ee830c395e0949f8b0e90b43c5c1081b02d28ada072e63a5ed +6bd693ab68093e99730bad8499a55fb9b50c8a1b7ff3e01735077552b1f14466 +d86462a79e3b965a9183c0539d827686ac0c0c828448bbc999cee7545e6ff564 +24d47780bc2ccb4031214818681f6c1aadf6fc05ef40feccae7a672c83487458 +694df4bb1aca47b5d7922e55fe29c7df4e80d6e4bd4b79402e299e98a89d22e5 +d39073fcd45c50d08224481a9da4ec0648f002e0e9ae733d56823c9504a467c6 +325b8c959e79a08504417dc181116ef4c082394ac90814e97cd63c2b591eb78b +f78c30368cfd3ade41f83b89dd6ebc2db9bdc9e62c40db51eeeaae3c0e36ea1d +153f80beba54c411b75852627f45de38e320e3fa7870134e7cd41e355fc90aba +3adc77b781ef03e67e49a0a94c8fb24f7b01c6eb37fb38cd409d000438b39296 +dbe1edf020ee046411bd70a3100aa113c4be50f47371119570c7b5a74fa60b62 +ae02a8488a26ba8b057ebd29c3dd1d813f29c85049c86d339f32f0ed83b41f7e +92da22abf963abf1afa56f424c127a23e39a5a2213388827660e1c6a1b016b9f +834e6eb705a69f7ed8cc981c651014fb12c6de4894bf36a317db98b870d07409 +43144994a4be0cdc78c8b14acb0583b9c6ae0286cfc355c2652e3ce38e4b57d5 +da616ade47fb63fc9ca2d00e118de2f9a43a18d5065c91ee3b57cd05d5ab7dc2 +3cf8c1de80d30a857edf235da528370b006209854fb381fd693bbc060936639f +3a90ffbfa38d497c5e04bc92ac2282064ded4f8b48a1f0684650e8ec7aa8729e +cbd4f167f3d6fe90a095ba8f75f03a60cdd5bc4d83afe96faf8e8199c4211e57 +4f7f843cd927b2581aa05b07ebd916989d980e3dabd8140e200de167e0c81f93 +bfa47a97844c1a663bbf1975483989d9357229ab5c774d4222acf58c8da0e891 +a6068bebebc3baf1ccd312a45ac40706486735db1fb8eb68f75de2ba3b640fce +39934712779c7a27ab2ad4c3467b0d00f48bd23c32b3a2c3fa9b60a26047d7e1 +052d1d8c316caf1be1bac044be3564604892b7d33202142e1ce3d5952fcf0fd2 +faea492b74cdc5112ab8af4dc17997831d98b641d39592a9e84b1d7981c413c7 +63c3ae7b07ee80199900c204b54ce8e28ea28a7efbf7f7a13cb9122ad020115c +ad375a74983094c289061e23d54b8ca38e8a1567a4a44ba1c1f3489647faff31 +45ba870af754402bc3ef934ecbee92735e8d88f0ed1097247e40257c1fe188b7 +b100222b745d457d8ed2aab04206dd62391fa2dc7b3d728e10405c9b5cd93bc6 +afe10b476451d3edb361a090a6c32b8180bc02494e01ee684313c171b4cd96f6 +4dfa467b45577b795deeccc0701c29fb665e8a20d04683592f7b3ec507cc8d74 +4072115649b573b99cee72393f788ccfc8b6739ccafd4ece7f0fae20ded802cc +ce4442beaec97cf0b5489707eb9779e9f72b5f55b314e26422a8019c44fed234 +a21f96b1b69f99e0a265c6435bc18edcf6cff798bdb0b9bca878776b925423d6 +0c9941fbfe4e374a51b4f4ab6bdfe767d3aca462d727a364ee60360248c54769 +7b3cdf8913a78f4ee0ac72369545b36a8a74ee785c1013f04ba3a482815af951 +703f3f3359ae963f49d1df66cdc5d47010cd3765e29b73702f9e0b687207b8ea +28ddb6a47c9aac53b65fb50d86cf716c68572a6e9223ffa141a05856de949f61 +12bfc258cb674114f7a5afed4ac2d75e5ee8e5475ed070342c724be8a8e14474 +b044416541284b470ca3360ad99898dae8194581749b1d7626eb0ced901beb7e +33b3672d74ca975b910e81f14569c725b9fd9bccea96bc61dfc6c3fb2f490e64 +97c6a20d8ad2e065a697ac178f99b174d65c8d082d9a9fc937bb669c9a93daf7 +c32d165b09e1b9a0824a3072990cf9ad7103ebcc6cb30c552ff984600560d2a6 +ab1270bed37af4b8b7863ed2d10fcf15a88fcac28c61f1e9f97dce05200a9a0f +291b4d0420a6512e6614c28457bab7007fee6591241943deacbaa5be0edd15f2 +6bdb59adeaccf91b843bad3ad2066865c7736cc8b4eae5a1ebd3009802955717 +0dfe24c72ae5da4261ea8f9070ef1da48ed288e22ddb060220f6822595ff0208 +448c931d2c6ad2e132fefb7528de2b6afd1c6453d798ddafb3eeaf906f972080 +d9dd4539de39dbc3654ace2fbc914ffea6bdb35aedaed3f5e0717c0fbf60f167 +5c9755485c254b6106faa14c995b6043d073a009572dd50f5054879b2c75cf3d +08048ff3f1957355bafa70ebdb1aed4a7c0ba38648d193b18cb83f90b2610cf2 +df3f4c96a25dc64a341e253cf2d09dbfafd95f562826cea8a85c38d76d0add80 +cabd96927cbee4a1c16d89aadebbff0a7e2632e25e1b5d82132527e4f47106f1 +0416aaf3766916ce6d4ed930fb45cbb2ff6d606323ea3557fc29e0403ae664b4 +434cf42973abbb2db64dabaaecbbebf16547396e751138a24ad9d5c3475304b7 +99e85b57b37ca1060378c8211a99078f8b8e8e43e3d191ef85f4b7a7e7f11898 +b3eeca83053cbb2e5cc421429361867d6631d5eb3c2dfd890f74b504cfdd2042 +6ff193765ccf5ae1c820bdcad46bd1097386d02a59360da1e30b0167e01557fe +4360050e15ef77f236c833bb7589b6e335d3c7aba5f90baa924d725a7335712b +4549bbbd20c12398b8c8e8f7abe3104c068ba6db673b81d9532ba41b8be616f0 +3350f14644713b17482bed129bd1c5c2c4c5c3924e90918ce9e7262701e314f3 +cc8956a36219aa6b3c6782b7fe6c91af6b272f9936ba0c819ec1b0fa0a8616d7 +2d4a63f758128e2c348c083050f06a0b6feeb189ef7a000f4ec552377671b0b0 +393c66047a5756d7e9ac38c955d3ce583f94e50b41a0a153961ee049cab60d85 +97cccbe0686d23140adc2fadbecaf085d96d31a8358912989dea8787c292cae1 +7d4df00e359d791cbc932a31626662e0552f79b396a22adaaff556326d508275 +a2bd744f4583dbd8c91c8e89bb70104d88e2faa619020412a91fb03d1b511c78 +ac048f87ae0ce52eee8161a84bd9994d8c4de132a71d06278e80d3fb341ce4b8 +49a4856f5d0bd770baad7bb1338449aba330590a9784447b363872c1a2c7a390 +101e4ac42b1331daacd27aaf670b13b29da7601e05bd49cd62787644ef6f6ce4 +c1e67e3fd2a3923281faff11ad358e756d285642be31a8b36fa372b6b826ab34 +af6a9dcbd37aad998a881b8910552cfd53a03b2ccf128fd5634b30279b854a7e +c3d87c27da01113b2e134fbf0283f00e6bee34291027ebaaa310a6728b98a2f2 +40fd33a44caf62306a706b5ead4f7e16ade438be5d36359d0aad5da320d98657 +9fe6af830b8bf4bb32ccc46d56f48e769b49cb6ce9606bb0f32309333e87ac82 +91f85441a72bd6f6adc4922908aa822dfc4ec0e95123e35b40f72be615eeef40 +58ac7c03070bf65c5fcbf8b7751a4955985fc42ad26c6b87433bc98f03ce0f8f +51c1e63c253d32f7383d02c5b8d7c57aaaeea850f13881972fb594fd74b57d63 +de373261225149e899d60daf10c7707a6572e5b61d0cebf985b1fafae29db8d4 +e2e0969bc8351d482d270d93c6741eacc85b53b3fcdf04a931776933e36f8009 +0d15d03f4c51f27e41e1b09a233e78b95d50bb59f80f025e497494a35168628c +b69da174cd860bf66879831bba9cb20df1fe8a005929b8657ac38e5518b94ca8 +ddfa11cee6f424446593c9ab1061bc6d7d285b4d2ba61dc734f23c68165796eb +48bb353d874ee8b354ea4ba245f249cededb1a45eff353d3b24e6ae36b4bf29b +f2f0d4958e8652c90c8607ee99d364525ff45ed28b2cdb035f4a921ff09f7fa5 +a0fe308f9322bee5db6e8fa9c1b928c093c9e3cc21d7f914209ae12fa687fcf9 +b143b60d1b6eddbabe07324398a4dd3b96b38637b979ffdc844712bf1457e73a +aa66b914a46707ea94d87bdbf964c736a72d1f173b5ca8eeff1aaec036756e86 +2ae63b2a05ce9bfe44dc59c91046127522b37dc99e1a0a40f9189f2041e6d3af +64adf60b14ccab5b3e0f19075f44f0b24bfe305db1a8cc97fc268136462fe36b +c18c54f419fab7c9e6cc41ec5fb01970cc761cc5439d32f2d05d7753934bbf7f +9ae1abc694d25e864601aeea52cf0393a8d99c1e278915970019298f21fb1eeb +253ad932b9ca86ece282690e7cd815ef823dfe706e31499b3200983d7b2e1e03 +ee85904457f4b67ecfc10b2911be7935059375b5e1f4a59aae648dfdadd37d9f +92aa32dfd4ad6aa52709ba37237b9ec1c15f089d80306f4a2f86ee4e53d43177 +72139d975aca988ce9fb925d4e8869d9bc3807114c8cff3b89aabaaae6c004f0 +b47d29a951688e253d4b9edeec90537929563e134863a5bc5b14b10c7003b172 +af367f7109a0026ccd1b21b70d768bab9ca649052944b5713df04fa2c491ced6 +42abb041b7dc3afa5fa54a1bd682f2f4fc11028e2742e4620bb7f7d2b6b3cb04 +2cca29b6e140da488a6c015a5405f6a9e87597934bd2eb54ff7cb60b457e3125 +75d1c1fb0e2b263cfc8a36be85418bc089c7ff09808906fcf9b2fa33c37926b4 +2ab5548fa99a68ac72ebed94f9e196ab78661d1603829f1077ed9667f1153b5f +30527f64b47ead21c8971e649c6f08930b334c052ef16bd8e08ed918b551ff1d +5b06e6a02c22c325a36a628ffcb7cda2e204a09e6c029dc837a1220e728f3a26 +370f833b16d3a24510de53f83f6295853ecc202053748399b8ababc574b17fe7 +d543ca4269466ac9b2f96a5322b1b2bda825c483f632dca511240c9ed233b5f1 +ecd258867fa35d43126995a505ccd4bee92964493d633dedac48bb516eea368b +6dd30c92ca794affcf72cf93efe15a5d5bb730dc2ff190b35e7805a6a448d8cb +91095447ce11dff34debfbd18e88940a93d2b35ff12108b89733a4fef8a8aa09 +4a569660e66793ac5fafc00dd26b07bd1e8a5db3de4599153864cc9c9b5b978c +939272c070947643f999070239fc0489e4248aa1ace1111fa45a02ace8924393 +d8781113740c2666a2a9338023a4f0c0ffa4c304bd96f04a93edb7b6f04526cd +6dd6125edfff5a3e252aa049a974e00f62c449c68a6f636fc56abcc3ea957011 +d2ed2932c11f93a299f9c8f76a99c166a8f0b3ab07723601a5360fed33dd9af1 +f9de7d2e5c62cde83a485f7b701a1de173c6480bc2354328736d3012ff4026be +5f4405e71a1f3c6589bbf93ec9b44e9172c872a23190da0eb8783d864a55b073 +c606eccf6e032aa395a025593c00c1ede21490d590f75e07a0ace72030a03103 +aa6452a75de120ee0e87dbc5100924a354d9bd59b45eae1ac3522f1560db9d4b +cea57007a8e2efd9eeb415fba88c17b6a262608e03661f78d84d10d2e3ffa3b1 +a6e22f64c77c96606897483c283a61b6eac19867f8ea6d30e7ab1c8426bc521a +9c6d95285ef146c3f26306048c0faab3ce8903141ac00d34188adbb2943bea3c +24ada2b77c2fb234ba81b18319141d0f66ed8f030b9488b42a8b77a9ea818568 +33e52373e4af68063a20983f7ef9650b36d756a9914e19459ca5f73de2aaf099 +6b7a4feff0cb044b5efdbe79c0f92be56c034f0837407936c61cbfc5c246aebd +bbd6d10151ff96e6c9a70c83c252caad6ccb7dce8f8daf0fd9369fb7ca917318 +305553c4065a128d48e72c15e73d342b60fa5cd5cddb4ccd312909f3aa74c6e8 +93e4d03dd5f14ffe7620fa57fcf052edf14b24946c3298ad90495d4ffb1a3efa +fa2a7fe539da1eb9a1caae17db4d791f82a6f7549f1bc9c8511c67fa7f9a0c4d +0e1f6b499c20ca4bddb2d01331235306174ddaa89fbba3940fe3f0d90ea99ca1 +7b6068cc3a067fadc54ca07971fc760dff6c379e0da34213efb3e31b8bce103c +b213d370e9d56a7d45d717ec95c147a5587d8fdc2dc5a473c55682d8e6ddf0ff +99b84ff7708d0861ba2e173cc1bc5bea35c9167f434af0892b36df9185858494 +9a8c30aa60f56427bc62605639c1fbbbe8b3abe849cf9811dd91e51c7cbaf230 +2de453d71129891f573111286f2e1e3409d655a5aab5b711c827727a1c2b3a12 +3c6e267745c9151e4f68fdc8408cbd61e2415af33491dbcb6213f7f863a885d0 +a0e22a64c414738fdde20b991e8535188c7fdfa2c4c2f7464996d39ee7a6e2a4 +edeb319993ca59cfab71ea429df70d7c13003a14195491f38bfe9ca0e847d5ac +5b4cead59f46f9a96e9d2da356764c8f9ba7f28ddc44da1e71aa78a1f37f4d65 +67d089bfbfc5905d0d9f8bf91d59fb36368ebe6dc98d2dc30bd4dcfd95f8a7d4 +5e5fcb994cdf902dd0d1e1c6811da7035265c2500fc841b593581a685348cef3 +e7194022c27ce9b6e6b145c00673ec1b5e3b44c591b624be9b98af5a2047f91c +ecde59fe67573c7ed7059abfaee47366095ec644982546b7ade8fab0405df825 +77a1e716f6c5ac53f6399471af444ab647d20d73b56bd4f691a1af23668676c8 +7fbdd5f36ccd0b511a3ddca6749aade0226839bf535c49aa48c8f77b93a92502 +ba49d66c339eb423849595aab668a0fddf1f05ceab7aeb0b07df1f074f5379a0 +716aef2d1ce011c7f446af69375061b61ee2a5d53070c700cd61d65a19699654 +5749531ead8bab91300d32155699a97ebac94fbb074c047f0891dabbf4efb01d +183cecd9cd90e4276a8b706f851a9545e24b979db7a160171a647ce1dec9cbe1 +48c67575c9225276534d4954f5bb7980f8ff64d841441c358c2fa6745dd63377 +fba23fddfedd38a275d953dbae7f499e16fd528bd167e35895d92ac4a43f1390 +d18c8df01a18da71936f4f21274a19fc16ac14676e9204874dbd4c5375d1761c +26a48edba84acea46018cc75c5d394f5a512ee51296607e8dd91cfb635cd52b8 +f789fa9efafb8ae5bb03f7dbd997a9c935a55cefd104f0f9668ea3682beac7ff +68fbd047a47b2f31e775bb7c014aadf38448734b5077843ca1b0c170f212110e +0cddfd06af06c11ddd5d77f705354f6bb10c132cc3009c229360799254319322 +09b3f4cd6527dd7843483bb59cfccde571e7f0c3eb1097227206846f4ad2e0ef +20ccfa79a259dce46351f57e6e593ebad5bab102f379b3d092b4562a3ef7410d +c31c4e65b0bc5db4a9e62744f222f389b8367ec3b98445d18ded8ff88473ddb0 +bad0e15f159e29f4498a68f566e7f9cb93b8d49f4b896323a364bad3260fd5b2 +18de9ef59b9d86cb2cc3d909ce04da0711a6e609ef5766f00c21c1b0866df62c +1ab78933e58c6579b1db3f75f59063ac680a2c71eebf9eed664d261926a448f0 +597eb74549a6fdd03986f8c131436cb4d1c0c1c2700a8be389ce3b1599710199 +5f24a9b2a41c0a3d2cd603b0295d93b8353bd96266da252e13917a0559b1b17a +14f7d6bc5337a70f25f14a530d10a10eb00f9e3cabd9957394fac9e6d7af4f42 +c87de4804b581186ca91a8be760d4b95e605168f28009c8ac52e043cee9076ac +fe0454370fd4ed08294327d321f6f9269c31702c9e22ad65b7f1d1e5d88ed353 +a5c22be5a8bcc628d35532eb0be85229e66efbe32940d6a0deef0af4a712f9bf +bc42144f489e4f55d128f3c190c0580cb73e1f8126bd9af51007d29c5ba37bf4 +193e55c40fec90ead412ed8e67ae1706487b8b99a0053287a67f9394924fba0e +66befd41f5984d869e86ecaa2abe3bdcc88f0a293d4f8d6fededada3c95c63ca +f315bc533cf7684d70a535397e0a365e51b0ddcdc44695d64fca2f88dc830caa +520385dd0189477673c12dff1a8a933fcdd35ff44b378054a388659bc7d34b18 +747e91e762106878133ca087ba8745055fa56b7d55be79e87d1b5393a1e354b9 +37ca1ccfed929827205fd7f4c488c9771c4ffebd7ad282e35781db53a4980232 +36afa1c8285393b8babefdb39279cd7e81f552b60789d4b3e75db380e5f5e146 +bf710018254463c6fd3afe5d36e031d8aef7466003a59e02b9a33d47a984e10f +1467571b66c861dad8df92ca1fa8258b2e050905f754428289f2fa21903569dd +4f41d32008714e3274eb89df20e990e1f5f8e374d9a02c1d6bc259292c589a84 +b1627573ba844ce758650e4b06609876a3358b42dbab955c6be52033a353992e +e992e1508ad495437176290ed1cfeafc4f810d1127ca707e632aa22a2adc7ce3 +fd75385bc5b0b0599d9177f2a73228dd510bb6136d02bd456f8a4a7fdd7b61b6 +5beeb68fa6d07ebb2f326a9604a45dd1281f2fda33a2e392f61c0b2d358539db +8abded8ac63f5bee429ecfbb646482bf5233c568d9808d2d6d1223262d97cb67 +cad55177ffe979dd3d75f23885195d30e1052932f9b0f0b69f56d20a6afa3e7b +716383a3af055c83d81350c49f3cba01202ae59fc4917435fe2d60141c4c9b4a +10a737b86504c8218ce86564063ddba7e1f79d348247fc9a0e66ae45977943b4 +33314c4d62945b734ee2cff74e2251e57bafe2d7df36aacc16c4e7e8317a99f0 +cdb643fd9bb8baae7554a3ce36f46203bf90ad04d4308182fbe1443e5d9b06d6 +0f690e546f14a3b59e88c73f8cee9e14e933870e726e57b24ab26a42d208eba7 +6bb854b2616ea206249684c7deca7a2039cd56a8b61516f4b804a8e7cef8f7d4 +64d43dd5addb534af596e512989402c18e23ce24d71084f38ab320c95cb9e812 +d1b1e0a5985229ebee8c939a4e520e7a6a9509328969fcfa8068ff6d7d0b2554 +2a1692872457f852a723db78280fa52f7169b8a781429bb077359249e35a456d +70e023cdcba49da955831be885c3cf2cc5f70645c66d22ba02896edf191f6b39 +6a475fa8ce12caedb99f36fa1a152bcf0ef1ed857bda26d8fd95a8f47cec70e2 +7bc1c1e6b526ab9f65b0dfef215e559f8e83b2fab3bcd7a84805bf30d6302b12 +3f04d1df11fa76fb79a173c3698b9c77a7696c96965cc63647dd5517ebc07c65 +2bd13ef9ab6b4c85f1138add1aca375e3d59bf5f706951a378801bc3aca40f34 +b3803a4ff311d461c636c05572e86af42078ba9e791887eba8e2a5794a39e119 +1eabbc368e55362f6d07a4785469815210cb386fe46f837187c2934158c4ab17 +977a1a7c901ae294523c2876955387f47a44eb4eb669e05fd34a07eea12fd6c1 +18e86e83837a76ff03f38f3ac579489f2ff340b0c3ec3bb0f2e57c226dcac005 +fefc63ec5047983995465ff27efc036e879267677a8ec92b6ab89c5cf347d25e +68ae8eea58c00884e4061b05b22e8cf4eaa7754046cde1ff34ba093712179848 +04b598e20ece471f32f99b8dd2cded970c6aaf98250cd2a93ef2b539fa7ab354 +27c69e31bfcd9e7a5003735d4a477051fc41261e2fd14cacaaed091a2928cd90 +3808bf6f43f1c9c68bd3722eae14fb308786562abef6bb2cdf044cd8b0b26518 +45a0292d3f11cd9deea8197b2d5a33cc78d2c9e14a3289c98eefa1b1ea91eb94 +fe8b9e0c132a0a3cbdb70c9ded02a644b31cd766bcdb7508ea1f1ffb8a9f9a04 +f72a3dceb6b16673d20a6b7acd566a955247ba287cc74e6007362553bdb98102 +bd5a1a1f8df9e1c1adb8f290f659357b592e8a325ad1f9cf74136b576ff926f1 +f37c044961104de93de26a01a2d98b8aead9e113c47e9179e7ec06aa5148d1bd +d00f415d4aa5a94293f8b0266587f463ef0db2d7f10749d072faa586b674abb6 +56849caefe4f8d74710aa97549103a526b89bc9d286f0f0b400cddf827afc178 +3ce120cbd1e6bd83bdaae22dbfe752158801c42460b64518f8c7a374cb23617a +3ec662a90c324985c4693b6e80b88aa2e96f7d35323c0999f56f1f8db37f9448 +d6214fd1099b4a73065987a236a4353cb11051c1ef75950c2c03647abaa98615 +55907189bf0147ff0c5a2e1db0627cb316fd2e6dea8f8c9b34fd5a58ee6a4aa1 +7191e2b5a08818b72919af8173fce5863cbeed9b500c924a55e58252e710c648 +d41fe4c020c0fd607b08a4969f3fc7bfeda3e20897669f2ef32511e08e9207b7 +305e9723c52a16224e8d0f1bb7cf6f7b687aa5bfa61582d1d07e980f91fae736 +8b5ccd687da89c884c5d199518d0fc9b0e424e740aa04cdb52510b668c09a3b7 +ea5a527074cace5b2c4aee3c846c383a1c9acdec4a0bcba9e0b3d05aa81b573b +14794a9961ba4d80b4f308cc38f89005120bc284c67e670e35238a3a72498be5 +b84a88daef4ab123258918a4bd292bcfca94049ed9b7310834a0c6d1d1b4258f +e410beac79f5d5e2bcbec6206421358fd7ee8d5090539dd3565ac9cafc9c2768 +9d84a692b06601008390986d834cc44e0bac0c773b099501c02800247a1c81cb +85f8502e773fb41256c84725fefc59c6f39b3696ab0bf812c3ad445193b9dd02 +1efc04c8a1e13b0c6161134fd0679c029780537d6e9dfc33f8b30b2549e8ee6d +360d5bfcfcfad3083805e8ee6a54c4802c8e6629feb6a291ec26c9c393fa6049 +aedc546db31ab6377913737976822d44ed7d41325146f691604bffe6da0ca977 +821d9f2dc65e7099ad3a07b3cb2943b9d8e5380d8287a787de997ce19d37ca09 +2594b973b56e58b0d14977b4180f9753c6ba97e5de6f268bd0d9c6a81009d3c8 +1a0bcfb206e17104f491ab5a736429afa5954c1a65bb7df664b7922c4bd041aa +4a2a0bedb4fecc36c0589e22d20f961c43e19aaa3f372bf4536644c19e0b4922 +baf7b50b04b6f7e0a6702cb7972b82fdc443ffbd22144dd9a5747801c587ca08 +815578b8cb6580c773d297f4fd1c087564a90bdefa63ed2eea4d44a728c84d89 +102537f5fac46638aecdc4e07ee9bfe2981f5add3d96f49976bad8fedec4bd19 +b352cc3f804a5109f058aaf9bd6fe1808166155c89c73cda60287c9f00e234db +b787860ba0e02ed0ef5cd7eacbffcae54064cbf5f0ac568800689bf02341cfbe +aa1902087ced298dd82db84866ed704b83fdb7e28b43154084ccb8beb437703d +b3a3215417039df5532da395a2d5ba64f2c19354b5541390d58c9ad230675e8f +0ae43962fc1a40aee6906e05a517c949eb03ac9763a33c232b3fc0b728111698 +685cbc993a0868b467bf7df14645d70739bad8dd0e3b10317ea9df08ca9208d9 +b7491ab3732fc730bbb33f062662db76df5622999109e566e7470d2d3cfeaac3 +f7de6b3d715ee3055126843b4a3d0d2f7f4e671da66a2bf4eba18fb4ce3abd5f +2fec20771e3647980766da5a9e5618a36e0c1c1b37f0e2732c7e0db107cdd357 +005a12ee4449f8b57573ff8b1dca68ee16875845ac77e89b8d3ff57d046acc8d +6e8930a8484ad26389fb6dbf0df6ae8b1ed9e689b6dbf205e3cb24f89f54f6c1 +240c693a1289a36bd5d286aeb94452c7d1238db5e904470bcf411db0db9b1a9e +97684013ad8e8377147869490ff59cd008c5a5104d08ba192f96cf9752e3754f +3e7850bcea027eea59aef4b18023f4b364423087b56b4c22e3942d6aa6a16300 +08703e93bf8a55509284cd1776b0c8c40777096ce1dc9aa6b5fa28e8a0030d39 +a9b64b72bee43f829b544172668b358b3cf3432f6d838ceb488f144e4b500ff1 +45a0edae69c61b7e457809392cde962540f36077803aec3e5e637b9ec513b623 +830204a7f532d6ea27ee2c4a2969eddc749c0dfb0d8e059a9e18347e094076a1 +15bc162c4979ad89aaf5ef22a715eeef6aa356e39f53e122259f21ddfd91fac3 +b8b6df3c3e91644b30102a9e656e6542926c13cc8401418f1c6b84953e527c3f +dbe3e76e2edf034b63f68c1905409b5f03a2d5b1bdeb97dcb8987c06f877603d +0c8bc8621836c082310de2fac8584fe5e453c3cdd1963093585942eedbb099c1 +1b659943eeec493efcfc13a1628b63e101a0a40ffac0dc492f03062dc18c3665 +d0b7b37cb756fe6102bd8590705b9de712f169514b8b6aa528e42e36012e0e57 +1de7c4cbd8a2097f0b3e4d6b240983657044e7184144db4d790d552e9d7198fe +b3131ab841d51d2bae989ccd6525c6f8f52f536e9a8388a760402af7572a42b4 +f49f652dad74c2e3296aaf7b6005b5e3a8d95507c145744f071c6f9e71c43cb5 +7760b0413ef195db30aa604b362de810c56d438311cbd193e540c68dd86b296d +2b75aa450134ce06d0084c2b52e7afe6e061935084759ed8b7bca87e58985741 +53255144a2c75fe57209787204a562a2d5a8ab5e14816075be42e56a062a695d +13553f37570985410f780f849926da1470240ee9246d36cdc06082425e381abf +7707eca0ea73e1ebb268494b190b020cbfc46d54e14bd0ef6595d49ad50fb1c4 +13b1bdc640a3a249102f3057855bbef5f17f1ecee2323fcfc5f85ef23a75e114 +8ff0538bf1cee2bdd9535aba93abd484d837a88c36f6270241205a1e1b0f50f9 +acf34b5175d5c41d93d406a606ba5a9fa4ad177d73b2d8e830fec7280100b0ee +65329c638ca69430f227ffdab6d8535ea52cfc4b31d6edd1c888049499cafa73 +51d205e533ee0a11e531aa5b7cc7daef28341e15b6c868535afa65529ec1fb00 +ba680a5f9aa6f90db191db3c0a19bf54291beda8f02f73e692075e1fbd287bb7 +1ee34421d52715b3a1bef464d0af2d367dd6be9ea9dbd2926688c09ca1a0e1b4 +3261a0008201f1663d471a3d758b28f1c5a8be1e904502e34eda86d92b8d420c +09febfe3f294e01915a8feb99feceec3c3a910c53b475eb5330b2541b41c701a +d17c810a269767abd65426b3e95b33ef098ca20606c000a8e906332e25e6471e +0e7d662bdadadd4ec64b301b415b8b7adbed32fef6b484809c8e8bbb98d058d1 +e68fae1442178c9a357ef1239b8ee076c7a04381f92aad974589dc543a4513b1 +ff178b50671ba14780cd777efd5bf09ccd81c2ed6e3bc723596ecba121403fa7 +e832bc13e5a549c311001a113e6c35786a65e654f83527e319233ed4130d20d8 +c2bfd29ee477e639eb1493d09078266056bfe3cbdf1e3181c607ddc24140ccee +fa9c2774246f2c93e7e18822f967b2d67035476dff57f0d9fabad245c3f7e287 +351affa20a22dcac4e8709ecca97ce660172a5a896ec58bea7f2d45ced2b4885 +d27b124367b65de5397e773c2829755972821c8fc029d91ed777532a6404266d +c3e40c32358049c6fbcb6b6e0827514d8064d0787bc4e232465908ed25db2cae +e66d3160836f0ce4a9fe4c06895772f31fb6a0a7db32f965845a6b12d3c018b7 +321e63aed1d54fc0429ad1a022c44f7ba340a3d584cd587cddcff7fb299513b9 +3d4dce430e28af6a12515359866ccd441c912c8f4f1bccbc00a651688a909516 +567a8b6264da305812330d6a3482b2869d3e108ce3d7884d5a53d20a84f08fcc +359dbf9869295eb94e154dd58c6097a8feca591e0039cdee5415c768facc86ff +1784aa20e914f1bdb3938a137d09359d65d5351d5aa30c46d57444254fa97fc5 +2aaa91b4c5a350b5546a1c645d28d60c9e2e1c172810c3f522a6a982c442d262 +0215def70617b5facd0ff4813365e817c207163d58af491169d5170871c4e353 +2cf911c2393cd627c73d591b500206f420e7ed5128539ff74faa798ae990df72 +d72b7c724070b67e0c032b086b11760f7abc6ca32788fc0f382282fbbb30c453 +9a8f3c793cab5762afc63b996421411e25bcb2466f1a2eb451f20d49e204a006 +51bb615f14c511c57108d08139afe3b1caf4d5e26af909ccef2c4da1df7cbac6 +445c366d5ae5c8c3085411ab5c27a9a105501581c57a26270f809b6d6396bf89 +025115d2e8731d378815abbbb637d13ddb8e871374a58fef87c6586a47dd99b5 +bd8c4749ba5f1f340a8d3d4f237c9c5a57dde560443e1ac655667ad624fc9462 +c18a75317bd8b0e953dfa96871d6a00004fe1823264e04966227cd079564bc50 +13ba790cb1856b33e3b857a5e9fabf0dea0cfb18fe337d6a0566a72484631396 +e5b5ad7cbc0dea22cd13a8a4f077ba1872b602160a9adcaa68aafc759a78363d +35aac022ef55bf2c760fff76c16678bb74f3a9206a85a4adbf6b0e3bb4d3e4ee +b3558f6bee823a48f62071eda0c220023cdb400a28251a2677daf9ab2831bccb +32143cb4cb8ec6a7c437cace06240b09f6a8fdc7786f02af0ad7c27747495c09 +45d09871028c14ad33d661bfd0ef987570b10838af72315ab79c7e4186ceab72 +322b65635b9c2e839a610505a43b82f6e84a43b2b501e5f9727baaac91224f2b +b268351a72fd17d87e951d1014ca44199f828df4efb0beda1906f858374239ae +1f8b1f957b8ae1244119f72f035bb6d65385ca0ba155bfa9c97d176aa1f66b3a +ff9190159758d211c45ed2f1d6aa919409e7c89ab1eb46285fa3f062b4069319 +515e88cb84306a498a4f7251619a7b8c6a8ef6430a65da49563d82e908785b70 +bdc12a18d08f7edfe7dd8dfda3c2a13596e15af4570bcec1eeb14d29d5ff662a +2958be2cd3333c3aea2f91b20972246d9a61a7732b238ff9e233cf311c49bea9 +a83d354966d8e964b0518f0f5f16cc003b589a9da8627101e51cd2ff759157a4 +8a9d9de94c6d47f1579d021482b8eff62393b1285ea5e521ba09751b9b722d77 +1690529076e745164716242b6dd41ef4fc5e95f15924b43f75a8c689f143ae87 +f5e7887a9873697a8c4131352911a8e50004468c72482b7a38149e7abf8534b7 +2388ed5b8cf474b3a3b78ac89e840697205b569eba2e85e2f6416d41149aae6a +9434f7e8e95e2eda2c8eb78925345e59728da3310e9d5da06b3b88569cb7677f +f348e8ed02296d1c2d4523a0843936592058e916dfc0524a8f240dc760867dc3 +0eb44ceda8f3d98733378ad7b24795574cba77f641a4498102296c985f9e8098 +719c0992a5b77292db052593bd5b8020c8fe583a46e804c00c715f1004e627e8 +bc976f9208c6b3c19cecf6158f27a80cae345ee464b2eb14ef033be31ca9b0b1 +a1dd40d025d2fc0ec2e40900a596bfd205803b1f4341933e0a998100e343fa04 +9de20c2534a06deb43f8f3d0a2a65dc9dcfcdc052282ae177f478048b0c1916e +e599a29d36fa69075254e29ca1d158d8c7dcd2f7aa643a3a391380dbb5258d6e +75ac53529abbc2bd29c803285d2a6be5089fb84704291d4a6219c040efb8f439 +07261d057541ccecc7846a3b8710c47f35a490a5078a6b4271e429e77782f315 +90dec87f91023bb8c9d9626b8dec28f4f15a88ad2378abb01c8ed262075f6f96 +6684c0b0c987daf6f52751c00c45c390e3929e7364b1959d5860f693b2e2385d +5dbaf080163e6922b88824f632ca07585d8607d9e5af14980558e6fde1008972 +fb77980aea10e2fd441a0186461a802572a6fc72e64925d7acf6f60f3e5b2a93 +fa3c76bf1963936286f496bedc875a1c6b51b4edaef334193de9f0a4cb00e0aa +19de0a3ee0b1658deb23de3912ce82982f7666df1167794e707a5dce52c620a0 +7a8d93ec150f53f2ec22528ea4514f5e8b47159cb7eaeaf5ba779fa274e34245 +1f0969e3315af81bd0fe268ceccd1f20d7ea709a3af61ec7726863ff1e5c2b44 +5d6c1da0ae53a2e62dee5f7f1a518eaddd3a9905f4cdbb74f62a16ad2e9a3ca2 +16a2eeb7da59521b43d9b358fe7fe5b252850a292a0112d22be0377b6be31696 +e342592437c19cf0e5fbce729c395fe046bf9412a3fb11e6182f53ad1124e129 +244b19c5dde1adba250bf9a82daea88ca70fef20f81bcc21bb7547c65c89ccc4 +8a62a161a541a984e6284cbf2e1158f053561ba3c6da02cf176afb494d1e020c +dee46d50a8dc700e6b71742dd929207846dd02ad2e5eb5d0db70d6267305fe4f +d99c1f9f8c260cc8e521d2ab0aaf5baee24e2b7a168aeb971aaaf2bf207593bd +466fa0a2dc24f2951557d02af2de5a05ab226b2fdf7d95259814db46e9e3f069 +12ae5b7b5c93a3b024922803ef16112acb0a383af5142ac274010d4ffa4ee7a4 +b5460fc628b6e8ed5f449a4e879c8af7550e7ece8c63fc00b1f31a7905251a6d +477e0b9dd1b42eba39041a54db3ec7349280eb9471f09b507e2c878a5e9aa8d1 +3f6a0d3e127ada508e3685a272ca56afba11347addf873b229fac5b047e2c950 +258f7d280a9cb608639702ae9e78ab11dec0bd348a7b9b43a53e30afe18ba463 +36cd658c82171f41750ea125f7bdcde7837c36b8309f8c7ef757a08dd3eeaf4b +4c28d8308556afaadcfca572e9cba9ea6bf5ac682eb798bcd62f5e4d97a8c6b8 +71d0de906248b1b103f461aae6eb1ee2ee0283cbcbd662c94468128d61eef30e +838075f383b3b4606c160bb9e702c2839224342685ba8673d284f80858530460 +5b82b2d44ac5ab01b426bf49a38647870889fd8c62fc5c34d3565aa0ce8d74ef +1fb14c1cd8d6f4f1306166698b0fc3c0446cfa14c6bb2d9f6ed7d7361f8fd573 +d4e032772529fe2248699a10b305132e0b0e03f8c709ae75034468f3252be6de +c005ddd79a854116edcfd4e17a04e5f737df69e0a6347930dd7dd8cf460563b0 +e85af9fff730731f3778faf6a95d696075fa932491fee95b206b652de5e35a82 +0217f13e9b0cd0f7156859f1484f3ccefbfeefa8ac8f006299f7ee663a1da3a5 +142999b6b0520696a17faf2eb7134e8e2b37664686a6bedf2cdc70fc66f7e970 +a0476a91340719ac17958179770cc2c0e38a6eb46922af669a531aa0e927fcec +309a7b121fcfa2cef327c4e71ce6a7fdaa611a0db34ddf0ab5250b8dc6770384 +c49ae556dc1a613e98f20a3792699275ed4d187c87d412a15908b6832d95ab4c +865b2af89c0e471c46fbc6d0686b36af4b12c3684a7f45d7c2d9d9817361df14 +7c5e95c3a813daa7048c0028afd43bdafcba03c5c74309501d0494ec31671d29 +b30cb884d9748f0e2b7a8d4e3ec11bccf9a491905628d2c4b6b40f8bb5d0b9c0 +b0acddfc846d84487e9c2e7f0d82b991ab2ff2140770f2492e3908b6df2d86eb +b23af04389a27cb3ad0dce5528059a519a6092a18f3a2b035cefd46d885d4654 +24029359070136db35c346acb8b288d36dc85aa13231fce659d4391a8f5935cc +c8e47200f97c15b8ebb5b8abc023d027bb5e8211d0595548e0c95ea47bebf498 +76ef585ad3b76331c75fc41bdd44d82671ac32fd665bfdecffd4b8fc61255e34 +58476113b59bec5aa15b03d623912276f1ac560c0cf18bd9043aca2c28e805d9 +d03de88dbcf10aa9d7d0b1cedeb5270871f632f7b703fc8eb5020e76a638bc75 +40cadbab7cfedceda58d0254ee7e8e48920b21a7cd38cc350cc6b67bacf468a8 +a246fabc596a2675c1fdba8cce35c28655d0e82755fda8a8b5bbbdee98c30d91 +c81f08cd0f809e1d55a046158365e04f224656a6c46a43a3f79fa2d55cc6e420 +fba22da808c4afbb03f6f7b0d33be67f9883b30a1c1fff85f78badad279de4c9 +77f1d9f16a5b9b7dc8abfc85488f117a5cb317fd5c84fc1e59ccf695892e6ef9 +26dd71c9a6c342a877406f0258adf45810746c1454627eee0b7ccf94ceba76c6 +7f1ce137f97ee6025a23ad42a4cfc2ded9bfe7e206f31a63e65bbc3e304ba088 +4f0e0738675e2a4535283045a69ff637ad95c9e0b86d834726e2ad29ab3a03fe +71ec91f8c8564ccd0069b552ea28867440145f767db71486d2e38e5a0a3c6099 +b6d3b57ab4513a0c25897b46410c783297a9b280f138bf91bb17f4f5d5bad5e3 +f858fa265cb1c1b0d0d9b84426f0ee6e4f5ff5deb2e50ba82d3405de51fd265d +3fa7396ab39ddeebf8bd2b61af0090e349863e88c9a5a280c4693b6e80b88aa2 +e9609721b4747b18008df3517ed1331f1dbfa46b00155288b7783862ea9e6498 +52ca1ddcab6c190aec0e25927e8526cdf32030cca61f071325cda7e0dafacf8b +c3cadc3ddee55640a7c627beb2ac0cb38e3bfa38f9c3a49cd7a400be740d5f67 +e59582031ac46c467fb35622ccc7b627718f858abe34a43e5734a74681ef229f +757dcbdb302475577d18d5cea044dcf3a8026ffdbde20a2585fc84bf53d6504b +ad3dd458ea271e5bfb498f9289849349a0c8935843db2382069eef873895c978 +341bf3c1c9535d13ae4ef05f135588edd96bec9066045199a8e76582dd9c957c +2fdd24cb36b53692448ee0db7b1689118fa13ad5f73107bf0a59fdb32a958438 +6d9ee99dbe469d3831f43773dacf2a228276d076b9144d6b70b315658dde76d5 +8b949e998c0f4e0c2f5e2e888bd316001cf0c981e9c89f69ab39c6892f658eaf +5c754c0fcaea82eeb8a443cce68fe5cbc857d99df78215f00b222f799130b7e1 +8d985455482cdbf5b9f8eb096fb0966aecb5bd5394f4224d85fecf80632fd858 +ea3aa8bcb7834df7746ac013d8b980eedc405df342604a8f87d92ae38e5f758d +4ace6d05c933347a85e08e6b796e6bb59ed8c7fb72d1ac04dbf57acab8875e08 +a5c4d4092166ea473dfa9c3da7e61c53b2249515365cc89ff4e5b6f4ab5d2514 +9b2f24ede7e8adceafbd8ef9d01a89500bc0ed3ba5d691dcd4719f70527ccf01 +ad15912e288dc397de28a0ca73837d54ab4f67e36dfcde2d75bba41fb152b312 +0eadd98894d332b20ad05436a75d0874a18fecaff6077db4ced96a6e91c2e4f4 +65cdc8e73b23299317a7ff4b4304c34ba43afd9768200e141a7309eb837223cb +be451fc43db69dd2cd3b1cb6b5e879ddeb6990f19027ca2d15a90d11d999e519 +d7ae9f87b009ffd95c5d3b5f8d0ac22629797ce6374451ce62d659ed1da0a826 +26ad8021bfb2db4f00f81b8e524b217e3347c2f93d9140e817c7b49ee457b9f8 +1f5b49c665ab2468ae83b087f3b6454913f8498db5d8f2ce02af56f307042c8a +290bdbf72c24ad3678e0c527129817dfa5240c03ed78153e0cfe712f301372c8 +bf4b82df2ceaddf1b819b828af9bd9e595009c1d96700a14a2ba9117a04dd425 +bfa4672d7f1d70df323fe6efbccd582ab3154358212cb5e4d1938b097185f53b +8da80ba35ef2bc26b88b8b0df9eecbfaeb6fe80893eb48da291b5b6674c009d4 +b9a473c4e191b673d693f865946ea5c448109eed42b054cbb3a8b9bfc1b30b3b +d021e90f56634c81ebfdfe6d00c97824729979b3e58481a0f6186093e4c74807 +04ad223b1a696fb51777c5695bc106ce57811c8ee455006f60bab6b6c43f1fc8 +c524674a638ed65aa0597ac1ed7052ab3f3caac9e62d806ea31ebdb359b005f6 +75c57cc36147841fcfac56baac914cd697fa2052eab5bf27d035f65cd0fea717 +ab06306d5901ee083f929cf13afb5a54d000f61524707cdc090cba1c46868502 +9b2469b0a29ce0178d61b66ce2f6b56d8a3d725687ee03611ea42f31f29c281e +8c4dc1a783171441278cbe383473f7f6eb4ded8513c5e14edb793bf0c98fdaf1 +1e939330122543d2725d3e700e0dd8205e8c1d16bea0314f5a1e993e0bd1892d +cd04efc67b855d03208086dee33d0297a853a1b913e71c7dc495984f7da86818 +7db70ab6e86c974a4983ae863927b0456534abdcf265133c00c42115455dc665 +6c1c683a43b373a1602efa87f4b3a1be04da20f7f51dbad3af313a5658093b25 +5156bf9693ab3ba5ab071cc5415e1eaa29160f8090968fd9dc458cc8830b500d +14682c560683dd5c3e2745bd9935886053181ab7d323e4b993587605ada1d9f0 +42473496e8e09f9af27f287c29fd4607a7e246fa3e77666ef78c0a0ce9c3c10c +5e75ef7385aa2078d8c98453449869d40d39a720e345779b5e20a3565eb47f78 +48bca3ca0e04daecc57db1a18ca96ec60b6ef42deea17246509dd81542f667fc +6d3b808075d84cbd3ae5821ea71310369f5b31c13eb0d122400dcc9cc52ba85d +6a7d2290af5e21268eb0e837e4830bdfe930ea91d4dff36ea26b2c4547437336 +4f5d8fbbb4ced10bfb1f3afa9e804c31c08057140e178d37408ee6f10b1f2054 +07839a09bee7931628b0720cc62160b3f541b2658cef64da994bf8adddd663e9 +668bf56e93e92edac17b9468bb02b1d90bc4dca43a508cb33e6d1f0ba5ef0f3e +cf43109894b73cfa7484484cf3f18451db8c0993b339362183d42edbe0c1bc76 +9adaa253eaecb81286a4c9ee0a89ebf9b85c5ea0198dffa514a192fb872d15cc +f70f773dc58a8f1f05d710f1de541327eb795bd5b3e5bd01dbdebbb33696242a +dc92a04dca1323151227dba59dfb17835f5da70889940e3fb886ee4453bddc3f +f02944799dfeba4b46272ae29aa6748e5408b90935a481be47303e5227f2e230 +5082fbff2bf084a05546d32b918ff8ef71ec86132f28a52777189ba8d05b1d00 +b08f9a78e37bea0b42ea7f48f53be4d72cef03c72ec948a4c23b16e7d3b54ca2 +6cc77493f5f2a767c0f348a0c85c85c544b0c24709e52272ec14fe72c719ea24 +61a1a842c599d4e6b8f175eea17429415bbc70b71433047e73c2ba5c4998cfff +30172a45e39f7fe86ad780ec28b9cabf4429b55ae8aeb38d6027922e985e725e +0a4aee85139bc1d3532e00b80b389e9d4c8197d0083323a495aa6ff75b613bea +94ba02977f79fa5752418ba6b1f4def3e66440985c525a581e6b75bf81997f9e +7d49bb437b500aaefc8423c1ea3aab735f87f7a17958a20e2de998148f6d777c +54ab5a128ea1c37e65d14f360c671745a2911313d174f12214818ca417e38670 +699371a1f7ddfc5c1634bfd34ba99cfcdb86daeb368e5c46d79b974b609448d0 +90b832c1f958142754571fc98c9cd0270fabfb5e8466ccd7f34e56c52d086161 +d6def2b38cb28a5126a8c0f233cbb7e5b4bff2e0eb4c8474d7e0515b14fb7702 +5fb5c21ccf4827952e2e20757ca37afcba30f4dc2b7e9a66aa9ff34a1ba94156 +da92b255835e8c8dcf8c054393537ed4b9fe616b1fcac41724a19abb7a1541b5 +d3e5208363e42adbacffd409b8ed46e410bfbde876c1b77fdff235bcfdcff0df +65998b975a24e2614a2a8ba89c2ab9f41469b409ec9e0a5c4234de73c630f870 +36060c9f9f3111586739972b638da804ea935ef2e74adcce254c9efe1bc00667 +9ac610b00a9c00a1e3ff36f5e982504f2fadd1d6c3d458819bb0359daf480777 +4d7e2cbe16f16afa47155c1cde36125d5e89432a508832c13fb8c7fd5ebc6440 +49814c8fa01838117f6d298baed8cc1158ff99d0a3a6c8e5231fb6aa4db98baa +216a556c04bf0e6f39c8c30f39ad1ec64f4a0db2827652e8d354a821cffd4dca +d23876224ed57795ea129d045e387a45bb88372e47757a16115b9ac149ccbe30 +982ad2a9207b175d2fbb72752e8d3dafbf4ba5c02c2dd6a15fc0490dd0f6324a +ecc2523ed53e2d5fde36b3acdb5609d70809347bea983fc6db80888420d82722 +7d1d237567be0c9c24a585c52fe3cbec727823fe2ec67152944ee35a65e7a005 +37e096939e42099a3cf73e4633cdc85aa3b4a2511e27223e0053fdb65eb85df3 +54009e474bda07b6a07da75957e621bcbe7a1e9d1caef92565c5a6c73664abf5 +fde175a64314f6b166351af7acb166b6a0bf596288a5ab613b80db91ff50f7ca +17e99d41d493031d1a5b5038303f091153cd08300ac6c3cc15860e33fbb3394d +e4b383b97b77d8ff0c2707fca55a838e0a2b5089fff480af5a50e6f07b29945f +789aa9333211be2ea8e425e00255f5a3725cfece8d262202a73db785b39e3188 +55abbba63de9c53c24bf11125f6f0d3b412f777795ab86c0cf9d9d43a2076fe8 +828085480e7adbc77fb137f8bd8cc8d26ee6435e7e3b2511e7a7d7a19d330d17 +e7d797061428bab2e7c290fedd6c0de9bdc2c5b6b2496b8356593c570bf8eca9 +c5aabe89434de698fa17ff0c08ec3cc13b60b4c3d3712df8ee02ab92a71cadac +3f4cc5e69aaad92774edfafd88d95ff90c9781d9f771c143b9918f554e3b3497 +4f822ccc3e473d345c7c598271e59456d2b1f75560fa36b02d75d040c23fc511 +506955ca16901774f7b4b9d2ff9f4e0afd79fd66175c0dc634e932566d067fda +e40a710edc1c893e919da8baeedb4ae0f4ecf0ede9f08e43dbeac3e62c97fceb +c434c60ba5c80d15f79823e25563e2d746baa0ef31ff6826c120ccd9c2323844 +9a48a624790b757f9f8c03e1c447c16de51104688d79c87461f610af5daed900 +748acd52bb3eb9d975d128adbbe794421c434cf21d0b07c33427b81a6d8a4c97 +49e24142d669e8eecef30f35a96390b81ecaedf8bf65edaf9fa12adbb895d631 +986008fc95aeb2df5dd57a4e09582d9ebe82c685c856769186f36433400f1be0 +1daf022f7c217099e520d05ade233feaaac372f2e7f2067119925b801698ca24 +12976934dcd628be992734365ac6b522b098c7f3d788eb86f045c6c9fa7ee89d +2d84a923ec1a6de6dda87bd949867b2a6d6f910ec58519088ed577531c624d32 +bc7c62116630a4ed7af8927fb6c4f4e65f000c69910841fb600e1de1c6a23f5a +a2a5d199d79005294c66dc160c38a880a11ec92942c01ff8ad5e5693f132b238 +12c90045fa8d0b60c6b868f0c7d2a27815e196438c884d2d82222125d2219356 +555f8a67d48a13b3662e988d03a2dd3b648162884b715c89d7021be05917ea43 +d1be90113ed3b3af434ceec723ac4cd314527f560bcd83e7cb3a764fdd8f09dc +f1f1f45fa4a47afa6401420b1a2a6cc0f28cdeaa0c83c6cb35fec7ff2e432270 +78d283f79547d6689b5450d02fd13ba6096e37b08ca096d942cb94ed324cb63a +55c9f171cc29eda44d10545dfd8bcdc4afcb26191f92d0c61fea1b106769e9d5 +234112650aa8346eff624a259f3f6833997038e24fe4b74c459b14841e2189e6 +2842ea4cd2693bd162a9e90ad5ad3ff82bc6ed2e7978093b9bf4caa1012e6843 +5c34f01c470eb39483e22a1e67faf26fa74ab7434a682072ade050e72cc73123 +1505db7a7b2512ee6f8cedbe6caa06b939a440c9e5f0d5497611c291fadb0948 +1b19186861938233bc62228b15171612f026b677601715bb4c5b1f2ba72db37f +d15c629cab69bcd96ad1a6ed6533b09cd3f6049e6d214caee58d4ed72e9f502f +9a9f5682398dfaaae732b6306076deb3921685b419f41593a46e3cf4f7de9352 +950d1f0a6843175138e8589d22efa6c4996098ec3946aa1fcb1245625d7c4e1e +d18abc806cd490f103da453ccbd52db6c97ebc5df69a3f94229994bbcab8805c +975b57fcb6ab0221a1c1c553cb64ab882cd3ece7da6b13b0505950c5d58ace09 +fa7a0e4ad20be0733d9d540918922c588bec42902f9f8278dc0d6729a31c01fe +7f90292b8c5c006035ff40f28498f88ce4d9981abb7c9c80b915f8c12062fc89 +2d49b55e06e3d1220d1d29c7844e96c259bd806ba601a6e6a1d9f34f15f8e10e +945679f99ba204fd1b7cf84adacd615e858dff1365aa779b241c58ca6d07ded8 +81dc8c5cefc435b9ebd7139879674385c860251ad25d08745165e0aac6b46c61 +49fc0da7baac61ba658ee976689ae42c13d2b36f2fd0b526585b6098a6df1f11 +a3943366fab8eb81c4fc2f1e510b4452d23c41e47849b1f15f992e9428e8926b +8a28f15206802507f5dce36de4cf257e56dfb6edea19c9078658c32212005db8 +5eb640885757fa5fa468f7267fd0d89dc2814828c5b1113b7b276093854b5fc6 +88a01863a861c535e227e98949aa3db4062f52a88a0dc7ec40d7c8a92e972982 +a0f7f6b0eff29154b5d0297ed270948f05fdefdae6126ee87a8baa0469512ab9 +c2ea9ac48d5a01d9160a3e38eaef6550cb05dfeaa33ade4de76f4ca4649c69df +2ea79a0f787768b7300bae785977076d4777bd0c76e7bc23f90fceb533dba7d0 +b9ce8ee3de306315527bc84ae9a14dbae631881f485b88412a5d56f4e69438af +33ef583f8e6516b1bb7414318cf785444cfe87ccf1a31af08f89c574b8394a0c +7d260ef39f50feb4df3121ccae4ee370cb6a769b40292d559de8cf00700cde64 +439eb7ab50b0547252b14ea1c88fe9c6f3b5ef5ecf8ccc010d488fc3c91c5159 +e0baa7afdf4af77778331e7ece03d8aeb6de3bcb9ef6370b9fb01855bc68ac19 +476a442d3c5aa77f9280e04ef51960b53492665b3a6d0e5d95bf545ba3b1d2f0 +b80cea9b814ca19fa6399e2e93280ca1f93a9ff39cf7ac04badc4adbe383fc59 +e81c19fa691c829cc5fc63fc56341b724209becea74960adac6e033e07838b65 +20ef9a40db38442544133888acefa9a6fe282e745af83c5e9d9acbfd2c73df57 +7245f691e3012c8ab3d9aae16adf1791f2de33765d2697a3c9cc01955d138831 +87b46d44db880c7bbfb5f9839b4800c592ba0e96484350221080f457c2ff80c5 +4794387ebd07cdbe2dbb0099c078d7ce26c89cf4d47f52b5796a6a861c2c3bbb +c28fc7321993e18295721898a059af827be695a1466572488fff3b00aeb24306 +743bef6b9616e0e69c6c123a86049d2038c9d58b13d43da51f4a31b2ebd6f84c +c72ff201ddba0047d6bba501edc889ba84bdbe82845df10f6af17e8d32cf3c39 +a8e9cdb6fee684b9053ac5bf867867745c661b4244a6e9d416b96c9e7acf7c7e +bf3e65a396917f5f3362091e221f30194efe419b15b01c2c172dda86af46b1b2 +fc5632820d48e1292694a3869d0550c7256eea172fd2c2c51b52b6a9204bb040 +6aff5c3ade4d44e7ea6b259aee7a2a196f96d8df445f6ba0439787a2f9d56dd0 +b7e1a48bb48c564f83397e299bb6e4de0a3ba3ae171095e1f29b30dadf456031 +237754be8fc42ecd1a5c2c47ba0a4dd454f9ad43b772a43f10b93b9f21456aa1 +0a6fdcb3dd43c9e9fe0029a3d78ebd534f1f1373caae0e69cb63551c80bcecd6 +ddd726fe1b8a10d46e0daf9b028f13cf4f2e248915eacdeebd403397077143d7 +982fa3be9b3690f299de482d9d9d30d1a3c73fc0f77a5642ea70a5a738c4a203 +a0ee361178d65dd9697f0ebbe7c03945e9797c2b4fde79d251088b54dc011dac +2461d15a29f76fdc80e3ed21625a1ce5ee5848b32fae9fe6db0ae668d5fab8d4 +65dcfd42cfbebfaf42b5a2a604c429c29031dc86fd90161e9d25f7426e485171 +d6db1381147bf66d92fa199377109b05723c5b2dabd5dbc157b89b7965b07dfc +bc1271ce306d95d2c75988978114e451e07dc5ea5a0a7ee2c4b5b560d8e63661 +52b8175c258dbfcbe57fc8f1369238118ec7c1ea2c8183a6bddae0def782d71a +9f0e4cffdea4ad89fbbb351c139133936b7d8331f17a14faea91b0fdc69f7b28 +c63c13383f1bd915c08a74801a12342b690288c0be035bd5001de092b0b0e04b +60d56735d50b99f9810588aa4231fc6c7ceeeeda1f5e420c6e8d01a0db4b1b09 +51057283a92739d75e494c69ee7fdcea905eba07480addd991fd2b7f066f84a7 +bd6c7a24a3f7632c0fa1965b0491dfc426e9efa2dd53c6cfe9c00bc1ade9b3f1 +54943704d3ef3d40cd97ff5c28cc2ac0709d9e765a06ebc729f16b442bb7eaf9 +6b8382db843cb5ac8c3e404b765ec45dd2b4ed24ba321d019592a37b2ac208cd +450dc7107b57a74e9b7381dab65d48548c665f7c9aad56dbf5d8bc64074b186f +abfd2d574801fa6ead0e1d00908456f361f17ba2c74c99ef7e26b7e8032b65f8 +ef19777bb992383f1f10d363fe7bb8ab7ce8dc304aacd1b6ef1b6b65d2d41d83 +0910a514c3059bef3f677b92fd2601917842f9836eadf6cd62a1100855bab14d +225c974eb123849a23514d1f50c622b258e59cc367d6cfcaddf27630eaabffdb +5394b86e724d634868ccc7e7991bb2997631f8fb35ef850076128d65ead586a9 +95cbeacb7e6de8edc0b369742cefcaa38775275a17a6c83d0a81e323fdb8bed7 +05f6261f7976f6f505f6c97c12f80eec0cd381a048ee9c7a8a05595af297dde8 +79803975697c31da784c5ca16c668d3b7503b3aae5494a4d631929870f9e603a +38e311ec4480e366c79d4d03c533277c4aa585f99a32475fc691c2241b00ccbb +c55c1e9b14851f815b162cd057f1bf85984a3393aee38c0b9ed3e9722495bfb0 +b13eac7d28d2aadaee2b280e48e5179743528efd7042ab6b7ed6dc2f4efbbce6 +ad43c35a3a0372814b1d64a342ca614d5e601827c1c18f8a347de9573b1f55f2 +2a3a3d709e17f7727477a45a4fce29efae3e16b80b6df52a4abb265577fc4178 +0ea7a98238174222eec322104e04dac53af8867b5bc0334b02f634602191d4b4 +960b4f482c46862a86e02f4c0b496d1a8108cac762022ce6644b4e6092353146 +c9c42942a74869c9351b3101bf15421a95a7ca34158a56e7de3a7d45d4fd2bdd +f1f5b4e5b3bc9f7320eac4f94655e8a42c7799314376d6fbfa29fa8f836a83c4 +c1fc3dec65d28c408d8f4460b12d6c63a323c0533110c6b6809d1867110f166a +3b41da821e59fb8c8b75068dcc4c8f8db77fef2e5d5cc965cf091b9f47369fa6 +1c1f5f5d501b11ccb9f43c3235f94cd287b944ff7203034f0985bb163054afec +484e0e6046aeeb50ee74ac84186027cac9891b1871980bb94de61a47c7379204 +cd8662b17cf066567c9bba779f76edeb13d2ee996655def66a0cf0cc59659cfa +e416a40ce4b7ef774185e79c76545ece7c498db03fa717a591f9aab08c167ec5 +f2b4d9bc25478aa6697d0edde31041f185c965b263acfb2399c5695e42901822 +543f8830ea58e49ec7189ea0b6bdbce349ec55346fc238a7a6c4cd6652c6c30a +b5c8bcfd382e6a1fcb1344323db38fb9829e4ef506b21fa5b6d58a92657c05b2 +09adc73d93897867cd867c915cb7ccac7f1170f9a6c555ccd4a097574501b6b2 +565a57e5c1df5adf39c5740ae63016da9a566d7a830ca624b5b4c75685c95000 +5de2d662500107686eb62b3a8f7f9f72bd6071c85518741da3b455249d84152d +a165aca84daebf9395d469146bd4e35452d00f742905c9a47ae2040e136e8e62 +38dd0e9c0901ba3a9c3216226c44b1f80e41c212daaadbdddadeae082b016305 +54798bd555a251d380ef952d085457041fc51dffb6eacd582ce2e7cd1df623cf +9237da7c39b2167c7463bb427a7199588a6cab503aed16238c68c250ad9f1293 +b4904d843ee27e2c1010ec9f4d1190a11d986e8ab56ebc5615134d52764a3ebc +a9aaa1b7d5bdd1ca23bcd8fef9048c4ec2fc1b60853930fe82c133bdf9021102 +15ec5dca1d137a14e519bbc2e35f93508753fbead6543c66d40b28d828be75cf +2f2d3e116b42ea71772e07fe42f298945232934fb85f9b046e8fc56d843f0d5b +ce1594c5bccf37117111cb497c1532afb3ab347e3f555ba63bd47525407004bd +8ac2f37f632f253ed4bed95afebe62f2316c225f32f1ed41fba0f84d49cb80b3 +cb5503ff106053ea70540e3732b4474e5b6e1d53aba1b8ba36b1116d2516d883 +aa55e8401226b175450b8b4f1ef18d55e377f7b40f305a6df691d316a0ef17f3 +8cb4506398258e75cf230bb26523d391fbdfc331a74c64fd06b14441fe966641 +4469ab2f3ee113716cdf0415fa646bee2afe4dd3449dd1a38f4135ee5c4c83a2 +4faf571b0385d2a2a0b61fe9bd5a047999028fef216f2ba0dbd678572790f66c +c575cc82c4825aff3b542499519f82f4d1833c2899b5a46e7a64793c291c7238 +da8d2c0c7ec69978d3848957062ca371c8808f6d3244844d54a49ae57e92adcc +a97bc421d8cf01e3e2fef019fc2d9c3ff6edffa264e55a24fd1b7c32f4a86285 +3f9353aaa19e6918a3fe84c798e019eda844a5168397bc875368dfaf42514a20 +f8123edc760c20356bf81d8230ceb04730d5d7ab947ed143b6c3c772350eafdd +9636db454174c0de1a047f0e30370cdd4cab9a1f9d8d7f99abd8494ee82836cf +c73cf595a2a72807f133a8704172c069cc63cd317dc20d28e45d6690c25949d6 +6bd3293aa87b0a93d5675c42636a8837b71fae1945023db866ea01a774b5c2f4 +6ec4b86a3055327f28b179a6a93087b15e7c6169b7053d76026207c41dabd8fb +bb17dd3d49e63686638b4611b43896d1c7697e352c976c26fc58b4e1e08df30f +bd25f93e05f58892bc7f07c4f739d16de447d8eb84537e847926e39461dc385e +f79c2ba9327ca12e7033e6df84d8f044b57881e71f32d52afb2b0e61975e730d +a21fc31cce5aad86c09c82b7d0b4557fb79feb7e1ce6d98d26a49e8160159023 +4c5da702c3feef7041b5dc43ecbc8b2d66b7c33e5008a4d171ef828bd96da0e7 +4d8389f04fb4eeaf1f38865a912142c0eb9934dda5c4576fe18251eafd7608d3 +f35319aa2335e2df4a0aba8a246aa93324dfc19ea353fe27c47628f377259a19 +f9f89c599d11fc306e7181d35792401f9304662f56a2f3e44a1281ba24f4efdb +35876d8bc31f5e19dbc58ee35b98282167d21a1069dc64ae87240384309c42ed +ef9dbbd68dbfffd34c57a001aea0c91c36c2c8f422cb09f9456379f450edb717 +e7ab9b36b451c27f5bf10f018e25c57b1cdf4d2124f284b3f0c396ab3c806506 +ac6cab227e74d19a593671ade70455869614b5296d8768eb4d390a2e644b4ee0 +46a8d64d40633575087b3bafeea233f8e7f22ce22d2c190a0c4301647ce67668 +dbaab051719d516cd4e6e7f8c2b9557e8167c78ca6ca1cec05b79ab1ef61975d +c2511aaaf3f20e393099ccd20ab4b022d2b206d9cbae6dbdaf96296df88f0092 +aa318348201f37a5738f17b440b35e47d17f0acb0d0d255d2871dd5dc43081dd +4b0f9390af189582d2d9b39fba9644537ec6e1725de83991f190b5fdfef310b5 +e8483a7a91720758e329efc146c95771b2439bf2607a3f10ee247fcb1b7d5578 +a05775df4bc4ce1b59084f5e625e26e11243185d730fb8931455c3342fdaa91f +7093b21bb911fdb04469469404dd387ab3a61fa4a1347be3c5d69324ff67c6c4 +b6de7d8ad88b287265a9609a6266b0d9146c3a3dbb0a3c9dcdc0d6f04d48a247 +df9ea9ac5daebacb06628fd7c9feaca1d71c058fec7eea5ba7b14bba8c5ceafa +3b81037a197dd21919d6028849539f2be815d65057d23018049f2201c33608f0 +54f358433c3df8bd7c72f81d775f2a86ed7edb494db813e6dbaf76e405f64a4f +cb3240348612e2940b7531ef8a93a5978faf36e37cbc1a02f2b5e3337fa2fa22 +91a9d6e9f9969604869b954ced43fb53ea1badcd0435817d1fda2e66552dfcff +8acb5b5a5c819906a8fb02cc97f613f8400a9ab950e12d71f076807caaff259a +e63f0de2c096a63eb4451e64a4f904162252f398496c8670b92923b8f7bc4f40 +a53e324f50a66920b4f9f9239dc0a3da083791fb4e524d2c599229aefd8f64d8 +34ed26ac3f7af54ffee427e4d9ec3f8d7d91d4978d974be305028d3a32954d4d +79f64fd4b9bb74596c6f6d17043e104c664f42c70a3f526069cc369abb2608ae +ec16a11b0a8ca8095e30cccd7df1c4543f9e53c3ef8ee191b3213c4e641e0772 +d85601019f3c9b6f94692e729b87c5de209a92dfd47a478e7580399d635ac5ed +0bab11cd5b969e9af5bf1fa7d0865a518f177c77a8631784028fec51ee1ac336 +fd2d1d9c8c2fb4341187042ef872aa168b87054fd265885f2bc0a1332b3e406f +259103dcb242f40a07a5de136a06b03d3ee31d6a5f385ff1dcf76d1a996cdeff +76ad2f1dabe5e2d2ceb334ed78a9aae6c6ee8f17483a8e7c61f7ca4ba03794b7 +3582a8334cd5545eee22aea82e0b31b0981161abf1611c2e350f4dfbb77807f3 +3d3536c51f2a2b83e3a0f9b7ed72de16fc6503e9d8967d83a557d662062036a2 +7778fe6c9f521b3163a2692d16c4eff90d5fc06c69e98a4d2466a77d28c80c96 +5287008eb275a93713a78e8d542d4917abea24d60a0c90d1921a5880aa521fdd +65a16bae6b72b82f2b2eb2e46ead1ba9b9710b4847a0ed217bf98dafd5759478 +cd3e8ad681703c00eb13feb3e5ff2761455a70e0bd9181ea6ee4850b281aba92 +0d8192418492352b2c7ca6a168915de1951f774de37d63ebb033d774606c5d4d +b6bc72a68859237c5aa77421305ac6fcfb6e555ed3f52c41fa177ba49aa31bfa +fbd4cb3f5df1d87df5f7dd810d8bb6ece0a8db60385f6aad7d9248ae8eb799c0 +9e4bd4d2e06ae9adcbe4f5d4b5c8232aee85ce60357a75886f3ed6f6e0082879 +c36c45d57707f76f8bcd1f472271a56095d05f4ced5ddb6a72bf6b410c7cf0e5 +c6cd21d8deca9f8ab7dc08efc69e5ed7925a0e531eff73aa537704db9779e83e +097b9974b9d697521ea6b0f3a76820494608dd21ddf0aa164bd9830db40efc9e +2c07c02b4c7236688d8fc135757aafa153e75b8bc3636485112b5bb57f01648e +1e69d5e9e6ae84c2a58cce8011e71a7ccea36b8efac02f75cd506b402365b467 +ec1f9e60eb81169f8d7b676ed8fc4d5704b8d06eab192939cb570e0e0c2bebde +3671b64dbfbcc5376e1464964d6e05eee27abdd36e52824d80c74cd20795f3e3 +647f70416d394c89bdb150ba20bec76b2be5f157d1a9dafed474c521a214769b +4dcba56bac771999b3d3e172be1133d91755234a8d277b1d63942f0cc3933acd +641e40287e5340f8efaf9d06715eb2abfa57a7ec2791b3fe2bfbd3f939cfff50 +ee4062c9fccef2f3296143190ab4f34cbf11ab5fff417a6ccf01f7a1d7b47b8a +4ba4dd923b0621b26944b513e530352c92e0f783be39286ab144ee76c1e57088 +fe62f9c417eae4770fb7e27959fb74e3b6b3efcc36f96a5342d6ee780db6397b +cb0478b4f1f8245bd8465850e3a83816697eb16163b7d78d9e0eafb40372b999 +e173293dfa6efc2516703d13836e11f407113c49676b16f43b4165731a4c0f21 +01aa6f3a89d7f5fb743c1ceb44f97857555774a63b59f96bcf03c87b5057032e +4c8d1d6b768b7b0db5e444116be731e287ac0a13bb25e8143f15c493c417f20e +be5217df4041413f59e33f6dc1737f9006bc221c6458b1a5c6d42da46e84e3fe +4db8b35dfcf7c0933d4c1c977c5edc7d89185fde71534e2addbf635b819bd48a +595b29cdf59e590f2eec097e3241d78fb27edb9f2274fcaa3246d0ca18e4cd05 +81e45dbd0783362463adb5177ed036e6f17f1edfabeceaa16d20a176968039cc +89fd7902947fd931a080e2105f50ae2c865c1fb3629f22fdfc4f5c0f21dbf758 +56cb817833d0f510da858fd4bb64e91b30705114a2add3f3e8541a89825c9d3a +0bada8a21626aa329875c9f90dc92e4af23a7d83ddcf140888e3098196ddfe30 +8014fed9451558c2f74b1f13aae39a1a0a50db19609b237bc96fe275806f2e13 +6c8049f38fef87d5d0dbcd10f232476ca4153bf2bb3cede4102dc388cb05caef +723b21b6f6f2d6731f4c72cfed94f77bd76efdd37bca46c9f7dae18c05617a3c +1941d5bf77a25169e19f0fb50c5335539680ddd39e018600021856ab815e8bc9 +cbe764e4e06c8f7b20f4f84d404423e6ab37271d564c8f3eb1b1ebec03de7c3e +3a68be5edf58414076716cc454bb971c4d7e09af1c897ab8a5091024ababcfb2 +43b89e13ba6d3af800736f9ab077641c8be2849125ff20f3d760cd52d5bb6518 +afa9eb41b98094cc129c790094c6ac076e758ed6d1dae764ae66a7fba70d2671 +92afd13be3200f95432af7618203c6a28df7453198b8e426b82514648f8fd0e8 +79424287eafa66e276341064bc42dd35f670a2dd82d2c41021531532e4333463 +c95b0aad5247ad3b6f1582f2016e94bf1f9dfdee6a28d74e05dfaa5f41d1bac2 +fe4f355ad90c24361ca11c24d9a92203be1fced536bb855777a0065964cfc86c +d3a27f3ad545fff70ce4921e4479b61281f728d334093f90ff6f33b0135d91bc +684be649b6db580b1d34f38a491ffed9285ae4ab412b2e1623c8b6679422cdb1 +2263bba72cf82416e151f47fe4bde170ccbb8523459d36ef415903fbf38c4834 +86ec72ba6c9a02b4827433d39c27d3c7741d8a9dffed007cac8157d6e3145788 +45b0a5dc6a5c627d2a1e24b351d93e2dde958d206e434379cc20e4f7eab470d4 +e1159aa0e714d3d4191cd08dd45457319e2c41198923c8cc360532ae4f640b60 +7244c08e546c85f9d077e2a249ff2ea24a989abb69e861f8e71bf788fb81946e +bef9d0b05804417e75589e89d2b8186dfcc79b2511c810a4581334d6d215effd +0e8ebe5425d92eb19022582ad7dac770c36c3d6f86cc2ee279cf432196ea8eac +d3514db0d7f6c59e1a68401358a2d5aa8b80259afd002e6975d86a1b8b2bafc4 +5cc0983e4deda769c0fce889e049c00673ec87ae17f1930af5a5e2423709c2da +49f44db4dfec3e00507d4779d904384b801a43a15770a40f10752d29e14c253c +f4e2a01f25b70386667e7e5b2877425502df89a4c25b9412b8a1abc432256a98 +1e50c2e2c7527b6219d0413dd104b80e9d045a4f6e8507f0bfb37339f864988c +b1f62e3f68697b2cfbcf63178ef0d7cd564577d7a4d0517eaf8baeb8b81b5c42 +8273229f9013e77df1bedc6f04f380e3e90f5edd9c81c416fc78a02edac32ccf +a01c5d8b6664fa08dca3d10b9fcc59fcdba45cd41c44a2e0f606dc1c7f2e618f +ee8f9bcb4685f26fa93d73be1d97bb431fe198b04884eb2d75f604f7326e3064 +aabfc389b7230d325f32beebb2d0c339ca51feef98de442792c0b5b7bb4d9234 +b7f82ccd14bdd609816215a9921d67c4b891aebdade0677297e2b9fee67c60c1 +6bca445b3fa9924c81f46a0c88b0bf880477bba09b471da11dcb8e7c42714011 +70c4216ab739cc7e998aa1e54240f9913e0162333a49306ad5973c8f650200d0 +2123a5726c9e939db85cb8978184338adc1eaee4c892eec474731e567ed56618 +32bc375af73840f81530d8a2679d25b532495263eeec8a438b7a9569b01309c7 +e263f451e593689f209806808edef5a896c1632dfd9a823c9ec5d266702db77f +b145dbf4d34a371344437074c6d9954253da577be60e4c2f3e303e382890e688 +112c07d9e4b2b6e5e710e51e1de8399eb0e01c618cbf2d0c02a71f3986575ce3 +f2afda7f40e9da546ffd5f61fa12ba786a27498ba5a60e568e09a7c0f0b1341c +7bbc5552d10a3c23de3a76ede29825d50ae9c509bda892e6b3bbebff58dec41c +c126f433c9f7a8f417585e026468565f5b2f823388e8d5a36807cd6b53294c6c +bebce4329ae476c02d3e3e64dbc40b05c9d1eacc9321179491a4c760c0c14ea2 +a0b6fe66832957f908eaa6f18310690938a38a606f73132b44fab38884d169f9 +5826312ab82666de60297f057e98e26f0914a32f7b4ccd1c9640294909b17e5c +1b6d206c57221a5a17e9eddc8e51cc9ba343eed45493fdb9aa37e477da35a4fc +fbefb497d3eb070784ef08239303afc0f15b4a9d6d1e7ffe49783c3c4bdbb5f4 +7012884e1cef1996d2de2362492d8065009c863d0bcf4867463fd5befe4af3a3 +9730e869b632375b1696dd1b2479d21d98554ac1853fca848241b911b96988df +db0713c481cff11118f5f0e99479a79b5e59eb0031f083721a37de51758fda74 +5332f9ab1215884c1476aee17267c91d5b354314804d1f56678a168ec756b61c +d57d4a4476b7f3d280557586b0c0f88be44350338c1b43eae03d0f8f21232123 +6732997b3dc602628f23619a081af22185e1f0671d807f682885d9d7832ac477 +667dd8d99cdb3683cbb4758ec38c2982d4710ee31ef2b9427b9f0278b5a36b12 +8c1511fcfd79cd8bdd95f845e164202caa314bfe1dbfede5ef71016e61d47c89 +b880f63dc0a79122118304ccec4e3f5a7e9dd6a8d988664fe2165910a65b14b8 +27e34155b2857ed8af38eb81670657cef86b8151b5068ea992902fb55bd4468e +617216c9e4f11a193c5e8d5444700caceb3bb49365e2dc4771a58cedda7d6640 +fa370a4aa115a45d78e61e1bef9b1f47eba3ad1d690aeb1cc1fbd14c003ddf04 +fa374f156be114144cd4a124063aea75f383bc81759535bac7accdf27adf05ed +bc184fd63f064e97dc2b650f04ea22fba2c9765c9a90f00cd987a0bd5bf12f70 +54a870dd7e615b3ab5dc0f16879c7020ec4a60b7eb94dd23bae021d06454f6d3 +985e49bec7c5e01c8be251b4368d1f77b28f8c8aecf5a41b959bf43bab9f0ee3 +5a057d2671d5a408f48ec62be987e8df582f40931d1f3ffae7e9515df5452f73 +0aad038f607c30140ef336261a310fea7e13c18d44de07968367188b77930bbe +d3be4cb2bf84392256b8a180397af2ff0ad22c0107c333b0c690ec01aedb574c +9ecb935dab18a853b5de2fd79d63eb688bbfb55f8982a9f6d19cabc1d2f27999 +8185e5ff169c01ee9d41723c8762087b4e7fb05b7544972350438825df0343d8 +29005417158a5cb24e6df53d767c0d82f3d72c53bc5cc7de22d0c346efc28af8 +ceb4ee03194d7b9ccb465c0e6f9d015e1e2daea4a43d9b04d7473e1aad92e478 +d8f083b1b4cfae16b3aee3cddff25d6bac9e05289952044599c25143b6d58059 +9ffb92a171b10fac1c3f22cd64b9601894165b76f9da6021c90e1713ec69ec06 +5b3d3048ef04fc0f4da8fad276fef2a36f79488a5a00e61b3ccfe7b237dbaac0 +5e0a90e10eacbaf9bc7f47fcd09befc4e6f502bfcbf988327ff5ff8e4b85cd63 +f6f253e601c5b267488aaa1a0bc8b590e647455ebfced9a84e4126b0c67c5974 +8d85e0ad234d93ad38bf9d320b7349d5fd1b9ecddc1cec055903c9aa96584a4d +03330eb0e95fe7ae0ab895828a9512989cdedfd1e66403bf4122e293582baa57 +60b961afcfd1e529240b44f5943fe38629fecee1446d6a20863b603634dc0605 +3985d82a111445f7006ff79a4bde99b758c18d3cef4c6c281269ddc43f6b3758 +0c58462b47b12d4f79f1c8745d9a197851e00329bcffaa2e312f45b9a909a7e3 +353fc343413647fdaddde0836faea6a7a0740623bf43fcc3beed6a99b9803a06 +a02ce672574d41898e330f18f3fdb0c3493e377dfb002728be112e6625023724 +a89da99cd67caf7c1f3b395677169559b06d748a331e2818f27f50efcf76d881 +c09c7c237e3c00304b0d6f59dd7a12caff0b1af769255bedb43de8d4a0fe7803 +62d04729ecde386d5e85e3476dafafbd4f41f24d9941f441cbc92b73a3c9817f +ab397183e9a64ec258fd965707337408c4601049bd8c38d8b6f769ab08008f5a +badf01bc94d801e9561a9ff414d7d2b9401ecbace8a8b80ba5abeb5d701d02bb +6ddea8841621c977ef5d680b1d22b4ec83c1a749455c1aa9c5087035b832ad5a +c364bd1f18bb7b20f6c735ae149fead92d2c3a5403c46e0d55d1ad0fa0d4f1d7 +f9d670e5f0426e865c8733825102b6b92dde23679b74cbb5ca4eee791b93ce27 +e8abb062e3eb82f38018dfb9f144cc640543fe7d8ed16493848b5f1f31fa86e6 +caff6c5fbd54555940d3f1bd376f454caf69f002b91c2fd77848c3353a3cf208 +414155a9fabf34047f1d6ac10e3967f434218357ac6c5159698f21e53075122c +fa05ed1392431c4d2638965864baf262fb8d7fae487c4f755a782855aa157de0 +15dcba11a1c649cf5c926ffec3dc264386491f298d52071ea5b9bb50d82e1701 +fb5463461de9e98e029cc3b7d4621b16f29c598c10750f61ad95c1f096c3a3fd +d4a327adda358bbbbb0dcfd9ad6331e6a28bee5c58506eeba7db703a9524bff6 +2abbce7362e3f0dd61052504cef97f1725a5beb35edb5e08de8cdb3b72c2aabe +ba2c9f6340f95487edeed33d8fb9006b2b105a71dde5f440a0543af51b9d13a6 +70f0438884b84220229e992f3c18d0193267b133f8234cd5be9625c712913e2b +14697b6042de352f6f1afacfc6a225a4faba63826675f83290965a536ea3f31b +88ff1ca2774aab2d636ab6de2f1f87fb54a5380d3a8b5f9a303649a4f7c0de26 +626b97599b0a935da6a62d4dcf88b7f603bac672f6575bbcff1784271bf18bac +4e33df2ae95221bc09d7a58b670df76bd96d1303f66ebf40c3712eaa384252bc +b63d409a8f280ddea937f73388ab0acbe7f37145bed320d3efcbd94bfb6e6c29 +9ddd6925174f858497804ab4688db812cca27262e7b5713979f5d5fe167294c3 +5f10878e60950d1b9d1bd4f7f10c0c0e1fbbc095c4fc1856f4c04d85649b8011 +5fb0dfdf37f9604f4a9aa6061b5029ef157b757cf3064a9aac5aac24648a9c15 +f0a2a74dfb655e65341c03139de98db3dfc2dcbb39bffafdff9e67d734516e0a +eb7c111c39b6ee987f99a7064f98c4f974a24466f60dcdd9f8e526033bfc238b +35a5d78df28a114456211b5d26a164ac45bfe67bfa3b39c4622d67fb8a305d03 +e5b8548d0c01150d18ab5de5aba0aebc35b456c42933ce0370f8e8413b13bc6f +db80d558ae7b5a32077897e3ef1eb98b93db5c00f34f33133d08a6a8e7665e3f +eed2e1bb318afb48b73ed72bf9b6234c40f028e76a5a0f902f8702ea234a92b7 +b8dd516336336c31f9baf355450fbe924c44560f32510e183a976a1f98e0ee77 +e99e26faa72e5e7bb50248c336e6481c1e7b00596b1f511db2dbef7a288edf8e +5653620ab52f7e3d10921ae2e194c6a842ff1829ccb8aaa542a53c04f8c23cd4 +08b414afdacc34931bbb91187dfd8c1f3bef02652e042adeac4b9bb5ff5ef7de +60926e02d49e3d55cc1ecdd555c1f4c1a1083dd19c6d58972d86558198314511 +4cdcee4aadf3799bf6d81ec7d4347225eee6e67126fd91937c7711072047ed3c +4bcaad89c800e05a3304b95dadaf9c7333f0bc8aa1d711122176f3db92d0a4b3 +30939d1b554d47893be691dfe0e5c47d32928fd984daf6c03f32c1b99efda210 +faae4a783ef7d6eed603d5db1828c274061c1fdf78c40ce76a7949af802bce9d +d84a726212e23d97b0ec1e975245826f3c49c995c08940c680c39a598553dfef +1b3c7232f0b698fdce76a0dbc3a2fdf0a53c6a0a48233a322d1701bf43c82bca +12ca3393662fc5c4d38a693c30b9d3c987e872b91a0bed138bc6a671573d4840 +46c9adf2cb62df79585011d6d61e2159ba67b4e7cb35caa2de2ec53452dd6d82 +f488fed31ebb907cee7f61773290dd0e0cf4969f2f123670d59d24f909b8156b +9af55056199c5a1a4d4d3f72eafcae937765a6e041f626fa9ef67ad918d9e10f +328b3ee0aac1fe1d3a0231ee926659f238c60c772fdb1d13ca48217e43a54b03 +56cf7084cd9bcc3e0e482c18a1d5e01cfc1ccf0cf196af73f676b915e5efb9ef +5427d032e8d4f9cfa5fed93f85707a1cc136b7bd35b52a7a4cadcbe3f3a6911c +dc5b7fe0607861e73d5c36bda58e125d20c30ebe336dfcbc4232524a179d763f +6e23915fa34eca1e4050027a2b8b7f54ebf0b95a68960c676a0927242a436cbe +64f7fcbecf8dc5c850858725a1e3b701915f9be0a41214e42fe2b850dc7de4e5 +edff5f9c6eb1be2faf002a6c3347f5895a6b39f8a4ca5aa65261b03d7a17b58c +b04fcff305a35b1afce3bc9465770b512604209efa3052c2a455ffa83b870d21 +15bccef823883d2a92d725123912a9e89b4abc02185621a728a447a5957d78ea +36a3e8640e9169a850b4a2cab7ecf9ac05f2e0b30c6f626a1f59316e29081c07 +5b22a491b8cc89d149eaf7216cd9d55de0214ca1e70a5cedeb9824894dcccbd8 +dad1e22d7954a8434773ddfcc0474ff722a521462bc78d20369fb9383a6530cf +e8ed7e26bf47e61f7d16c44631edc1bd494c461aedd67ab56aee434c442927e8 +1acdb71ad196938935646560a0cb98677a64431ff44f2e50552fb2706f206a1b +39b95c94b82c148e1a3618b666c555a258908f96bffdf1e6c34f65919440e8a6 +4c10982dcb24cb5ae5ee34981c9c340065bb0a6d68b1735ca808bf5593d86440 +6bc88f81d3c9f0575216f2f2e5d7e12df7459bcfd90d217f4eda8a8d6855e960 +e7427f6f3630ccca0d72994f168eb9e0b7d401e797a1b3b250cb11d3873fa3a0 +4521d64a5c71b3bb2ed62c762184a15fcfd4290761f54e5c2dbac8a9e196bdfc +0fb03afdfe8c441933c35296063e4a15699c82b83142ca7ba239b6c65e3fc1c4 +e287be933346e534d611c38b85b298c51dacd20fa15f91a7c84dce62e3f9ca70 +000b6d0e62ef647b47f8550ab0b3e0e0575509f08d73b522653610f2cdaa60aa +a62677a35d57d06e9f15d99c7fdfa77fda7625fb3f418bcf4cbe480d748b99a1 +2e332920f119423c75e8d3b18de4284155230945da1e26b73cf56aadd9e20fc7 +b94a75b55e3e5ae6b51a831d087e6e5b1606757ebeed58b5895d47546620313d +80c230bc01b17f0e11b70e1a9b17bd878e2d5ab31e3436c92e5366c5b92f2392 +08e2c6994fb869586c4095ab7c559bf8c70ba0ad8cc13ece387c57a6f79dc107 +ce6f7821f77c6e8e493f756453512038b01f872e90dc1d9cd0b82026446a9dde +fcceb653599aa3b063fcec2f7e9c80665b65ea21e69b82ee4a99ea51d9441ffc +0f2f7dbe9d4dd204cd4066874b85ba361fd0aff5bc11b8852625701c7f174302 +e60cc1e257e6511bb7c819a8838501b1432710df25b653e1e3804e4749cb9abe +f08ee2a0b28ffd07b9742fbe2d67d568618a593945959a706fb055abef058a45 +c07d62ad9f63c2349ab441e2d72b8be49d1af258e365bbfea63da2449a87aded +b306753dd10c806c0c9361cc27ca6f837723cb538ced898caffa815e12bf5e9c +819b16a449f8e9bc06a8f8ad631ee0e8e23b42dc7eabf8dccb0f9dd14f129d23 +49dd04e23f1e033c95d11fac2e2809416055546a93c9d1bf3c95fe8cb4cd8cfc +f0f7b21632bec14a136a9b694e40e36049c6f233e01df150a946bb28fb0f000a +4d99dd94b292f45acd9bf8cb8269061bbecc062b64b38c526cc7a55e2aba039f +c3bf691978904c0152d90c85f5c33779af5101a6ab0eac7577624649c9ea8604 +b942b0b966c3c6e670601cf3ade97a20fb5a7a79e5c3c0d5a7569d615120e89b +1c33397696744512a60789193d699802ee1f37ab3a13f8c007da56db937f80d0 +b9a23b066971241f34004597effea6d0625fcd9f18258aa378c8fc4a41b7d1d3 +931d1a7d17edb0d36568955e81787f4f2ff2858855f60b3061a85e6cdebc42e3 +44559734780c07989a41642720daf7cb97bf3be7acbc590d57f1791238ac096c +b373165488fec94045578f0a69fa4ed0366b94f000045ecf486b0bd54d89bbd2 +33d1d814886fff091d6bf567417120895056372ce8d490c02ee8c0b40634becb +3f13ca1305f352e96df55e9467e16ff92d2a2be8b1d65eac380e41db62be9d4b +341f4bd6aa69349791c98fa61490bfe18286bdcd936b27b18b6675733d447eb3 +79d07b8cdd7bcb3f1297d4c142798d6871bbac3752de9b23ff6853d5438dbda7 +6b33d3fe159a064ad2d2901d5b31ed8a3987ade8fe06cbbe7d69716b4a35c489 +841220a5365f0a000206619b081bf55dbf6abe9adbb9aead2dd25b66896f81f0 +9c1c9cc4332972ce1ff07930421dcf83428e6fb32fb86c6089495bf91273d7df +681070765ffc1eb22f5a31a00d424f99e11bef8067980e3d9f0e66ca266bfca1 +61413cfe419bf03ebffe788882aa52b4ac2b1928800008394e18fc88a55f1db3 +788c6882da7e4a1eaf14fb1dbe6ebdefa5cef0d686245c1dc794298511d38006 +2fae24096f728f0aa080ecc9d85e5bb0d989c5ea82fcaef430cfeb7aa9f6369c +74cead4731d892a49458cf89dbba50d7f6ec38140852169dc4ab886d92a91a61 +40fa81b25b8c93393837d64b8c390389205b36d444731b3ec745a944b6cd2d4c +b75a668f49b01b6689ee9d3bf88be3ee24d39b00e20b4764513e0b2813c5d4ab +2d067d468ee2a805e3ab73c05ae11e55b1205af42fb851bc69c54e8f3f1083e4 +4b4f781cfa7f44ef6b1ddf3163567d125e052870995761b2a9c5753e867339fb +781f0f80452d6350d4cc6dea0c7c6dc7ebc3f1d99653ab1374b26091e7247364 +b9ef32721378fa994ee464b5d653438bb181e2d5af0d52f6f25955fe91825f2f +504ed079a87da169ef93971413c2f31fe10ac677b7d533207be18b95360d9aaa +ba427161e12af468b4d05e929406396ab010aa775b3746098a044328ff0e98a7 +e53240a0a3a87e955b3e7c5dbacd9a0cfd7575ad4cd9cc22652c7cbb43a29764 +01ae4868bd7f4530775f0a6bb230567ee11d542cb993b2aba34f0bc38a36204b +85ba53df1d746b211b1bd22ba85d6a7dcf9c039527b26d950afdf4892d186b65 +c7ce1c2de59c03a520af9d013878e989d6d5762824733cba8a37b01fd7e3c169 +90bb8b8b469767dc749663904285bd4fb4de7d363efa8fe2e058c641744f7678 +99f9b384fafaed93e9dea5615f13957c8080388b70c478eeeeaeff2f0d3d123a +04ba45066d402c6d1afcb4920bd0a07a386bc5876c73cc5e89cf3f2fda80a47a +63c7d8a2403c2c767625f25f2407931ca9f11d3f3f1236a77c38aa35811dce4a +ce4f9fc2ec53e0d87262fac254827144e92eca37c09e73445060ff736a334f2c +c1d6789ddc6f426024e6765fd9815f3f2636fef179784f7b47ea92a3f6b66382 +5fe65c4e219a2c43af91e40ac28c2b7a02e7afc1751b2b24eb838ca55bd7f66a +9500ff4ad31cb1a627839334ffee506f87b0c44b50c4214318aa8c41551a606f +e3addcc30fe261c4859fe204feb3471d9d5356c6508e2c37616d529aecafef05 +25b67c8f7cd1c26cac2d990ea57f3f48b221d288a034768646ed29db82f0b471 +fbfe3a70debbaf9736df89e7b054bfb1bb6c6ccb6a1a71f9e11937f156a75291 +5b717c9a40c8902740e1e5eb8eebe94183d9ec18ec857bda2635e0eeb26d7ff6 +3edd21c1cb4be925f049878ef687007a67636effe6deceecc73e8871441c842a +117b9dd817ed80d0920ce1743ed6b8d9cb15c93725a4140995411d75a0f1bd2a +a10bb96893a7d439d3110bba9ee156d8b18627c7c2b8217969e3f6328b53b4ac +62dcfcfd498581b59b6d018733a3a5ed55eb759b83fa3b1c0793a247bbc6362b +2a8837413d0edad8ae649f3e06214a316fd23c5d0306f0ed9f8f5b896026da63 +d2a18c58352a04c540a3f90de5d56a4843e3d1fb90f5e712da7897680a7a1d25 +4d32308f7e1b8de9e8cf4535d9c525325a1ad6f543eb0b1fb5552dfe957e59d1 +e66da60051d6687fbd7231324380c9eb9fc8b6cf4510b043fa48019fef1c094b +84b7f5e3816df7c138f2e6ab1303b368687d1e3c7dbce4754337a3de11f57252 +4d2a143826e406e082c3d7a69ba88e2871a1cae22d6a7bf1ad1de45fcaaab235 +038cbbb623719dc5533d36af35f712e9f8ac826ffb49b4fedcc96c4f30913c69 +ad0533b02a4684bfddb065c32b54652402869d8d6141f90608201397f3f0bea7 +f41670b138c6339230df305a07d31b5aad40ec48277df06092358bcdb3961bea +d551c94cd039fb97f46115d234965aed70aced9be3305de77c7f1a33f3292bfc +f965c53292a7f31a8926e038147a827589579842df86b16e840b836c23fe23cd +059ab92be7d7037843661fe65ef0dd48d31b07782b542f0b0852071baf3b2809 +8b95618ede124c9545b31323d1e454ada5a03e1a33ee34f6e1901d54fb90ab12 +ac146fa7bf5aaf50f0de423e8e47d45cc01867674ffd404060eedb137115f352 +c07f7251835a8ae2bdfb70d022c2700b79fcb83c3c312e7dec4001ac20919443 +acc723f7269d60f3d626dde9d961805ae77acec4d40419a51baaccda682de591 +9df8ac6875b9fdf1f1281988bd94cf1f5f06ccba48cdb6039787d63295fff9b8 +c2b84b30383dadf7ed216b830a38caef32a3279e86ff7e92865bb6b421166e93 +923b68a473de95dd52c986a5a4f73473560ca69e8ce5f7005e9aed1f2ebf81ac +397c9d6efd6067cd741739f7ba770b7724336429685d486ced5a122aa4d78647 +81fb6611c6fbfa68e7aceb2a757992b249cfbeba51bed32b7cba777fa78f6db3 +95641dcefd1a61263e2ecfa95938e2c3380a8617d4a775dacdd824cd2c2cfc67 +8a5727ada2b1da97f157e543f252f8d3d2bfba555cbfe089e8bf708ab253a4c6 +3f6ad9bf11b96988aec8a66984ea4952ffa81aeee213ab59184f8be355db5010 +17bf130f7d492b9bcc4b67f2cdee249f9b00bb405e3c580bc56dd1639ff81771 +8d57d1ca96b5e8df212bc86b709355d1551b4167b4e35b14a32a708d7df1847d +f80904addbffa67dc2098848c24b6154410df3c6ca0559a1855803ff6426aa69 +ccc262dc8a2636c17ab65c23004d5a33c7b6c801596f0089a033afd69006ad4a +f21c0cb08238c0051345e0f1b780e914b80b1d74eb45facb77b1c043a55616c2 +8ba8ad3983fdcfa07a3ed19ba69b97c234f89a296f581e4a380fc58056e72096 +7781f036f7c3691ca713ca9d886ed1b4a742295c29c1ef093f93d6fd507af0fc +80c5a01ca38c17b8ecf33b38fe224c67cb551e43db191968311c38779aab6c4d +0efcc2a0781f4e0758a99b13b520b75808cc555736424a4333029c5b95edf387 +7e6d17b114cb2821286dc34dfffc1e89eec9519c44bb5c928fa4ec44bf5b75d9 +e13aab1a73abeca008d75e73d72839653af898db554ce339a867d7cde546c249 +d0ac179997861a121cf2e1a1001154ddd1f337ade69263c021bc78724884f470 +4cc8b2ee48a1e91eae27a905d0e73a98b00c4353c4da0aa4abb75794b5617080 +a4a610ee9270af4393efae916b8c4f5af945d453e9ad0159deffdc96e5c6fcfb +95d9546275d8d7e4608cf4add77202df1894ba8bd0394d7ab8a066bdca5c649c +a78544a7b54b7c6745321da400d74a0c67b7c1f412901aa0c8c73d075918b4c5 +a5462d30577d848479987a4a6110b1748884576a374b488ed5d06e017880cd29 +70eddedbc04a39bf3cd2eb3f0a48dcb3b7679bdf0686e77c63b2fd085eeedc2e +bf04a42bfaae73afe9012890b088f75244b6efbdc2f37774da13dd60c89eb077 +3018a2d9707daaf64a1efe40cfe46a5ca252def56e9ea2abbea02e4c86eceaa3 +85b194025491448e9317efd74f3e323683c036805c158e6c420c54a9717b4c7e +7343b48e2e9cb16d98efb347dd42f9f2ebeca64bfca0d15c5f8209d35c0e6328 +f19be8be0c967c2f577d7ff09a9d1b4c6dee3d744d6912977e597be47e4023dc +3979dd6280d66382782466112ae09f2c8048c93df7c38176560a87e679a681df +708ee6ee2e3270bf6c8b07c15a0839b0b4c4a9beb898d523216f2a9384fd767d +07256afd80a51a2782907e34d1694b1aabffc98f5dec33af246e5fc759c452c6 +6b34ec94bc9d66fb80898322701ba188fe5ab3dda0cac7230f6deb980006b0c0 +786f1586d58bf75fba6f52697c8cbde27b8525a27c0b8bcbbc43faf42b419156 +eaaf3475a96cbf399605bbed9fe577155c920eb4a4851669ffb1083ef45ee35a +83eeb96f3d0586402baaeeb1b71c448639a1ee577c42a327cc78484f4dd38fb4 +44162bd3b5e6eee672e6100a818657759b899030a0b1105be1e629a391aa397b +888f0175e74c210ee7d5a8a817d4725785d2cd565059c8f08a6ad227a2645918 +5de5cb6bbf78143177a4aad766d2fa844dc7399ab1f800b5671777d074b8398f +dfac8803cf6cb19ebdc486db2f55b8d0249382dfea1732ff0ee0d8fb4638c316 +458c6263e9aa416105806a4eff7ad6abd753009c243c3b1fe505e6200a7fbfb2 +0e5595292589d13e73286122f291dcd71b708414936143008bf4e42da33043c4 +c4fb7fc1cd40fc685c923439419a441200d118c497892ca1c492c52dc1408771 +c428cbfda340bee7f84d0c2ca16c4e35a0962da289e76a728683bc6baf252f8d +a0bb4e3514f5127c513ed939ad1a585d7d3303e13af4f5c35db672658269feda +b0d139750a4b4a26253f6402460117d541e55c7b899f544078e7a435d78d474d +71f7bd24e01a395265cc80e525eb2185f137b26dfaec31f616e7deb0f6018edb +a959bcf2d04999d1bb21e39e43739c995101557de20e32e0b25674d17c12ce93 +f0dbddaac156767ed03f2e081c63ef94828ab30d4a11ab5091e632b6efc0d740 +30004eccfdb55c3a50ff091afca5acf052cdbacc49f4a20edde87dc6dc2e9d61 +7d0a40cfadde02ac8e7ea1f375267c7322dcc2d3e9633895d1f897969c3091cc +7a0a7a7c84a4bd15ef83a16690d9dc380f07189403ef0d9113c7ef0da0f1a66b +61d7f9593f82f849743647d8c2ac15b7e0c87b9f7ec8d7adf890c754cc29c38c +02982e19d542ce713462c3f5e22feb2cdd4cdb6627d419c5b499c9442c58e4f7 +f0c0ba8ced3cd519473145238abd923930d31f369d3e067b6dabd69c740586b7 +93acd9e69ae61baf1a063f062f22025bc3fa2e0ddfd7d75454dc1b8ad9629167 +656edfee69a41240a08f6fd792e5cf510a3254970429cc76f8c2f95a86d75d2d +c98d8c7bb4418561d37f478ee00e9ec8f52f8c745fa570d42eebff048d60a6d3 +e16d9a9bfd1722aeffaaff77ec82cf4fa593353a1bc6d96790dfc9c6484d22be +72ef63932b363c6b3057969624cc63d177f5b103b77b8a560bb0595da7416e29 +a8e43480858201306e31a72b3a7e01b367a8917c19293e57e4535d734fff4e17 +f50fc475ad13a5203501cf2c29a3d135860788507413ae93be0598f21a51f317 +e9da8415f5e00a4dcf49f640ca26c8623ba9c5e80e8fba310c8f06570a629a50 +758318dc48c876b126850118b8134ac65333f17d67ffb7f3c7bce5c07655665c +4a09e6fed0bcec0364386fba63f4cd34431d2e5fc44e3821abe5033d77c1a901 +183a127f32b003add501dc875c453762446a87bcaa50bac3b75a453caeaaaa30 +12261d6c08c95eff1df3ece254e9f41d7ae85efe476e244fc9d9e0853017eba8 +7ff6241cb9d11b7213d2ce679cb1c071daa5317c7e3624df30854049ac46a995 +97422a2dbe9814d92e829744db3d600fb8509f9537a101862f9dc84d17f84b82 +b819ce71e40c2e397259459f55ab6af355a6c4f359ebb831fecbec1dcc4ee2c2 +503dbe52d26b3a72833d36a67a73c9de2705769d8ea05c92bfabf4d3ddced23e +a37214587f6b58df7de6318187d2272ef039a8955de18eb7069d08fcd6f9bea5 +87a2a6d3db572662f278146b51f771189e46a044ef16b7def53b9746d888f2d7 +ff871658dcd3487ab266197e7e34c177f877b07ec4dfffe71a0120fea56282de +97de3d547ea5b97b5f2fe7f14f7adc84f461e5fcf9aa866bfbc84c9797c68749 +03b1a017186b2a386dfa8246c584461bc07194eeffb18f8127cf521e7756b715 +7f6f7c7358d2e5d9255feeb70eb771514d052035d27a86378a22d82378d99911 +f8e667e1d2df9611eb6c369826eba29ed9dde39dbaea38c9fbf05ceb5910d484 +453c9c282e5d418163b4adbdd92c091758e1432e8e75e151872e1dbdd5e813d1 +1a86cd3a230bdbeefd67c02448594bb5e8ea2fb6d07b098131a73a28f9cd9063 +59e8cd66c000894ed7ab70240e06602d7c4e5c2847095c961f88f2b02f2ff063 +ccb5f34f7e0696af4e43023cb3b0474af145dfa09dcf90835b766358e2ede785 +c63e9bdbbc208fed261c5bdf4d10a769112b62b086bbbcc8d25486310f6a919a +35383ca27e13724504c63667f79103fda47692d2713923a5b982a2633b3f86a3 +46b4d7159a68ccfcadcde10084b91150fd86e1e185753a663fa82eaa428541e1 +40edd7a75007ba37fcd7bab998a401a37348f58bc42d809ac2d0d38c7f49c350 +2bc84208804d6550bb732dddc1f760684f0f2bd1d8fcc61b29b5fc6b357f3832 +54a0f238a00f9dbc38f063827fcf36ab943c9f61ce4add29be32889b32dd1584 +c54d3900de0b0acfc1345b1bec5ad097f75adf92655a12542af7b8c618f07bc5 +cd4d69b206bce599e1e6a8485849a7f2dca770618e877b44150cd34101e4a8ea +e8d3bbfde9dc4a862af61f8fb4db683a81e614545d38927875cf8c027c3e28cc +152d7299854b95eb16df2443c7ec9fd40ec579b52f9ea5a6ec56e3b662171b3a +bf35565869988ab1684d47b801ae6eb23a6bf085c41e3c3f2b040aec9bc6cd82 +58ed64d6ecd8332f966da918d44af30897e54085050a0cac70f459a72f5af683 +3264a26d0cb7fef77574f10d4fa8ecfea0aa397d5bdf3a62d8897723de545ae3 +bbf38ef76b76e3e72d1c3a35b29966acb40e13928de55cdc20e691daf5dede05 +b71e8713e67ffed407f926be5b69aafab337d2f04992abffd60364a8549835e9 +299df33af8212c75c0819000536b89127613c763df066d184f718e1f10fb8e08 +f5fe7b8abe9f72743d0db04afd1d528780a097598a67a9da8172247c6d638318 +9885e4fc9231537ad9bea8c3028c7cf26c3ec6b7adb82b1481ca1b149a9d2316 +2ef5477fe27363a3b2ce1dbed38128d16b869eb8f21807f6d5430aec30cec535 +d0f4458efb8c19834474719b6791b30edb637f54639396a7dd581a4ab5e97fba +284e1b756f2e2e3b54d6e136b237bbd042c69b21244248674dbb4973ec7ecdd3 +9f1ef47545ff01b39b09d06aea5b412e81fa46ab0d048b6803a5992de0fe2f63 +6d6d29b316a9bd4608131cc7b4c0dd1db4a249647ef8dbc5a2f9b9524284df3f +1e70a74c8aedcfde0f6c556713ca8b13cfd5094cfe64f1f482c29e72adc2024f +a2846a10ff5344cfcf8113d0d1da07927c53b9aa76094106061eeff3c7e5bf25 +d875ac8c07c4ef7a0bd5d4af2644e6ff82c8aa6e4506975ac9625fcdd47fc085 +4ff26d3dc3f8843c1d97948374170812c223ca163451e0fe4ad73ac7089e4fc6 +c24836cb8413a3185224724c5b302fa8d9ede4bf88a0109d98be35ad56b45045 +3422785c4f579a9307a860be505f5d880fa5ae66c82b293205e738e910ebefaa +af82bd9d493ee18eeb12e40a69b9ad40d5aa6839d58a7894b5cee115a2c42465 +860139d35c0f2640041679283c476a3fcee985a53ea863414b206dfaf72c7d10 +851ab12466eaf532d90be235d9beeef7e389e88a9319c536954f081f511dc717 +16f16c21eef839669bfd0d8b505498b0bcc83eb41889e6380d8104fb732e982c +ddfe4d508c45e8741e21d6e5934e678f38dbf17c98196dfeee7f9e205a52ebb1 +b9e2fe333d6b1c1b1b3386e079fb941c7ce482f2ed5c9426a224309edae06e3e +9e8f5819ba4248d82c7e9cf44f7d1eb97b2110f9ce9acc313579840154427df7 +b2e57e2c50c38b25f593092f20350e27f67a1000f86fe87e2acc031235de5aee +f246f75d4f4bf7d8852267941cc50de864e0ea34e02efbbfa72587ce257ef2de +b249377e0df834e89060680b54c38d036895e4e2f8d55b9e4a5fec6da7b99966 +9b4ad9b695d6cffc349bcd34ed2abab20e289417eab1916574e583258817a100 +5173bdb345810dbbe2c600c25fbcc73727698446a2c4d1f71732208a70cf557a +30e67fea48eb40f288ce4f576366b0079195507f25bc9852f6fab94827a79d9d +16fad40c0fb0733ca838a148f1c2050590eda6cdd3a87283911efd861c7183bf +10462d87eb0c7131c18346611088c5a8deb6e200ae86977736f2d15d818a444f +5c435bbb043c7bca3d5f65152508a0234c6043d7e67da24f0b4d8b3e7367afe6 +c50870216ce2e4048589188cf361412cd5cf8baa691fb7dc66677822263ef3e2 +338a4064fbacdd0f7460139c508bb21b65f3f433c90fdabd0170268b7ca7003f +d72ab116cc3207ea8aefe60b715e426cadd96d4dde5cd91068214c92a1307237 +951e92f30e07878b695bb519d60512ec7124d4df28fd5ace12a9cbc8c4ff6c16 +f697ade3613e22880897bdb1a3aa680ccea6085e234ae3d62d270afe5d4254bd +6c4d0fe6b7c281919e6d422431e1be80d47a51628e3edffbb685a7aacaa27dce +73938aded090460b036236e6cbaeefdd26c1e5caf99efc45cda9b3fde97bd072 +9efcaa80ef173375e99894d12c609bbb57fbf0bdec7b2150970889d08f992382 +23cdeb12483e3fb57705d03eb900f648618cf5822b57480e2fb420a5022b4e22 +138ec9b68d4088a833d50b2da7a26b4cb07ce56aaee2a1fbe00dace02a1de81d +143f3b20f87b6a394ebd896b3a6e8ff548ccd70bfe95eeecf9bf9367d543f75f +575333b7426d644dd94d675e17dd5694b3a1535aeae056900a9bf30d6a7e39f9 +62dff42d57b9c7d469446bea7dc3248e2093d47c3afc995e7be86438cecd902e +13b1686c5ac4a58ee9a272f0ad18599b8495306d146ac0f6b958b86b72e66121 +3279ed284087ccbd1e8c865df2fc26702cf399b46afb744a3e99af6079fdd596 +5d1b59ef92713a40d56917270a40fc029583989c94caac0ea6aedb0310ceeac0 +96c62a045f3e6b5de1963ced45c566d7b10ce5ac76a81ff38737104595667628 +b51a1ba8172022d9c06f5ed6ee8e429be415fea9c8f648a27f8529090c6bce5b +69abe90177b1274d5bcc64d29db949132223c7eb9473d5af376a81d94826f141 +9bddd79521481b06adc451ef5ce33ecc43a69be43916509779b4c8a5dcb4a2cb +c12bb54f3956a97eff63d26de59faee85d6d3ed74e2f897fe852de6831deab85 +10e2790367840dae069eec64a77abff4e09225cbfe9f4fbc99a1cff38e2fe632 +792db6c32e444e85b2e09dff8f66dd638c2b0b5ce375980a894bdd6a1635c793 +33da9068aa329714e0ab8066ccb7eb15d1ff96414de80b5b791b34a62b25a249 +21cfe87d128a4cb6b93d0e51ececc9deb841e3a3d63e78c053f1c580bfae7d6d +7482bc54705022d1f48bbd33d9a2ac7e0f6ad5efcb172aa4e49f356b993bdd6b +8667e358e612b24ea9994a30f80a4db180c801b740a3234c0c95a8ad6d823791 +0ffd5806fbb8e86165fe6f343c72e655b57b2102f41a42d0220ab13a53feb105 +4836b876148c29b5d2532869882f7b54c92bdb7794c13c737d8a44bff734def1 +69786d9dc57dc55d385209061f38a411b5d49c66f191af793ed37432d2001a7c +0fa0f23b32e80ef519fba48264eaa841427b4fb6311995d63ad919ad034f2313 +d6f504d4eb0369678afb331cfe7f4ea1b69175d72ec4df93d4fcc4d91b880009 +6c371d04c12f033541b6e1e7a010689a1614c157d5191c69edc290a907349459 +b6ae2a0eca1e8e871cba19bafa4b861a29172153afe7b9b7764a6c3ff87677d8 +8f8db936d12c33ae05e93ec31944ab240099e39ea3e9de81217996c91a4b5685 +e5d9f7be2727d5f3fa41079bd37760568f2f4b4ca19226949b0723985e98e7c0 +9c1be3b1d19514e8236f8da7655c016cc7a79e7d19c0415c74ba1dc510536799 +5c08f9e243b1d3065b601af52a1fc72a24cc36b3a283adc49dec4d33fbdfaa37 +055f9ec1846911e326cecdcdfd4ab522d2b2871c03219bb991567cceeae2959c +96f068e117770adff52a3be04d935141c20a9d1c56252003f8bd51aa1d22ccea +15fb359f308ff2d6979ba1d0da54d9927f723b505b86de8325bf3978230924b7 +97234835b6b946c5239c196be506bccc1e9a4f2c339bbbf7b4291f1e830352b0 +2ba637fba6dccb5930638db302bb61621a534c7993a0096265271ec3ed86fa81 +b6c7888114a33b3346a27931ea6b0b2eff65f94ea692addafde2579482a28609 +bb20c6f343c8fa777cfa9bd9436cb47cd0dadf4d16754e7da03aafab0edfe819 +3d5afd59b5b96b329bb4955a9af589c6881d81ace8c97dd92be95623d94b7825 +4cec015c59bf4ce98de9081328e7cf5d085803212054da028016350005aea631 +bfcc435114a426c5d4367c86311e6437e0a59137e29db512efcf312e1fa13624 +ee6f728904e0ea5def5e842f8f07f2627d077320e90927a81fc6162586f9ba73 +d061839ee5dfb7c4c66a530d1a0647a87ac4ffe48c956fb619c01feb95baf99b +56b0799c8bff1d670ba5530cf7cceb6b4aa1de7119958d3ecaedd5dcf835e7ea +f16dfc6c671e6b861297e675ba9bde08d0654c4d9add46a288b15268df4a6572 +62f9b12765b59b338c718651ba92329c9510655da59347336f8be78b9508b267 +3e366a409db85adf04edf07d75111d2fe6fd24a29e5072a876ccfc4290b0f868 +fb9fcff47575a376c594196d8463f4b2defa8434bd1e769553eea3e817fce981 +dec52191e10a7c9e2a7328df0d568c9149bcd8476913e4cd385176184e029343 +3ad94901ce4b5c2cbb88c785553db92464284fbb1cc3c456d8211848dce535ba +697134df3371ed34bd6b0fe30ad22356c0dba8ccb32055f01c0fd9a931191bfb +a1af29f383a66ae3a810de7da2b79241e0bb376e4405bc7980cc17ab240b9820 +202c4cc9ffba362c8a547a7c9f3fbd37b55062a294870721db5f063e05b48d9b +567728f7b844f85701174fc98aef1e583a022b7207a834dfbd9705a16ceb4dc8 +c5dc9305ac98f5f41be6d317e20cf2d7166934586bc63a4cad29b1715bbc8d0c +0fa882e364ecd976e7406899f12bbcd6145dcb5f314195cd4ab865ae475a0c20 +644747ed8f79ab9f4fb736fd7f7361d4885bb41cbbfd59b0b7620cb17659be6f +986fccd526e9756bdf412c6000dbb9ae766101ec23f8036d1afafd45f106ab14 +a3ef3553cdc80411e766399bcef62e77e67ad7568812d3b150c29a961dbd4e47 +ccf7ea533d1bc8c16ed25bf5a330731ccd02139b72f63234d49d5c33a995abac +40cd06c867a08cb3c19b7a0f9df091d51a1d387773ae8dce4147533e41f929ca +cbe198e61b81380306dc2c99e99abdd0b6f2f84056ea25d549bd1f88be1dbf4a +6fc994783d4475d4018f48ed18f1bb851a221da3d9624e3a7faaacbc5e9b8424 +797e5646d08404f2feb868d59714e4ff77d6aa968749e1507dbd7b3ff19218bb +fab82906e56136cdb9e3ff1db470a20298b16f08f48a6937761a593e5d98243a +c842bd5c3acfd41791ab02f991374cc14e1cd0de834d5a13343d70d739c746ea +626310b0f7678b8e7b767265f343ec770cb789e8dded6c56889ccb0528ecd747 +0668da632b3f399ef2e28e3d8731708d630be0df2a1becd0e95d031aeddd74cf +6a2e2bfcc5024033e2828bd043dc7271d1863937c71650e5510418e9b9c35b7c +8bf9037305bf2c78a63460dbf914e867c16ff5dfcf05c44912c4083cfcf6e498 +e7af6072d7052e882b188c696fe69d1cefc7baa001f095ed80299c9290c31dc8 +3042ef7d9d3be6ea2f97f667a77918eb207e459958b60feaa7ae8d0fa14f00b3 +37a1b40055b720048a3b67c2250f3d94b10133c1e473e5f9bca3b4f72da29c5f +d4c09b6520ec5c54792dc37f10d75c0d4302844f7d193cba7ca088838ce44a82 +f1d3161489ad1b9a2cd319840c0f347131f94296f856d935661f691d737a7e94 +51872d4c49e71e9fab6ca34a96f682da48c50ea79dd68e199a2a1d49f81a132b +9a990f99ddacd43888069c37571834ae8dc60a69851f7a80d65f5e1a688930da +8784aee9a5d6ebe96e62e4cdc8b34740acd63f50e208b43a38c6bd0808d356ab +5ea11fccd7ab3bcd6aae709995b45e03bddfe1052a1c8417f1d8a794a66a0e72 +9db494db21a36118bf7c031c1e0a47c35682e1f0a183e1289a438c799273543d +99a3840d7549891458f6a3ba49b9f556920193dd86ef7d457293c17ce9cc76b0 +6eca47da729b0c9d0c3181b59f993e773f0279ac90a5ab526aacd6d8293e67ed +ca0eacdbf1b9aba40e5979a2f20810e6590decebb53bb32414b81aecfe304407 +c42af75e03a6c1016c381a378afb7b943392c081af0680726c0ce4c984856999 +2b7995735bfd871bcb6228d87d3634b3ae50d766a3237361a9478adf6a32b12a +b435014eebcc53c44c63c7ae474b4f6b0e4fa1b40731d0a3aa530f9a1626e700 +12b5a51fc6473e3bba2e0eb274b747273ca382902511948174fa78de5c7ab5d8 +7ba99000052d5c0a4c3ede1da7927b214b893d61fb11ebd6dd1af012ad26c065 +fa64581182cc1ca3b86150e63e5e3b892c49fe4f6ae6c34ca1900d5fdbf72c87 +6728d86b87fd0db490dbaf34c1c10b4d123ccbddc9887b3818f4335baa4991cf +812bbefdf1f3a3c4ac56fb633d75d04c17b5256a8216537c928f9d48b0fee946 +fa5d23ce42a4bcef5075e9b4b144ebcaf4887180c733e8e3ecc1ffda9459588e +a4c2f6af2ef3a06a8edb613ac2d5dae127e50077c4377ece47b7239b15b2d27b +d08df1870d8f78fc6e82a08441ff64b83ebf556db056fa7847f572fb4c2b2a71 +e5ce66c223e92040e104257c916587c439e8ef8cf32e65b737395999c7a435a0 +2abacb6129f95513d1d89d7cc1a0c8aeae5b5aac1d78dc42a37c435c641972cc +b3c92858756559f411b808ba10a55ee5296fcea9f4574550ef07156b66807b45 +2735cbbd8fe3c607b2e683ccc8f7932e4d5ed4d87c672fe56fbe8fb644f40ac6 +9b88d91bbc73fe3b94420e4aa3e493800934a40e519e492806fc34d134989a5d +1c002d51790b15793c3dca232a38c0ed32ced20ea5bcc8da027a7144434be835 +9689e94ac5e8b38da131015f4d34dd8ccded41cb86fa14946ca03f3ca776821f +83f875a2660a64c4a3788038d7ca62d041e24ae86c327af49cea43f81f9494db +935a8b065639c789911a46b3737d9e5db2bd918982f172a76cec867a086cbdee +a030c8ec695dec82fe0a6ae7dc013df64abbde862456b4d525517185015efb3c +f997ca8904e985f2fa2ba8f72acf1b6704ae358e7d7c2868010831ece2c87739 +17c92b6b425ed85f3f21a7bc4daa9620eb6a224cfd08fbeccd11652427fc904f +f589c45547a3a33146b80dc930fc515655593d24d259d925e4fb46996bb35db7 +fea309a4e4162646a85d3776bb44f20621d4193b38a28d1472535ec01d1b442b +b681c799ced74655fa5b5652a8bb99012035a5f66b2729cbf45a998130d619af +77301e13e23fde352a367343b8ed274a70ea92670eedf6f61a34b18db9cadfe8 +f45bf4933b81c8d98a370e5d9afef4a7bce1681627e3cdb633708efa623a3751 +7cefcc75635dd85ad3ea10ecb575789247b9d0257c40f97209447341deb604d8 +6abfb08a5120fb0fe71ec2e337928a4e4f6ee3113064e488270af5425c9ae51b +17e9dd6892f9ea2f98480ca299275c88bccbe584a4a192c966b9dad344753efe +efdb52013c642581e44d1b1c866439648fe1389963039b0a9352b68d7f3dc41f +fd3cf32c49c062d964fd6cba0fd1100beaeebe0fdf55112132d5e51fcb0c079e +f644dfa99d580e0cab548258aa864149d4a4c0e618566fe4ca9ebcb9324bc63c +5ac232512d086830d18d0f6657e9694bb9b3c4f4915a511a45b3c56460dfd523 +30da25d236b0356aed6ea76117885adcf2bd57222199bb5fb586e97d1c89ab8d +08ffff75137d2c0446a81c32bb336562088bea8702fea749c21147defdd87024 +d159b2bf1692244ade86b3a9f63beefd1b030a29b6ccb2904cee95b737180520 +59f4426d40c7ca7920d06fe5cdecd29e70983f787607055b277030105fa2d9d5 +adb7029c7a3a799494c6faa9ecc9bdcf91ec35cf0defc2b95d6bd447904851a0 +ab0e39fbecb080046246ff21e2328ce12bf355ed414334be01ec175299c7b82f +3e85ff80347a20c6d46a596b85e842c185b8e7a9bb8a54fa272edd1d46d7466d +d668d145ac815c5b051536a2a393724dbf52a3412409f40b92f857337f1e0adb +23d2f0cd6fc33564a3c1e9010f6e0350c966a7a003cae4da4767ab839f032bed +9ed1e90d128cd8b1396cef03c25bdc76ab04e6bef073bca02d83684e11731c47 +6937e5b7c02b5214ede19fb749eb7b33a4212701ec325a343a7694dfd6be76a1 +98890826f825f18ad39ebad76e2d9cdd294a79398d431215dd95bf1a663ba9e9 +b130f8e80d2260cddb9344b644ce84974ec8787ab84ab4b9517e44fb09d77a36 +102df99690bdafe89b4edda58c693b7f8619039a3ab676f10d37d0be02b29bd7 +da19c67fa4d07c1d562a65247932762895fa5e9002c45e59350ffb811cc5181f +e8eb49a988ba3342d129e03e86ab9b16d5a92b4e872e973be41da232878cd14d +f9d2db75d4d5285232ce5e4480fbd0c035dcc427e35a9773edc39d4b17f1eb09 +e842a7348246f1d69e3a15f40443471fac10aa392adb71e66b61308508ba380d +64374b66e8d234fc62e392347dfdbd4301cef800aa88f29414f8d5d625ed4971 +f49a4473ec350715c296c71cc7947091b49b62feba902f3d68a29e67522b0db1 +3524416b434fed422da4563d3349d19d187f7f8fce150d746b4a038224e123f4 +8e27c8b26a83d039225b551c489d1309dcdf05eeabc4c1594a0ec8596c2c8a05 +081c9df97b8675259256b8531fbf5b684e7ac076425ec9e4082530763c9142c9 +808c3da66c0cba1f5f704a4d4d25183d243c01d33feef4119606356be453474c +bec5283151aac2b18f231c6542ecd340f07cd7728db3b345aeb977f14962d72b +e54f4db3e5596d6da03985689d8e6929a2aa8cacbe9e14b539cef80b2edda603 +34b90ee98455008b4768dca85003895ee04613075287741fd8ca8d579dadfa69 +2a5ccb49a6c5257296f9fb71028a6cbd52f4daaa7f089b8a65f1baed85c35313 +29afc857a7b9bc8ce5905ff58730033c8d49a45f9f098c39a08c2d537ed00b01 +a6605633e2eae0971506f3df8248ec06a343a4aa93dcc57bcb9afa200efbdb0e +543f964e8b9b524f460ac8a72cacdf807b7dd6efb9f768aefb928876e40820a8 +31686dcc538e5cfd348ac3b6547add583322b3dd982e34ba161ebb0a9737af1d +580bb24095d2629a6db07413050f653e8700156bf5bc85ba077c244a55316841 +aaa3c6bac859ccb7cb9a79a7c9a3704431c2caccfc35cca5f3851a560f5720d3 +34497b4a425b539cb74d462463a8ac183c924a8e53726325cedc4913b1ffd640 +466ac24da3595c7f67993f9b6c22ed186412831a0724a352c9670f6b5df44513 +2f271fb623984cc1f8d268565f5def71ae23e6b5ee14e33c7b3a247763ca2a4f +9ca8f339add4056629787ec74e0bf54b8102e4b22c577f9bf3b151dc8aeda087 +bf05c29721f2e7bcd3433ceff31fb65cd6fd530ee077f4f0939ba37cb38411fa +fd11e1dc3e910c2a7ca28eba1cc381e3e43c3a78cc1087a25631238c894dd752 +46cba9a8df26d9d44a830a3501fd65a324d63a969665477cbc0306aca018eead +533c7685ecd289573423ea384eb629db976f9230d6a1fa6cff299aa98de3ea79 +f29b4c274eebc64bf619fbf552d6ae9c60e7c9de74036e434a4a6dd6e671fa41 +b8cc4c56b811f6ad0cc459fcfcc2bb3654928fa015fe4c6b1177d7c39c747fbf +5aaf612f30b889ba576d87dd4208a9e99becc44753aed1480bd1187ec5172632 +25d00b69d034e040971aad2beb20710f726a696ac48efb960d05a0f6f6f47962 +2c5a5690275e47c173ea000d392e8c20789cdaaae0637e01b321cab63858b0fd +901209b323dbe6c61c10d9bc8ee9acbd2a3cfc357f33ba4d5003a337df07d9cb +32b7b7360148291c45a4d34d4d850ceec2ff978a5f0c90a0420b2bbdb4b6c778 +fe9b5a41833940a0ef9fc0015e0d3e6c80a9bba970c57e1218e10c0c8b8c8808 +2f444af6ceb012b2d9ce6a96eaad590070424ef286225d972be1fb2ec18e713e +59497bb9917a173fd07507a422e35431fcf4fbc6ca86086f289c9680be087a55 +873c75e7998ddcde7b71c54b3ed2f6b3571f0fb3d4c103cbd1ba2eb006596829 +cdca02d166fea0f63fa0c044ddf4e3d941413b900f8550740e6115a86818dfac +9dc935f8842e0b011d2746e198ae3a4fedebd8245b8285b7dbec0ad0a6d1e277 +23ce1da5867caef28cd21cf6378e43858e596f5ac514cbec60d57a6c4c6a2820 +b541f4d6fd50a03eeaddba07e236417341ce99fe674079a48725c6fee9b3293e +7e2b593a573681155c344b0626ccc477840e49e6d7b76738dde7b340341f4edb +30155156049a4600f1d8c17c3dc2496776425fd23287127d5a2f0d9fb785db1d +9be6f1b410830df7f19f4c432c7c7766253c67eac8ea7ed19bb0df2ceb178adb +5437c8d85b7b27fbd2c23d2148305ad2d44ec69fc26880705d4efc5daa7a1a6b +3c5790e1d691a9975ca37d585c845cf15fc3c7b152e29137ca4168d42f8a7d98 +876564c9ad163eca51a2cc404ddafdf61f9139021d7dd275da494fa167267841 +b7903394140a7544ce4cf8b582bc8b0de916890a560ff490db22dd7b27b34ef8 +b8ac86149645f63306cd298b803ce40abda69ce13dacabeb0fd3c44248b49232 +2daa161603ddabb2498b9ccc84fec903b6b5cfff8e9ff5dfde25a69457d5a206 +c0eef48227281bb1866f2d3f13d96c4f26c6f6c2c8aca1359674430747c5fede +93ecc169a5855f12b362da58fa513ecbf15dc22e9ee46665507151590ab60444 +89ee1f1986af4e82c8502880381b246a905c5358e8d23e62c210c455b579ffa3 +d8b3e4d993e6c446f3fa77b1cf68c1ebeb463e9e78bd53b68f918e05091b6b9d +453ec9511b8bc1fea1025875fc38ccb3d8d4deaacb959b1d08a226b4c830b733 +6bfb8ad627152314212da50aaf2c2b5185e2429d46ad31cc6f9db819934e1af7 +b1f7e75aad6653b03c2b6415c11ff5c6918ee1c03e4cfd08de00c2240194df84 +328d780e49d3d616432272c26711cc0e05d88068bd009e5085d172c31c97a64e +f8070719ad1dd72d66ab78e8201cf1f67b84456e3766544471fd7aa45e706cb1 +37a9c256a0d9b2607d15392f7060a47409e4d6a5cfc310045ee7ada6d0105fea +fafed036a5cb444478ae11d920d9541877f8c1c3740afb763c4ccaf77f6d1dbd +40e40ddc6a430e8e99962ad32820055ee55cedc516b17831062d308916502d40 +255f786238453677e19b51c44d8f0be9ef19cd747d5836b65af6dd5c41ea6901 +b6fc9c5c7dbd04d3fb9f7f08a2beeb9d0c13aeb2bc1d5419ffbe2349dccf91c5 +3cb956df77eb73ab811ca30633e6d61d5534551d45ae24fe967cd29f8e19c8b0 +305283df0fb776e5d84c3edd20bc2c4df715285926e95f2f4c3b963726d2a7d9 +4fdc743bb2b82bf4855cc0ab701876827457aecd2a69bf58ffb363b7fdaa2ca2 +8b7b7824ffb535b9a74b00e90ad3f23cb7daae9aaeaedf7d2b97807fa3329cc7 +63689a645f515c11d4e50dcde110015d5599859ca67f59da7f93ab98b75edcbb +f382f878b9b045b9a114b2b4bb6404c0391c8ddda8d9d635a9e3c74d7ebc604a +d07f0d4025e39a369cdbc672ebfee5a287e07d94f161e11d0e18bf764af79a08 +f15543796e4daa5c3497c4a3986084e7a9ba0789a2ed2e1432623b03c210ab9c +e59dfc017ffc59039df164157fe74dbfb00087d3f4026f4d625c41250fd4c09b +b71495a7e2889044e87bda9d1c514734c3d14f4123af5dfb6d618765845f9730 +c66751d613770679c554cd03d99f4653db05440e2bd1202006a05e044e501381 +5f51c02148a91edc8af6143aecbad2804038d2381f7436db6d46b0e9364a893f +5531e49e42a740a40a87614d10f9e22d336711ff79a6b7b9f8248456691f864b +4ee2261a13ea203f282e36d6001cba9fa218c220e447313420be2a66e76c4c38 +2d0cc85cccb5d4640fb8f923e1c55c9dd5cb80918976b5e898f03263177b0832 +2b1917869cbbcfc7789f3d799cb53183bf85b89d9850c1a0c60fd6a0047b5f97 +592f3dd46718e25395b6f13c20d121bb1b8c4778980d05499ca442b3d4363491 +19a968f8a0ebedff2b95cac72a617172cbcef5c6e706b9bb1d9de6431beffbf3 +715116cd1d9207402ed3453f6d343b92cfa09c4c23f8835919e183d14526322c +1722e4eb7e8172b1c8c86eaf3a2187bf9674f482e1623163d2178351ac35028a +89aa2668c0e10315ad5b5f65081e768bf4b02fe2cfa1e636266c4f632d1c57d4 +bbb4470f51d06eb3b26a5e02aed0d6f00d27fc4118b8a0b8b9ccae2c307fa7c1 +83b45122390c52d5de9bba735546c29d40027ca6c00ef6a5bdb99e7d9dcd721e +cf6f3760d25ebd62174aa9c563a31da6a1225e3b4ed652db5b8fcf013954c077 +ed730241f4c26e0d2cbd1c246c855e8aeed5c8059e70d5bb8a1b7ff37e2d9ffe +681f6fef2788e4a603be2b272a41946f63da44978d2b03033e5b44d098998d03 +05fcd73ebd820e5f93a9e9f79573a60b805ed0375c32cc65a1ef4569a893baf5 +45befee450304d67cb3460a10d620e929f44e352157e6d12d353fb3a5bff0a90 +4bab7dfbb4fa6c398877c79fdea6bea230d2b6df6b46cae2dcafecd544b56936 +40a00323ed5c9e30cbd14b40f93f37fc56011bf329ab6fb5d96ec229edd0c541 +ed4f661fb4167ef9c705b1d293dd432bf89b33e97a0dfc1ef10fe8d4c863da2e +b16a3fb06680812c50cd83ae377c94fe26deae946687df5601e56a46496e2e09 +bb38c3414580cc1c327853235c483cf4600d1de1dc59223b4bb641cd4f256092 +9e0f3df061b19e8515fc9163d4f16fb3ee44a7a8cb1df1dda0ab32adb9252005 +34b21ae2d23b5d39399a7dee2866d2962445501d298390bc870d2d9ddb3586aa +1ea3ea0fd2ad4458cc3b80c65364b893640c1c450505346a4f22d17bd44e7ba0 +09368203f133338077bb806db218d3aa4c187fbf7c440d48cd18ec75fb218210 +ce3081e0a56a7b44536910cfe0340c3f48033c9eca88560d8207c31474b42446 +6be9d5caf07a46a7892c24ca1792b5b3efc4dcdad2fef5da25e1b0cf22f2ece4 +0dd8715df95a808a223e3715a4a534bd276b6fb114f8493f72521f15e2f7c194 +77e0072d1c8f2f5a6038f3a91d5970656d7f3f740eecec42daa6615ebc893a6f +cd030de96086b39cee1ef7e9207f1bf228c1fba43c53ea2b34732cf63bea3ff7 +60d3abcd75551d0b8e8d5cb80646ede7706674a63358bcce4059341471a7df8d +f0bf5fb04baf4d41719f505923085f9c48388ce354b4bcdcf4fcdf7846a565cc +38385d0892a856ddbf7f712c156cc114a67cadab7d472be7890b298ce436206a +a31e770c38ec997a397f5af152af3df7e350bea9054df0fc53cec2f4a0ced3f1 +5c59a8436e4f14ff49b66bc6f9e1f1d97d4a0bdaef25cbaef33a0f7e951410f4 +ed5aa38b2da8ee932ba0a414ccf256c5d68271c75d51fb4fa4a7b66d8b4307fa +82d5eb2e0b4681edfef789033b08b70c2e35b66c5f5b868a9825247719d2e14e +7c1be51b5cb7b69fcf20f8435207e803bae6bd01fa949bd59d6e20c3ccf180e7 +e383fc79038a439dd256a4782906723448bedc672c980196562830632f809645 +872deaf72534ad4d42848ce497ff12d28ef0fbc728a7f60d60810db5884d77e3 +bd259d298dfe0e4de7695fe2ab4a43ce1100a5f766fca8ac44a9c470369a151a +728d06bda6ac3a64905a9e7cbe1462bfaaa9a4d57a317682a221554fee457aaa +485729cad67fbb139d4d7d4645457cc28575160493cf84ed6b4cf733052bbc95 +1b80a186e49dea1eb7f4e7aa45fa5c3666ae749676bca70674be4bfe6e196bcc +9a294d3af5424dc1e994e0f0e8a89fe667ab89bcd11353b441e0b24993b0c1d9 +cd7558d2c89419aa18c2e85ca74c013e53b8d5f0ae4c53f29f7ae09e51c2d057 +95423b75ef20a44ab100c45755764a8d0eec7d8f013f30264a648a75bd5b88d4 +1c92ef78305f6403da9a971625be0b9503ba6a28e440af5dbe1954d785a93f9a +7dd2904214940630ab80f88382486c437754bb541c946dfbbdcc28ea0bed96ee +517b2f4de993cced9a5b503a8ef1561b74aed495fd64a44fd89a0adf96442db1 +cd2eb39bc85a1ed8bbcc60063998d49f02d3dc2edbfebdc022b8ce3ead29196b +9c07622728bb9ce2bd992876c2e783b1dca5f33e8ff322f63209d94eba4ac6bf +108ee86f250a9a5a6ae5b06ebdd0fd2751199d99513609864b434dafeddd7d47 +713b3da2b4b12ec7b779003e7df7d4f2bc33c9cc41ef41f0d9529dd0d3678957 +4d66283f10091c41bd2387cc771c4499001ef2c86d0eccdaa904e44c3fb818d6 +703fc8e425088b3753472b6c94a946ddb7ae390b2a2a86e67302cfbc5a3ab520 +728bc8c399655998fa6c4eaa3385df60d379173deadcb5e7543f8c6a8ada3c16 +744ce62c12e0f312ecbe114fce1473bf1a9affb8df1a118878066047c1a1ec5f +ff9b8455ac309d720607eef62d2c0146fb73c256e90a722c5fe42aa19dba818b +17fa00fb024793c03613650640ad749c039550e418b563f2c522eb7a40543dce +7cda1b1322834ab1bd1ce555a5c284c9a92f666910af211aa6b258eb2bf7a28c +ba47b4f8cfefe17985470306a85bda0aee57de81220a5f3c265096ac21da57c6 +60bffea3d98f2358dba450b29e832b09e764b4e41f9952e2935e09e76941a850 +d25fa4f4f916552b7ee31144c78776337c67795e135e26cb5e4e80484fcef1d0 +fb6c8a86911f7358d5077f41b31ebf9886430964bd316f75710d83c7dd696fca +7b6490801cee0387b0fd42342322121f43163f512ffde8f284ff3aa1f211319f +5556d08adc1880b1cdd4acf7592d4ea358d2f34e69a73ea9891498cd3d59a74c +7a7c48629be752b60e795a12c1fb5f6d29ea48b1d32253e7cda453357d769774 +af1728837104aba991ab43309b2f298290dbdb32066b59b360fdd2f0e32b77d1 +797406014fbbe7c9fed681f4efa445ef694b26716a9d7b5ffb1375628d61d800 +70262b3011625594c8eb5dfd7147cd224d15aeeb9d443c88359236da5514d32c +2308414414c22f47b85d88cb6954eb5a7bf4283754b6129ff9ba6fcd78e558e3 +281d4201679a411ad5613e38f5542549325d6fa0c15225eb1c13917b8d33fdc8 +30b2eec374994f6b6a19701f9b3a7ddcc8b2478a8601750da43565c7acb34114 +cd24f87d601f995fe17f94a33ca9005c53a5b760e6bdd4256f716c8d59d81128 +1e72c01629c2242295791e664f490d2808fa695986534146942c7cada8efcce2 +bc3ededf886ef8f4d0ebe0839c90496481b324dd7de90e2713c985d0dc196f79 +059f964352a2c72d2df0b13a4eeca5282091beab8bce8f1d305464a8cc69515f +99c720e6e2221be1047c938a112f3e31930ad86bef1b90fa747238bbcdfe5a52 +92fb9cb8b9a4165c7b0156b550b536a7680f217f0e7130785644e1421a57c9b3 +e94d27d62d2835530785126d553640f88f4e5d05dc288743817504d48fedda6c +637c53296d2703c986abadfb74f6f830a57c0c4915ea7758f2dc0881ce5a1426 +3f298c8ddf55dbab0a8f22e8fea76f63a565059c72e693d7e29a104f7f550d0c +3d871d6c7e3c2dded288500f8925fcd72cc838545f2c7c05086cb8c19a3c88bc +dc738a47505ed1e76616fdeb9421861d5f88b0904deb9ec637c997495ba85d93 +7a491a2b125e3a7a97046bb2cfc7187071067e6382a8da1ae760f513803404dc +47a7f93b8f3a0b2ed5f033d65db9a5d5fd11db4f10152b19f4f5b2f48b8a95b5 +50145156dbd721997233961621f5a64f1e6513472e083c2a5357b08537c53b9f +07b90663adf19c5028d53d26c4dc1c540c86e8f744c8e1d02dc76f137bfa6a06 +1792d82752b522e8911953e0f58906d47bf089ebc14dd0d9948bfd6ef2e0c892 +c8ceb39d382ebb830b9e6ae7cb522d189b34827f45c962b0da89ce3ff3e9f6b3 +967f59a7076733d65ccd8526a3b3db8ff45ed6c16392152b5593c94a1842741c +2bb710e4b331fbd7bfffbfd77f81ef4d9c83b10eb58a2f51c4655f6bf062783d +18c3c06ea4e922e60cef329de28fd55232aa8dd4224937a79723519b3b60504e +5994fa207bf4e2908fa81ac69a2841d21cadabbb92498416a04630520b391c68 +30687dde665acc525e86fb783a3870ff43e0f0b55e50798dcb788ae93666564f +ba7a6fc3742c86ef7e500d2ad2b77ee29348145b0738579189cc36d8fe15c5df +dc4b66450947f168347afd5238e153b9f2b1d7f64373c0a90da71eeb18f72b9c +f3e48ffff7c202ff5a7c2cd53a1c967f7d71e7cbb4e4159e5cb5f475ba0fef4c +0713a2923adc04968030dff07fe9489eaafb0095e542aa9497544d47dee12c4f +160ab99511673a43cc89c8629bba5f3863636b9ef246078815b283d9b7e91399 +e74cee17e147ed7caca02f203ebc977618ab18590e217ebd57e41ca020290d84 +f02a4fdb4f2b97df16b6cf7e3519eb810b654d0c50c4df1e68cd54bf05e52e94 +7fb47f105e02d1a4b7b78c0ec9f3bfd54b5cafd746322614ea56afa4d613d5ee +6baa19c573bfd4640f9428f23988fd9f0ff4a49457e7bf1f25392d0d68eb89ac +68f43c2c2e02bc83bb45d9f541bb2a6ad28b8c70516ca2476a52edb1ad4b467d +63b970e2e40af4c59d46070352162eed10bf2662217b32ddcaa42b5c9ca7c486 +f3810c51a5c9f25af078ba635ed08620bb7b91818797cfbf47e7d9e22ddc1d47 +de4a7765c4566b479a1c66ae9362bd4bb7dc3db16daa5d27e79918bcc11e995e +3055d826b489f527c5061f4d46606c7a4375ba317b35e43ddcc5811448489273 +c8e114b48d9e4e32fef51ae8e4440ba35f4c7ed307fc81cedaab0264ad7187f5 +0bdda954f5eff597f65759e538916efe1ceccdcf33c363a5879e78f1f47dd1d8 +2fa4a4cd61fa4d32de859714ccee93b1b64a3c7d9d6bec30aea2b10c896bb60e +c8336dbcb047e66998ddb368e1f83b94bf3df73639560f568a5aafdc810cfa37 +f2c53a0f3a5d54fa0cc59a769f862b22d654472d9846099f5b5841d5f30982c6 +ac2feefef527613aaa3005607cd82cd56073dbf37d446f53c9509d9540d4b10f +ba4198cee56d6c2448112ce7431a382fea84c92577de8ec194e3227b378ecf02 +a8443b9f395ba5bf18899d37b2cdca0df725fc0d3f2d2d010ef35d1d11009c9e +23e611de999294c5b3854ac2cd44c6a3b5d93a2e3c0979f2aad87ad368478739 +94f0d9d78334a8cb0a9ae03cea4a9a211fabdb4cc1c50b325754e9c615facb09 +6e5bb94dc9b4ea3fa0470831cd8eb273753710a9d0e1122e0390c763c07b7296 +9b1ee534c46a82e62dd6d85eb1242f577a444cecd5caace05ead443675715ae4 +b2e89c8a3f861aaedfb882b2217c8a59f074ff7666d9dc0e77760e8ac0131580 +b4674ee1483cf7952d5f2614af279fe375d9e80947af930dbce773f89e2d1942 +55cffa5a25fec611208a5347d8da41d06b265537590ed2a18dd61244561f6a28 +6aa7b7d003fbfc182bf399ca86fe4f3b0f9916b4be9494dff4dde43d543b4475 +2dd8d8921b631588a792ea159aadc9a05b07bcb5ccbd39776eb733a2340300ca +d08bec731a9d17bdfa35ba445f38db9efaa3f8bbb550cea8b742c00ed6237599 +9b9292275df9aae57f782a7ab34a92782a0b1be183913061201faa4340b54d8a +0ae2acfb004ea2366aef056ce8a0a0e17cde94723223eec759e7abf285a133d3 +ce981716d305690e627509df3701119306b8e8adbc9cb7891bb5faf9a6b81e6f +8b25275bee86edb442518ff110aadf7cb120bcfbd380af3c91e62f1cd51333b5 +6b25de8112c6d47e77bdd08e3bdf3bca8f20e6b96b687450b23fee7ded8099af +31a25c939402b197b2356cf9d4d882a02b01a82bc7091775941e0c883f9ac2a1 +30ccf1d51440f8aaa64a2d0eae3c5ee5378b3ec57a27a6be73e3aa6676cdf3aa +c6ad5603f20a30f032386d1293ffd63b98e751c6d937509bb27a0dbdd677ed62 +dd628e490b5a3852d2841774d6a3c16912b76314cbfd630bb48b958824aca788 +36dabb0ecdab2a2da7722c9e3b7f511a56a2498b329f11eb454b34b185704e3d +8c244f54c36945370aad2050fe034726f739edea05b164662094962904f8474d +263b43008f4ef5de0cc69c9dc7faa91c6beeb28d2bb977fdf96bdf27c4a49fa6 +bc7b802373517aa1e4d43342d90acb99f8db854b41bb95fc333e3fe0ccbef3d3 +de3abb46991ea91baa44fc52b96d5c5d683675fc6498d85daecc9f467dc76b4a +f039a69902c5c677e998367aac1d3a765f52d55cc48ecefb30d709056d22c8cb +b21a422419e6b9b9b50b3b5ea417e6b079d6fce2447322a960b74c33e4f7420f +0ebefc2f36471c6f9997afdad5632ed7c0913a76b7314948696846b793aac81a +491c8640a04a0867eb16d497ce0f26bbde677f840b87dc743122a144ba858a80 +1ce58bf6b3e5fc0fadec743ecbfb6f8fc19f778a3062cb14cf9556289e7484e8 +73e950c71c46b940d60a6a718fa72927e770e7a917987ac5f0afbf0c5b3c5ef0 +591455ae1aee69f4768d690148d8e2c831febd5b60203914c960015edd0a8e0d +e3a47cb4e0093193dbd2b925bc3921f88b58d856b384b1f0158e44bee3e17306 +6c86c5a9673521f0c6dffd8413201a17e59a8235ec8bd63e60176ee65fd81832 +7782aed7eb7442d55164a7b35bbbb6413a36de24dc127cde8eeb9bcb1cdaee56 +7463bcccf86e738d7b5436d1079fc6aef850369c04139e93933ce920465fb403 +a1354553eaf1f8171fe79e61fe157bb8c9cdc80467859599354b73d983190ce1 +60171ad887b1d46bf64dcfe3c092a49e3b9447e1d2cecbc440a03a9ecea40105 +a7bd0e0a4dbbd18030887df3dc8271fad0a92b57da8202e425cb672cac0c36a8 +095330aba0cbf4635969d6f35d2626fe382ca7890b5743df92963de76e7eb4bd +bb8a9a950ca59a553aaa6a94ee66b9bb154b86dae32ea20ce79de441228c47a4 +aa40949db9fe13d761781807d8e7adf991a26081427cf719ae656d40f3358000 +37330a4464860a41a0653fe5fd69adb6a733f84c2617420527ed720b944f022d +890b2cdc2d7dcd26419127ad47a747c9d3e0f973ed50e9a83329294a7ef63b38 +bc297930be33e68046c466b7f44c3d374138e8ccfaa477db9ab5d83a77df8f31 +d330555acc08f04cc5e2126d4a163313183e0aaaa8645e545aa59c37efaa3663 +3c92a17a53afb715a6c8500dc1e2c7d454611ff5d7a60aa8859b8c3fec060f02 +c9576bda4ab3b101424b99e07096bb5cb7625bec43ffe2180635994158aa8b03 +2c82a993c6c7233d971d6c8306a2cfd45c787cbb5a1dd9fc01c9803689b4b281 +c82a7469992dbd60e611e37f0ed8133feb5ccfa57d9f091758622772fbc94e6c +54e3b3d94983d914b3fdee77954be3252497392db6b3bd290c85e0a295f98c44 +5f87998274dbd62d5c724c3cfdc2385c6b54c8f073f9104086d618ff37bb4e1d +5d571a0d41df55629c5c226317b77ec2c2441b5af0166517aacca31193143e96 +51ea351b6b17eb764be26591cf205855ff03022af47782095a3d03c805dccc44 +20fcc40f5a3aa7639853ccde5badc2a85248161a9266a60f17869ee89191524c +f286cb9cef6a48d9fe8256fdc6f53d608f99b8cfbc5190402cbfaa58e16a0e87 +9f4cac054676b5f591f831c07a32533665bfc07dec0c8439bb4b51d54e35dadf +5d81dcafc0bed1a21f0ef2fd67547f6f74815d8951b7cea076f26f5d19468e78 +4433f450bcd1f3b29bcdc72ec68385d908e773b6f9b1c137ca2b69b115d3bbc3 +05ce0e8217a1f42305c77b2bf244d298b53937579f5d54c94ee6f8607eee44ac +06a657673402aa59402107aba64d49f1cf28aa48ef73d5d0ea01218c7b06100a +9501fc2c15e5b67ad8f65eed9e42cf8a53cab1545dbf8c82803ec71a1bcda4a6 +0fa271fb315cbed111384051ddd396b8902ec7976fb48e216e3505a16a30e96a +8d2da699b6160c8b3b5af59a00e705479d78dda5e08870cbd81da9868000bff2 +5a3311cdd21326a47a665c81bc450ebb14884ca84b2a7a1996a558330a7f17e0 +99eb457dcccd90a9d303afa279b45af41693612953c0f086d9ad81804d09759f +c91df65a83c83edd31e652ae98f3759ccb963f40e83f532a98528911bde3d7cf +041c6f8da633368d1bb63494e8ceeade4b2a50e6f3f4203d2ab275b751cdec18 +2509d76661094660cf22e58264dbea4738f5b2f05a4b6fe97509626f79561386 +3e78b156fbcd6ba9df4a2edb9d56251593feba7c510bce2768252c66ee7a096a +0f350a5ae6fbb6c59f5369b3a94c7b4026f7f0670d7d7c01c9f4b58209a16b0c +210167490ae40b4eda10dfcbb455c1068bb91d28634da73dc05830a33e0f2542 +848afe96acc2bcd8a138eae0baa5d1b31436751c649998f3aea75e95f5248abd +d62f6425fd91506fd25f925097d6d67c6ca523f72e6a5b70164e0bc5c5781f5c +04bedd5a784b3ebaa00c5ec187b9f30b36a0e3f6e4b249fc4fd085d7fdd36446 +70c740d4dde28e44a1210323dc4b1d6319328970acd5102cf9a049bff4e99cfd +28ec810b2575aac8efdd65e7a9e6d929734ee4927efb0e25f843f9d4649d847e +5917b6e18e440f23166d04e721696f18bbdfab79cf291684b3f0e8847007df8d +114f4b3e7b7933859b0e27d019c0841f7ad680e54b25e7b52f8e729f9a62fd6f +68757a9a650f6fc3cfb39f7ae9f03566b7d5fc87d765bd97e08e87e021a0369a +34306fee74a2fdfb11f3b5f75499159e5c97a4f1558e78cae37ce871af94c108 +6b1cef84418ae4408897f5920443585f5029c8d70ed575c19eb1714e2aa53748 +f03c05bb82a355df1e181c1f3aec05cd63370e10136a3d912da64a717f66d511 +ff5edc9e42e15070b54455b95a52ceadfd2fcab3b3c338e6edd087123d2ed361 +ddcf924f61fcae961c6b8cda5089b4492f47db89088d80a994ed9551b977fe94 +8f2d92dc83f93067b38c91e873babd2ec1c32864f521770b3709c4ba93eacfd3 +74143d8159260afb59f774f70fc8a892f765e474b5e870d7a210ce552d1aa077 +10cb44f43b9c3e1bb6b0767f3de1d18a485316e80cff3a163b8e44970bfccb2b +ea9f75157b99184cd1313d47dbbb21fca18ad708dc914eda5ad4122f7476fb73 +2c3a405c091a211756647e53a010822ebb8cfd4d331a97a1484d239986732179 +4ddaf15ec99812ed7f55cee6f8f015ef62ddc931378470c5c1ab335f5958439e +f3f21f81e2993afb8f512783959134886b73df730f351e2135be658b38e005d9 +2be5950daae49a5db747e46f8376c1aa09c178b2d4d08674daacf05880852147 +6aec9a46230df3f4bdcd14081f0fd21801f7d26a0b0c5090a3e144f5f486d5c2 +85170c17145fa317903e7ad4a97315a8c4d0a9f845cb2d5fa818894f8647e94b +feac033768c71dbcfc7e4b2ee4afe82fa0f63a2e88d191e579df6be30dabfb4c +39116e045c791739845b789d2e5a4f4e138394c57ea1bdf03277fe1df2372e57 +824b4cac8751bf0d96c27c691b71ee19eaef51842d9a621a180af064aa774e59 +6d17c8f39b5095b8412fa0996136b523aa7e2d34a15ef1aa3860d1bc693fb986 +df92179b5c2c283ec1739a31c39df37e02570b2068fed8a7865d530b6b83e6d8 +c90755bebf25f806731eb5afe12c69b7b200595c5b9488511ce0b6d3e50eb78b +b87384aff6319f53fe82a57e39a9758b4c2baa7dd9d237fcff940c7dd4e2dae9 +fd6f9814b52ae3952ae507d890e8ef4e46f47644d15663e50bef06e4c6e8f4c3 +c9bcdf6ce9c12e59442aab2209222e8e9c38e8d836e47401d8912b5944783d04 +2185e0b5d202456311fc41e3c9aba816d79444213f17d96b673bc819a5afde1b +9fd118916aa3f976b67d40444085ce1295b2cf635a58d881b58e9d6da3cd47fd +c385915a260cf460cd51d103aba3b9b7b718a6cfdf6e31ff90aa8abd8149720e +7dec2fdc1f9ba1970dc589375737d50861ae4ea98b54f134d7870b435943e4fb +50896149e3f419de19027f01feaaaccf1578410450cfb575957959a3e7f2b3a5 +295a1e03e47d2cc044af13c7f8d2e28f7bc6d498aca27d9503e19c7993795444 +50a6820f38c24b1415aa1322f2d3dc5d7e7802067fb426beb22fd9da5d3d7f77 +f7df61f59f5228d99e930652925a12436362de55a25f190fa33c3300997dc628 +ac5524bf2954d119407635b2f866e52bd1a44d764df26b66590696abcac99637 +6dc90dce6b68da6d630587aa9cd14fd4d9c2f27d8355179cd1bef7eb8f7b3ccb +adaf1a938478ac5f858e712f0e908b394702a6e1129d6262b299a00e8767827f +dd0f7d3bfb425b667717be47f8792fc7f852e2f3119a179c7d156e5e020926f0 +1a92a05ef6346a64fbc0a1b09ccd2a7e09d6e848570aceff71cd34ed28ac95c4 +03a468a2439ee50928e555086a6d40caab8d40dd847cd13e67f5acc91a12ef37 +85967f08fee498e5d9b562fa2cd3473995a0f76b860fd08393d4e59c38c86634 +f9d044b6d6184ff952b377691f3970e155f07412a640d49b696e3ea58cf60630 +ed965503ce7a6c0c145b6431fe0a5dc244173a089a49e0907fd2f8fa080f38ac +ff70eee1ce6089611df1f488858c74b81518bd028d55b437878dd4d14e8d5362 +10fddd8c4cc9a8ee14e961481d0c0b00606084ca496a88edb25d984c34f6c1d5 +a85683fc244cce71b54eda970b9111a6ed2ab33c63fda50b49d343ad5eb6562c +01748041fa0f964183d14239a0292d06ac831129fe7d7d34d0c82f1eb011f207 +c63fa085625feb4b87349abc9a065027ec25db3534c91ec2843c2ec4ff4d1b27 +1b1488dc1907ceca2d4eacf2d0c4d4c7ce6c42ac81ec78e853baf03d3941ccfb +03a5dfdf040fbe9e61613d9147ce6f9c10e4f96797d15362467058bbe68804d7 +eb7113b166df726b040f2cf4aba8bbd3ed943c0715e09bd676cfd457a3c1113f +eec29889c0e8286c314b74e4b39e2497c3c5dfda95278958c0995faa6dd4d9b6 +8dc6c934b1463734ad0c71e641298ae0aca519168bc667ecc7239cbefe78f34e +465b10de38f54923be640a55ffb991a0164a6f8ccc09c5b041809e6ace280343 +0f447b22a97a8a7a340078fe1b765bb6f55d340f757ef8162162883ed66c029c +f7ad3264829ac8c8c26f9d76d121167a912e1bc1e2869308499a1f8dc9eea626 +fa3f9d1ca80b45c3ade3621a3d4ba9ad3482a0e13bc7382af7157633adc45822 +d9a5c8a481775c8a69765c8956968affba3c77c115532c7680859c41500c13f6 +6f5b445374a79bc199d11930b2fa1cc1f8c76848b7a34c65f24a86acee4f02be +4eda4c7da149723748b748c0adb67c01eda2a9c0db4e527f289281a70c32d574 +5486d18a49144a2d6f2d4488f61f0803805105b307e0ab0f4d795a0139acf396 +9c3cd6092cf0fe955653943dc38f9220981efe8d162caadd1f3587a5f434dd9d +0a5efddb38477d669b1f2ddb90781c790ccf341d0a348112b559746dbcafc4d2 +e9c81839e66de708f12e907552c99140c428b13920f459a455832917abc1dc21 +aed809121dd4a9df4133b84378e413e62a0fbda75ff4e86fb8fd405dd3f252c7 +bed26aa06b485eb423c2aa83e0a478235240b19ef7f7ff1875c21831c7d50eaf +ab4e0fcb929725dc92823eaf498c806a1b0102be38e754e3dc87754d1f480c64 +30d95da626a1c08434ad5edfd4e6be96a5c593b96f062d7c60e56a4a07152c23 +7fe4e29b99a23cb4a93ddec151cdc68fdb8428791987935574e53b8ff6c2a4e6 +4c6b85c47607618740797ff21b34f6a4a534523c649fb18798b55ed04d9080b3 +67bac8232a2be46e4d973f3cb860f1058ff46f7af441049855085e9ab8de8e1d +cf035c13d86c62a1e7e39bf4cda92898a21e9d1a878f8cfc0c485d40c35d2443 +87a3a20eaa6cdb4920f6779fe9fc3832a61ceefda3d6b45b5b8c27845c2e9e2f +c572e80423fe40d6d695d11853d03ead0e46974105333111101dd791c7b03f6e +11a7f39a2d2232c9452df2e7831261a365e3e79599b69fa0b787844d05c538ef +3274761f16f644fc94a7fb6ca0919fe5ee78539b59fd0232fd6bdf8e9e4b1c11 +485de6c6c1dc27f59fbdcad2790d1f9b9dfb1f88ff3330ca215e36636dcef81d +167456983820580af7ba55c1f1c6b217f8a11e487fee442235768eb7b95fdf29 +d44ab8c385236c3947925137e26fd1278d4d3fe710527d9b017692b357aef874 +ffa8c09d59b78f3175f8fff85cb4d3e07c21dfe08db6c2036e98dccb11461fa9 +ef986be98232c893e25d76cca348df852963d1fadbc217658e33c49bacaf43d7 +1ba692b8e65feec21749e489c90ea26fae3540cb3a2af56b391569fbe2e6e1f0 +4e5a83c374455e1fcb6dd1adc2ed96007258416817bc4d1585625bba98ca3ed7 +f49f6439bfb0fe67ee1752ce1a678cdef7d9b02422858cc2fda1b58d0a62f598 +4f78daddc56c29c9c5d8d1fa7567cd69f58b3f6407f925fcadf6a1111978e51b +1730a24ad9f5bd83e7a367c8e258c2d45f2dd5f7c3034690e968ec4eb4746a74 +d7d3316a6dac948d3db0b8d069bd2e833120668dd794d89f99166b04fed9cf0d +b224d6985605512acb08fa6e27a8772e5e968fb66495cc618aa42862174f174b +b400f59621a17bbb22087385ba839562281503632921c176c9e6c27bc2aaabec +ef388fe9cb262e9305e78ec22a52f0bc54e0c4f167930de0558d3a3f228ac651 +932828895747c28573d3fb5e12bd7dac2ea2e00606f1e34ec36443822cfc8258 +fdb3b8f3a8d80fe17c6ffd932d63da28b50183071b30b198b078430f8c25109f +710ccb6687fd2c3bcee778a5c80efb9edaf2609d275741575601b52f9b7fd6fd +f99c10d28f4576c29530ba7d40ae384be27d88770b0ec8d870dd3e4a20a64476 +a30282b0e816c58080b09eb651c046ee91f52ac08f6c264a36099659d1e50e75 +ea75dd82238a36e7ca1c40cfd44ffc12051b06f24c2c4a4bf4bcd4aac42814cb +ff434dc7c0a4356f4f9395913fa1df17e1ef2caf2f4afdc87189276b09988c55 +6b6bf8f4698d33e6acfc89e1bc25f0614cfcd94e575f0b881c1a8ea294996482 +ec2b1b0a6e4645d68aae01131692336fb74bacc9d91194054c76b21c2b01a8e1 +973e402e8915cab5c0b11da03ae8dc4bd570cf65746f0636a30c8cfb92752bde +277aff02df8402201779f4b675c09817faac3b384f6b334524b08ae52b7995fa +4e3c0a61f58fda7416db15558e1a6772a2349d2e1b1c669e4ba39a01b7b18c98 +aac82b5cddfde1daf47aad0dcb6ae96593904555ed04ec06a4595238a3508d4b +4374bd37d3e8380f49c01f39c0071655e8b0808e9be5dcb715faa15c7875871b +b9c75c2e0fccac1c5a597ed1d84a7f570b9fc582c6e54455551fbdeaa8796f01 +5800bd5e2530399b6be18f4e406e42ea671406ea691c732ab92182cfd599bba2 +5abbc1f25965c5696dcf2f2e9c64e138dc10bff55caa9a58a8c34519f8f50d52 +894e1d616938225abc73a28cb2f9216e8b7f1928a82194463a6092356aad8fc8 +35af7da897e58ceb6897ff6930e2712ba97e6c53c470d177c91300dbd04566be +233833750c2e79b320c33fb7413c856a37eecf0b89c9079cc7d70f8c62e16437 +3b8f43e28aeb470b8865aa04be19307d3ed6ce12940a24d8d43ebc16ecaa905f +2d7183d425035db5d77b518c34b2f002f199d27788664aa94551a7a5fd574368 +6d7a10851ab124640d58e0f67f0ad64bbe8c7a2654a29391485e571d5542f87d +4d1b016cfd97584f18f57f6bf9e2fc514cdedbcf3ebb1518e9b53e8b64752eff +909c7cd0a34a2cd3a945ab3c7049e255ebe0e40a84e2dd81d67e543ecc5a6443 +34450a5cccd34edd52dfc43fc420ef298103431ed1e49e8c2b4df26fd0727bff +7f3ba05b16232f4c795f93a5912f6002c43aa243cf3dc7e4fa5c8d9e40e96985 +da2e3ead98770fb7c07cf8e71ecff35d2c255d6a3ab730ae6c2ceb3510752f0e +2d8aeafad5a4ecb4c4d81dab5336d764e8b7df68b5088d6dffb9aea0db0f7384 +7593dce3f68c793ec780cce00e92e28a342d05f2d0b0d48fc23336c7e0dcd610 +a37eee3cd6863fd4b74eee6afd6f2235f92a1d32d32fefdfba511c8837d6eade +7a27e375ff1235557486ef07d80a2cbcb0645ce7d1d2fd06247e2b52d47a25e9 +cad734659b9bead551871b85a2aad1340a9649467a791d89c9e40c6ccbed4f1d +317b63eb10fc5b913c72e9457f0ba3aef5c50bc83248782c220ba4e1540f7192 +002c183e861eb1dc7f4f74a44088fee28b03979eb8e94e9392dbc24aee6ce563 +f4953106b2d7f71e2d38639965fa09d69d7c5569b416068612b32fe5faf650ab +8ff820bb496ed9a4b025874f7477feb37157df5a35dda9a19a7bc3fd604e4050 +5a5c5ec5e9799cbaf4a8d525d2db9084f07395d03ed7a95e2adb4865cb36f3ee +7a8cbfd35faaf669c4fde98ba282e5d2fdf8ca495ca7f1a054149d15a6138f69 +9a320b1a30f1faba3ab29ce4c5e4490aab404893afa88a1b7ae6731251e15db9 +b00e5f82f5f1e03145ae703849120f65fa475e1810a0bc636cf540ad441631a4 +52ab9767b4bc16efbfdb5c197501b0a8344fe008afae144c126eae037fdf9364 +f743c060bc4d17116e3a59ed0dc0e3218949c3d9259a6a4e0be391e8c8455600 +7871c3e0db8e7939346fe37f14d7a980cbd945bd85a78f84eb1809826c6d15d2 +628f170976117ed59290231459cdd6dc863cdad13504bf2da4c38ae32259ffdd +f9325ce161a472c192dff26a10bbb74f2209dcea75a92fddaa50bfbfd12f6683 +3054ac58aa385b4e00bda8c962261fa4edafa0e85ef7fe908662b9f1c26cc471 +f28853b5c50652538f1b984db2197805deaadc12fb9cadbb68399bec0f707bac +dd165f865a0e9a455e0a8e317b3b4c75182a5f4001c5c4dd68bdaab9896090e4 +f7e92f51bc147280b33249fc8785acbf402441e769f70b4d61991c51f6ae12c7 +6a26eee6986509400ffdf62268092c7e1ff78ae963673b60d874d2a57c2a1822 +d24822a1d8fefb88ce18b20d446f560f86e9238ef3e78d54ac04697c4ffcbc40 +09b9c1c2acbba6e17ee5fd9da57fa7e0b6aa720103862c9e5ff1567506b5e09c +47fdef0cf04e4c10374eaaa0c47957ffb4fec3a9ff0cb465a10a5b6a09fdd474 +204ae694ed6e2b31cbe9333a6be0dcd9cc1a17672fc2be032386351c4ffa4684 +42810dd1c372e10a5343b97d6f623968691417bd32fbda32b1db60deaefa4df0 +c804d1c1926f6abd1e8d8fd4087a28ad05cd7b13080490b1bd03121270adada5 +e94a72be1e1c7c975d95690d4c2147026e373d2f464dfee782b5d074cf3ba1ea +f669ccdd1ff040728bb9bbd3f27c2c63f0d381042a5e3d5ed43c397513a5aaf7 +62b4e17f1687eb9bcee0430b766ea8e1ecd137035a7c90b29e0e26b76ad542f7 +26fc0017903351fa32c9e9242aa77ced9f71623ca744ada6bf0ad855875ae6cb +90d72dcff52084c7969ea06a49db1c0a2f11a82b5f524d1efbc7a48640944d28 +2c92da4d78aa8d13dc57a2aeb3f39e788e3563b5e6a36d78ac1df07dfc527938 +a12a129064b6e581d90308e2982fbc3d5eb92d7ab8b2e34cd0b2b9d7979def02 +e9a9559cfb15221889619ce00ba62c09dd6fb51e6acee8bada9573614a0ad0f4 +411d35ddb1c1d801a8970071bc5b7b5d1c41e14e96ee54208f17ba69ce95977e +de58beab72e4c6bf484a8325a96153ed4672010717157034e02e78ab861f118c +5ed3409b1db8f05f6ebe0ad2ced8008a73b3cd355da36c721aa40bd1df3f5af3 +41389a9b965dc43002ca70a828a849e41425c85cd827fe6e5416d5bf18347726 +241d22d665332ea27392009e81b3a24442fcc1b62832e7b81b02480dc6df345a +ebd859cbe6a4d439b8400f4813cb9001f4c2fc67d86350d2004f7075a8264ec1 +e29eb0b255c6bb530206e96f39611d5446ec2c468acd603423137643e26fa702 +942d436bba71856e248c89000a6021e8bd2106861ed20c5b02ca4da733102b97 +7ac7e43e8099febda83003b6a4610a9fd0dc723d506dde420cb36e188c56bde1 +0a433a8a85589d9ca5fad1533da73075afbedbeb5358edd0e57492414a09dfc9 +418b0910b3e32efe87c0fa8702480aef1b281a5acf6d577e49f801626b9d5532 +d85ce8bab30b27c9053f740d9b1ab84812071dc7294fe5a79dccfb8ea3d33e6d +514e303c806cc8d27852acb180e2cfe39c72181ff35c8799371fb5c0c0c002a8 +b1b63207ea72646785a35c4b1d6b7db906f1a1a814c102587a4640eb8db15ad0 +4d99460c843109555b33859b1aacb2e527d5aa120dedd7e7ff078de5782ff5b3 +3aa960e29b51b867c111a439bbae20cdb9cf3312288ad9eb549a989d863225bd +a7991839644cee9cb7b2544b41e4777dd3f0dccf0337977e32c6e9791781b091 +2e568744cbb4a2c3b431f62385def0ac69ee221d4e339b407fc5641b1d67026e +76e7c4425c5c6b8f56a1640c0b78c3c514138300fa971c220fee8ea1924802c2 +f58176075ad39d4c3f336a758956c1502539a23d67ca167eb119af5a95cbe134 +5989a25786ecb9b34abd0b5814468cc339bf0df3f63fd5032f0708bf0cfe1876 +91430a5ea81e649ff57f6a2a89e97532d7b58ab4d9be95e234885b39a73a7fa3 +d0ad9eba42dd20ebe1c4805641341b7a06ba786fa8c95d055de5b1b35ad51ac7 +d3a98d7e9ead882c5a0911fa45692e6dbe34f7fd318c17ed7094b38bf7113f02 +053f3b8a8c74eff956bb5c15f6cbf212059a2edb25528f60f67d6204b08ed8de +b3f591ab5fe471ea4f602ffd6903afd034eea6b4fc7ed858c20d1e4a1c343ea7 +bf6283d3f3d8764f3b89282188941876679b48448645aabe8a04b8ec12e8d76c +75a5500659e3cc3109962fe5c945979c8f56a997fd806f3838337de82cefb25d +986a4e39416a170cd2c2bc223838d24b15330cb2352ba753bfc0d084886e7221 +2d275a4cc0faec6af2cb8591db187da7503e479c83d2cd78745c939088650573 +e9e60b3aa954044b347a63eef25daecc3aeff608cee0c3c3a7864081f7b237e5 +6806e57f68012877e0d4210e85d8c0f917c3172ca19c6fb9198ac8456dd9607c +aeeca44bb0984130da6830522697fb5d8408430217ff9496275f0ccc323a9bb0 +52ffc86a010d14478ac6ed38eb6d4f5095bfb738ef0d88efbb5d26558f3691f4 +59f62b6f3d8f3c2bf2a87634d6b65b5c7c0dd9fea60fa51822b8e185999b4c60 +73730e89c0b8e48bce1abc500c1929571afce0ad11147bb0fb682c976e67947e +6e02b7cd6aa88a3d578bbe3ea88a458629dc8799d34df525fb56b5618fb025eb +c50f0659d9e9922f0dfe78d0d9c8ade1beae1cad423b5d63d43b0e50b8a9707c +6322600d467750cfd7a4603bbdbe9e7c01899a3447ee96c66a464859cb0a886c +baa46fce0373d84f6ff705e177497315d48a1b569ccfb7ff6802c2ffda806e11 +8cc119e9401e0ac7745971d33f21622cd806ef4d761d23388d632470f4c04ff6 +ae7a008f343d80bf70a7d02a9aec04ec3953501594ab91fdad11d6119e6e5ff7 +5055af6868e9ee262c36763b29813f6a6660b18635ca76c9ca7da158f9cbc823 +c234598ef5e858eb25cb422a0a30a7bbddae046b63b2e18832d73b7d2c2c8562 +31f88e8d3ec0f6a3a319b06cd5ca75a8b78b060de77d6108f14182836f2ba937 +914b433c8718dc06dbf52c11f6db1026d2e03418bbfbd297158e18583101bbfa +7d932e2ed1a3d4bcb4671e9c35ad24732a296640cfe62adf680f66175fa8bfb1 +078b4f8a36b6a04c0534fd0037e9be040eab494fe8181ca7e99911f339d49a24 +8f084ff5bcfa9073e541c2b6cd2ea98e9818ab8594a1952a9a4a46ff5ad29692 +5a2043cb4ee3d9ffcf04ab6847b73b870350c32648193193b2de0a087262d213 +b270353988ee6dad64e54fa69ce113ba122c659ddab50525a5c5fff3855dd0f4 +5f8d1e6f4c8790ab73c2637a89af0adc86521390ca628b87a0b28b73d527dc77 +366d2bd2bbd51d881a0cf439aa85e19315923793aba81cb43ab8af1081a43f03 +8a8b6c6cf72b5f5d5761c279d23bab4cfe0db2c08b557201c583f401ffd20e7e +a459c408130a1cf7edd311410d6fc05c7cddc6b57cd75ad08fb7bce952e0e378 +f6265ce9669177c624184dfd2a8bb7318acb4709e52224e44322a68e23728410 +e7ee378db5286996320a84ee9b00bb98cc9e6a1939ecbc6983827be07a8d2f4a +7f16bfb7cca00c158e584965d7899a0a627163298030b8ffbefe9678289f4bea +f835f749d878ad6cf3791e86f18021c795038f7dd00f180b9990006b9c8cfdd3 +630a37c8ea6ca98e5fad3d4a7cc68ed9aaf043b6a2e2974e1e0b77aa9e6edc4f +491a7186ac562875a59abcdcf5b92abb49bb976a0dcdaf652ad02d70a93dddf5 +d2b2dae72861afc83bcaba60e08f5e149e5ad3e133b2edba17c77ec4bbdabaed +57b9993fe76f41b0b5677892ac3520a04cd900070e589cdcabd105294c201186 +81f1d8b6d424c8f3d4a3311d1ba1fdbde82b1181fe27559e989364d34ce45f59 +54b49210cc735bde2d530d84de0825bdbbd3a43ad45e0b2c2369d7201797a873 +d13a15e97dc4011328682a38ba18dfb2720e1ab6060d666166ac3fff441df908 +0ebb1e3a8b039e80fc5c19638501988467a55a5a72aaf62e6f79ccce8a3095c3 +37a8454de4d221a3eb4c27c77bfdc4c1eb13c82987963ca769bace0f1306f3de +5feb716b12542517ac79f5b21008654a9db7f46e2ae284c466f0474c92e4b13c +286801a27516f2e33593188700950da279f55166c260b647033d6788518fb8ab +8365fac94ecf28bae7951c0646c841c7374288cda7130b22189a0a9f54620c12 +3611842e62e411419974775609633d7b77bc5be483e13d4b34851f67f3395580 +b47781aad518df810601e7d7d297abfc761a2b86624db2efe2f11402a203ae52 +d8626d2d9830ca9e19cc6991cc818461a5a4b8bbc478de1699ebdf8a29f57436 +8503b18b699c98f0002f04018ed1f9f0b3ac9ce0f87e212b23774f8ace72cc63 +1e99c6ff814ab41433ea2ece6021ca93e5fa451e3772ad243090e0937b7484a0 +5dc02321d6c055a60436ebd4d778754f3e7e4605f4250e22b9cd1a12ccd814f1 +eddeb081c03244951cd43ef802e3aa5d1176417eef2d1c33643787f5528a61df +90aabc2fc28a06d051cb52080a55783a91d9daf657518e5cbe6a7f6b91a82f86 +0dcacc75436c1e97e2273391802ac27b13af9bf2ef23277f2d45005ffceb0318 +45baa5a0f219ef6bb7ab7e4b393eb7ab602a802cc711acd271cfb6e886b582a5 +645924862d791d9305f4c3e72969bec72708b08ddd1e784bfd93e75b2eb90754 +0787c096a117759fb3375751750589bafb889d7c3e0d72fe8177d7c29f16b0ce +96d65201519884c6a6255b50aadbfade3dece3fd1d37610bee5a31a614d65bd6 +980b7b2b12ebf02feb7482ce7fdeefc401fde075957b527bb07de743d7f8fc11 +4ad7e0d01bfeef9d19d4fb1d36151bc866b85489af274d4d58996b33d107e9ed +b62b0517d4b1bdeab330f0281ee051ac74811995d148e0b0059986ecb5d17c28 +5fbc4d7ced7bbefe9f877fc303a0b0da0988e564a28e06a09127c34477cd37e7 +3b6a367e155fb2883cfd9f05f2df64d9feb9b379dccad9d1f3a123c3fd1d4ca5 +f8993ee3f62b19015fd51860bb3294625a6f936135d0b4c76acdb41b543d3de7 +c501192ae23f20f5f03cb3a2d463e3392ad6c5ffd4d33ed382bc3068be221667 +4f2f73a3e82c12b65e6a6339dadf3494a32e7f438629b7619a807d78ca6e802f +52b450a4a60ab82ffb8345a3a83b1061320f9d4a67467f4bc46e9e86b88103e7 +f1c218b0881f7525eef46cd61719c018874681e6564294d37874fba063ffdabc +24d57e553799da32f7fd498fbf053e626834e07390aecf277af8ded94146cc0d +a01dc0e8ee4a1558a38571ae3a23ae16f6ba5069bef357692dcc6090bd2a5a03 +72acac2f7fdf52898bd539cde242d5ce0985339060e30a7b8ab2816eae920141 +47e70223801fcb31d23aaa237f9a46c386f2000681f17c9c2dbdc41e60e66b99 +ef318f557f62f9f375ffdfb97a439dea9143f0849b579fa4949be1066e28463f +f2eed4f309c8aadc0ddf04be3f08edb096bfd656d8f567b48f157b0e24084899 +03b64fcec581ddb9d5548fd0f52331cc9746a7dc0a506bb37772f1c1c98d9ee4 +1dec9b9e3bf96fc73d40f5b4220ac1f3d2db769eb6267d985d3ba2fcd451a87f +74321e8b1967d344f666a64fc939514b985ab808512861527253e0203387183d +26e3f001bffc2fc25670a0edccb7e0bb1ae77acb8099be4e65d3df6f490ec116 +fa8b1ce80884b53b22547111d314680c72ea849d66430ca595053997e9669894 +12bf8a94d3efb24cdcc547f4993ca291653f31b16d64a0b15561bae47489681e +e56df9f2ea964d6bc27ec9c33fed273e2c91ddafc0e994c61621adbfcef7e6bc +29da8d114c35c48d87633072fff31627a095119ecf2014443b9b3d180a3c1848 +1fd0a079f11c60c046487904c73e20cb0c8558e63f1a1f03810430df48044b46 +2d7dc135e3dc7df8f8f86dab887e9f3e59e07348311276bc4451745bb0038f6a +a03101638329ea3719c573a74f638540e0c6a9e26b638fc9e21aec2bbc9c12ef +dca71884caae97a648e19c2d0d1d89364c47e7f8cdb68db910bf75cf31989929 +9f73d0416b472698c88b49ea6501ef95d72fd70702709f19e01457a70f9e9590 +e546dfea29d2ae0f97ff65c6b7fae6874e230465e5dfc37e929199cff89611af +ddf0ccace45de017828aa0f60c12b4816634820fb31278ab8afcc4d231a8652b +ed7ca3f05794958caf5ce60afa102a17df3ff4022531009c4fffb57a87b8a64d +afb003137508e574a1674bb6a0a6e56c65916eaf7a280235673d4afcba05ec33 +b4924aa9a54d9dd4773a51b5f00e60baf0c950982db184ad0c96ac402a12259f +22d1337b3c5321b7c8692943fc5655e0746a3ddce98ff33b9d13f884e9029347 +2aabe2275bced7ce59373a650d11cafd1a2f74394567c6491b2c0c1546f3f284 +6e783fcd8757d2b8570f8616d60e97b3830606d04f130ec22bb950efcef6652a +01f8e358c822d788557c41d1066695db66f60440aeb80351610f7efdc2aea014 +4a682d7dd13851f6d187e9d30c44f3377c9cf7356361cc64e4ee2adff163121a +9ac78e13aa4fb1112b31153c19b0d28f007848c1bed88a10ade265a8b606b9a3 +662683a775f94bae38e065681f7e00b0afa9364e56cae809771e53b826deef22 +4f6cd881c6b7ca7dcbc33806606c987f0071925edde39d68392a137aa17561d0 +8f14c811e8b51bdfe34c0aabb9f31013879b3f8a348e5e03f7c661822834e6c9 +2f6f64c36177c579706ae06e73c3756efd98b26a9cea78362bca4cd8437dfd98 +ded00bf0129da7508680158a213888fc8165aeeddc216f77f05e635d4a6c8515 +3f953a8039f9cd162e2778f30644ef6c13889080cd8a05b6fede9770834edc5e +04fdf83bdb9422d18ed88b6f614569d63864c399942b1c9aef68272309e6bc7e +52ebb157dec5104c1f9e0c1e3d9886403ca2a2515e0bdcf60e66edba0f340d56 +c1ad2b8d5518cc178bc4a8135121c45b8afb23de5d84f4a123172f9a71f721c6 +e4847c2f5c6d30cc2a966cd5526b6f98d85d3a8255c6a9776335bf2fa1e9d5df +a154702bf15025b8cecf5bf1c66f0abc9ba99e54da9390dd5c04bb984e1c406e +1e1c964e99a2f164ce3a6aced4af3ae77954e900d5508cb7ec7b83e5ea9ca73e +e832ba8544107820e053627f8624e89e14301e18d80706ceabf0d1860d8a088e +89e491b38c6428555684e9572c82f292d59bc8d23ec39cae1ca2e152805df3a1 +9b4d96ae8debbd4faba3dc79960ebf56fb18caff0c0111543d66f3d530c502dc +cba972803afa6ea4f8149ba1708ff8748b115c523367244e9e2e9fa31c830d09 +f422f8cc49e5300de95eb6d6c07e7c7a29eb14c0ac30c5eef24219586b3ae56d +3160839a2252f464860c32b3e74b23bd6d2deb50e23f547c6d8d60415f123f24 +e3bb62ce14d851c7d103e667373d6cd61c66513c79b0ebc72adfd40b7acb6c1a +7086061551d74085fa458d212c8873e49658fae2c8c6c28d89a7f7c9deb4e1cd +270082ce880954b8aa36eef316f8409e4835d4677ea5e35e1c093fe1d544388a +e0b559b1245fbeba4eec94cf4a14be7c83bc8806151a071070cde9f13a8b8c36 +3d02b83d6f0c24c5e85a36b0fc2f907200d4e45fc4f5de13855ec20f5f9d65b9 +11b1d6f9544da2d5a5e2cd173db447995b351a722ba9122f4ba214465328eb59 +998296c9bf8d3ce6a95c458b9e0acc925cf33c35d99df1677240962cfa6e14e8 +2a0b7442b75223821213383e3785a3e3998e96d6305c61beff921606cf1cde1b +d45be689ef1edcb04cbe2c7c317ea93fbce61db1e76f8ba6e5dd3fb265f52762 +59142336e4d375337a5545f944f6f8c8e50b4f524c3421b0316a401358a2d5aa +8be973fe695518d61393ed4c7903a816535b7cc28ee379782dceb1ec955c2184 +8b9fb4aaeb7e19447f47f46ace999c7fc458129f215e4533a45e49bec7c5eb7b +9474691c5dbfde3f56a63930188596e8264c3f5157fc896d1afc5f3a2e190f92 +33e8ccad3e8aa7f94b1068370f19075fb16efe9ce48ad789e905d0218bdcb325 +c7632a6d5220ff2b05d5401b06b5b9f3e2c2fe09af3f18e8a17eb6d0c51959db +cbc76651bf2953b9590b7ec08b952ecbb1f8f8c86d08d217f04520cffef1318c +56ed7eb2abbd6040a04032f62f59603bbbfcb48b578cc8a8c332e2d8e2322415 +a443a92afb8bb38026160f679bebe4638a81b259488f73b4301e36f052ea618c +52dc0216c924e2b418fe3805eff335e6f2dc4517cd2ecf8fce49baa53c44b80c +4809bbdced1f8cc72e35f362d567b5bec58f6e9bb8bb9e134fef4a8850a11c6d +743ea1d516aa3f00f559e7432e3521c094f9312ea7613ee8a6b900fffa99b26e +896fce4ef775717c982a136978884f8aef17d96b253e80064577dbecd1747c93 +75c16902367a19d0b5a8c6f14ef55214aeab3e4983d5d00b4114a07f74ae3250 +58c54d6903f26e3283eab708d672725549105992fd14eabe5ffa167f850de4be +e473c356eb540e8bff1acba6ccae793f162ba95e8589505138460fecf8bb9c47 +0ef6f107ffff8f8a3c6e5f856c8be2f2c57c5487c9829f72a74b897258eca965 +58dc303c1c0a28503e9863564a07ea6ff620eda460a224dd5af73c806e72fa2f +ab3f702a99e763b4ec585da2783d049a58b4aeaad5f4c799e3d2d3b1bf9f101e +5b041db82f366084f692e914adbdd1240ed5d2afa22e7fc432f1bc194bbe2150 +b4521875c441a20b3d71ae58a63decd8cf47672fa04ae0e816902926c6481641 +2f139c8b605c1d065591bbda536ff18f93449ab8106994581811da593661da49 +6f964eee801f05bdcb631ed1d79e373ca07722e424a20e3dc2be63e6a0dfb028 +4234312463799b57c90aa43cb725ff51509ebd9852a37f9d643a81b0a4c9e304 +203512e475f467171805484bd5f6e38016aad5090e5d1e5f6cd4dbe6907c532b +c5ad198ddd056dff2f7f32b75dbbbabb1dc24e971cc6768e388a612408a8577d +dd6b5b8a03bd7cd432e59d34aabba7bee276bbba245000d5cd9be7f5d6a332cb +6d73fa04674da67b8582b036d93ba3014eb336ca4c03119169ca8aa5c5ccdd6e +297d651a6cbc07b8b8fffc95f56eda32bc6e748f33d07feba741a9255a8813e5 +6a788869ffeb0accb15e982debb0e81cda9733ccc8f79a48063d216691b72111 +1a871ff5754e21a7788e +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049013t.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049013t.pfa new file mode 100644 index 0000000000..947a31c50b --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049013t.pfa @@ -0,0 +1,1598 @@ +%!PS-AdobeFont-1.0: LuxiSerif 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Regular) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -30 def +/UnderlineThickness 60 def +end readonly def +/FontName /LuxiSerif def +/PaintType 0 def +/WMode 0 def +/FontBBox {-203 -211 984 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078991 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E73F44EADD0D9361D465 +3748937F491E18670189FD0D6858CBDFA6C4D794959EF9FD6996B4BFE7447FA1 +0B99FBD717D8407349457E126F430570E461A06CD1D4022BFD31D3140B4F9D44 +873A31C28EA941EC9D76CEDC1A71BF7589E11A6026F35F47E4216D7168D7E0FF +7C75BD48730F67FC517E7539B16B14D61185D9EF8D13F9398E4F3881BDECB05B +CB62672DC2C80ED0A24278927395F6C5D99D9FB3F3A1DAA087C609DDA0583474 +E0C5C9EBB773EA16786FD1FF2BE887147ECAA6B69B261A6A61E8E0DB8AFE70D2 +4069C33DA1AD0763306A2860A870AACF636654291C3BC44893FD9358616A1D47 +B3C79598FD22290D57AF04F3C192DC67611A2C2EEF144F80E0BA04888A5BAE0A +AFF6C484103BE288EF75F74A81B453A4D3B3BA25B37C547091D840C1356E48F1 +80E2FCC0C091515CFFFC446F99945BA70A6F868F4EB9F4ACE8AB07B64CF9B7E1 +4A8D5C16097D4ABD16D3573FDA57A646D3DB6414E5F3EABFFE30F22996D0E4BA +07685D5EFC2E97D9BA4DF8A1262EC2AB3C74A57AFE467C7E8130036360EF8D62 +4A2B6D8C290AA2365EA095EEA4EAA7042F747358A9F6151AA6F82F17F9A48ABE +646A9A3F1DF12E7729658ADF3111E52D08E50998672E884C2AE82B893364675B +9D3CF06B6DADFB13C53452730FD0A61A05A44B1FF1C3B0CA05756677C3D262EC +6A9344B80929A6D456F8708C03D4E0B4AA29320F7E3E9FE420397D103641CACA +87E1F114F525B6AE34F61327595648DF8FFB4FB09DC41C0641CB8EB349595ACE +3A65D4E04735BA31E1D613CDD02337D460780E22CF8B8D7BF1BFA8896C343E85 +5791AF4BB99293E9B4E239A2A1C680099BDDEDC3D68BF9F2986D3E0E51834478 +D808353967F7D861A900DF206C52BE7267F70928102B914F39E001632154BDE8 +6626FA0F69D81F13BA8F561680D2C0645BD17BF5828EB43B6C1C443E8E3CF346 +50C103FA53A029A665987560D17F6959D9FDD46005A1EC53E443D89C7DD4A618 +3A114F733C87251276B35BB3A03FE864E0FFC9AB3C8A1686FC5605F5EF9DDB2E +B9F6D75B1E1BA5710BAF346CA720318F32CFCD405C006E4DDB6FFDC97067C0CA +394C5EEEEF2D27AB9810AD25A421FA7A4095D692F802C83CA5F8B2D6AB83AB6B +45469FB7C8613F9E7DD094F9360435D624C67E7306D19FF80424B75968A3D68E +39215E86F1ED20ACC5FBA87E107785B48411A9F5A8250D0E561FCB1DA12B590B +9F0FAAD50D548FD78020FC3C5EC3B7ECD9CA58E88C81FCB7B2A3C3D114E7F327 +220D436632DA6EFDF722D4C99AB2880E3CA577DAD1FB9A9903C5FCEE69C65D36 +DD56EEF77CEABC3BF495DF819FA518194C03BD88E1DAC75E51F23765797A999F +4405E08AC251FBC7F8C462EDA4768D668C93BCA47E035EF0BD905766ADB2EF24 +EA82B9C97A41552F70B0A1EA5172028A917EABC78B1E8293BCCCC03EA281DA0F +9346FD6688D58DE2B14AEF2954A70B3755CA545F4E0C460AA89E4A9C3D3475E3 +26F5133DC36517157853FA680642587B62E71EBB8422B6C9E1335ADB17040561 +50D94FA4FBDDB86C9FD3812B90EC8A44596F9C683A5119DBC735777DD9D33AA6 +2A33CF98754D16B34D439FD8995E625C8250129701501346727F51096C407615 +F7B96061C2E733045C1C3A427F9B1AD26ECDA119C7B38E682C5BFA7B871AC397 +BC063B129FE54E9CF58C6F329390F8F14172ED0EC22A11B49787751A5E47340C +37814F52C05DED2F8F17A4F53250634B4B54D675F2776A867C1AD96BEDA842C9 +B8077DB381AE4AC283554FEE875B64A37FC3005810B42BD9C1C1422B7B104DE7 +D912C5BF74B5D0B4671983F41ADCFB287E40AF8BF69686E407E2E97D4CC14B6B +172972FA86ED76F43ABD480EDCD3437005670A2E785942CCD45023D1B3B70E9E +C8AD2ECA580EEE06993FC79C3B44CA5841ADBC4378DD68B5A21E570C88EF4016 +CD5A7463F1829F1F761D719F770AED1CA8EAA1FA7D166C86EC3C858D8E76606A +EA4AA03F3D3EA07CFF90CBFAA0E60B26FF57AA395AB4225CC19217920E0CE8E4 +119FDE73501174065D1C0DEF1AE3D6A9F0C9E2558030E8199E99662E767D37B3 +3761220EFC66C81205F64B6ED8EB09865046A89FDAA0275D248179208557E218 +40EF4FFD2B18CD1B46E7DF16B675C3C3093141BCF45BA70F31EDB235DE3DCB24 +2C93BD4C3B6414DC7C57383F35D1033E400DD0FBF57ED73514E1E186F08F8E7B +6F836CC6702047AAE17175CAEB08E20D06ABB02FF72BB9839F34F27CEE5BA199 +D9DA8AD3C6262E0B467F9A85E1D84AFC792C55E00156DF5A50460D259353F33D +505FE3ED16817DB13AE355DE90589F85AB977D09547996E06A8F123F655D4BA5 +E188E9E86CC31AE6B817DE4D90D7055BE09601F7CF4306BA04295148D4D42EB2 +E03F73C682CEEDA8C2862FB309BE14C96C256084D6DA1A0254EF1769877EC2E7 +90D0E6A37EBE7680FC0C6325F6772D2516FBD2F71EA193B0D96BD9303B746FFC +0D9456B7B66E849477F4ABB1565BF0F95D6941C6B8500F9AFB561F08F71CA6EA +0FAF63400979CF3F29EDEDA7041C380A0D3A086CDE2A1212FD6017E8E5A280D5 +73BF391BFCAE1F0CD3E895ABB45C025940C489F30D38B43E5506D57043EB6C90 +9798823F6AD59BF33E75467BDD309210803F24EB57E2BA92BB25200527C66A7A +1D20D092637AEA5FE90C8BAA0A75172470D5C872206450164E702861D50FF618 +748CE14BACFCE06A869720517549082B5FF664D27CCCD7920A5A70724C847F33 +E893F9316FF2CE0C07E55FE095061940D12AA04853F444A664E383DE510AC21F +2EA065FA840618B89166BC69C6BA042714A6DA420C38002841A2BD31C35DCD5D +95D01CF0F4233065B48CA98A9F078EFF2148CC0B6B4601912B93F26F1B2BB509 +A89B6AE424FC9FBC1506D8DF65D85490124FA0B2C19D4AD0FB0BCEFCA1818474 +806028D9362C308A707C001AC9AA9E3D604CF91242901AF68176C70122646FE0 +3489B2D0AB026B5F14FD4E8B6DD4983435F8C1EA647C6EC3A30209332F5D9E81 +6F5F1D827D05995B996C589C6365E5D2EB4922807C996EE7D653AB8E6FDFBF2E +450740A9EAC9D97EC4B05955B35992B8FF98065B126220D2FA9FD5361F00E7D4 +FCCAC7D0131097F55420F2E723779B33AFFD9A439B80D2B5A70CF35D9BD62E5F +EA17E2B6911BC219A7D1D62BCAAACE9FE03A28780D32964E25E5ADDB423B67AF +A377AB0E9E401DDD8CB82BCAC58B26DBCC1174FEA59A311B133F897ABE574040 +4CEDF6110B709AE16E63BAC2ADB18B30918A83160B2D3BB8EA25930548C69864 +DA2A4C23339B35188599EB5668AD8F1D5E43D49471ECED568D45BD02A38006E7 +ED0CFBFF4C9E8A9CD0ED5086E663D880FB388D04E665F154E5E3AA7E658376B2 +C37E52A54EA086300039929FAE313573DE586DC6864B07914088A75241A9B955 +B60FDEF10E7C4CA62F04A0DEE650DFEC8CB0C31832D6ECD00EB8FDD4752F4376 +965F0C7318C152697C688EC0A9DF0709F4D98FE9E8ACED5B47FE2E640C9043BA +535550F55C945805685313E95F02D503DA1F68322938A76262287266376C9430 +34A8A7E9A1E090FC84F0942465BB09AB0E885772BD34D23C38655530F3266C6D +A8B703AA8584D766F3140B468CE856EB0D46A9B7660E9D41FD90DADD603D43BF +3E573959254916573DCEB05BA14B58785817B26AA1FFD03527F11068079EBDFA +2C97B82A7C711113561EEE00C10424F43D5E3A7E6A71BEF9B8173A6C4E26B827 +664ABB5F5882369863CC11AD9F67CB687F1A5D9D554962839BF4DF589A5B0627 +72E49732552AA9886455050A00EFD580BD616A0164000E54A898BC9FB14A296C +17ED96A27D3416956AE0A7B8EB477143FDE8D33BA0C2BE89249DBF625CBE983F +AA6763CD284D0B59099390BFD0193881995A522B5B3E689CD7EAE3E718DA40D1 +C1B6B67463B2B885DE1E9D0ABE0ACCEFBA3D29F7F482D393F988A831FF3A9688 +085108CD2BD75DB01CE94BB7B4CE3674937895D6AF2F6659C4A612EB65F8E81E +B9693701AAB54789B2BC251103528FC0A7E7700CF70B81230B65C0261A8584FC +F19B82615DE07D894AC4CE2CBBEDA4E79CA2438B119A8F0F596D0C605B3BE598 +AA3B1B1F58B6184F0904A73640E466164CFD0D0C1948BA56753520F144F1AE1A +015F1402E25F26B0B462F6C4FF977C7561217862A5E91E1BE2BA5E5B5E045B07 +163CD0DB3279C6D182DDDB43C1E15C6A96F0BDCF32C4FC497837321A05ECDC03 +30943D2E7A81A319C58BD5C78EBF72ABB8931921DF1474A67CA2E635FDD45C19 +1B525141980842058B8F07DDBA38D0FF3F17D95F833AFAC787AF090ECB75DCE6 +155969189C4A05055899D6AB35C9B8F1EA2548B596E799876C8A1A1CF5A2A26D +50AC0F7F93A4816A983F82675AD33D409776ED878420262521C373CA48D01CB5 +BAAD873A8006CD8E74A9CEC86FBE4964497D72D92A2837AE2DD223AB101F8C37 +8E2565A1B6FE12208A05B60BB09082028FC3E1924DFF5A60525064A7B004B75C +40FE50FCBF3CAF6B4E2F487C4778C5E6B105DF2962391EC856785F6ABFB35896 +8C5C7B4D3AF8AFE4E6114D241B943E0ED2129D6BFCFE863AFA58F207A654F9F8 +689E53F795F5A199E91F8F76D4C2495BD307CE3B7669EEA5C46E3BB4CA096420 +D4EDBF4044F0E2C79FF6DB09592C8D29587B536B189DF331336C72EEE5C96FD5 +55E4039799465EF1678063F2AE4CA788C89CBD6EEC9DB3B22BC19680CD130FCF +963F30007CDF0BFB436F34B87D59A807189B1FD4015844DE56B7B5398794412B +1B406C318D5AFA5EA90ED303E3FB726A7F83634341123E5CA48FF30AC16D2B1C +6378EBA79DF54B6989FAAC13F076D88C92B1E485060D5B5703D3FE55255ACF02 +6A94FB7EF322798E945E24BBCBA0052FB611E9451F86BBD9E1BD6A143A98CC89 +A9C82B0993432956E2AD3A243CF7E81E23B770F5B576593EE0089845046259EA +797B171AFFBA8B4A2712175CA836D750B25289872538ACF8C3A51E62F18C5E91 +B6CD6249CA9448C071CF2B9114696EB0A0DFF0019DAEA8399D679D8484823000 +DEFF6B14034B064969CC05E0B5E34FE6F414F876E2809AE3B09F03492B5193B6 +0D358C68DD6A3C48FE6318CBA17BB3FA9265235AE417DCEBB0380C30D04D6E93 +B414575828679719D85B9B4E5B56248E52B4C7841AFE7B7C9D6E844480C7AB80 +5C9412645FBD123919936859F61D815D105249DF52687F31B2701321F8DE91F7 +A88A4E8D5C3926CD47F8CDBF8DED8C5F24C5FACB2138736EF67C5742B33A12D1 +2721A47ADAC6AFE384C2066AFFAD2F79C9FE60FC11A7B71C972B897B12588196 +93C06D7A79AC25F2D9D2BEE654AD27D454D4F28E533A6CAE0C9863692E406A53 +C76344151CA587709CE1BBC845340FCC7B3CBED5C421944652E12506193A5212 +A3E384D7A63F0FC0927B2EF40AB4BA66909D323E6079D9DD5A9F09FD1078E804 +4D6633D71CBBFC5CB1E9B3BD13F9600B1157E28DD3226CDDD358B0878503D954 +0B43CBAC43A14D5034F44722B05D12F6EC8ACC66972E3B9D5DB270988E8D8E88 +4A2F92750ED6979ED5EFFBCE0731FC34213ED99F37BC31D0BFD0DA1D55120C58 +1167AE0D33E8F190A163EC437B1E67DBC254331CA1C77EB1AD6B98CDBE95CDC3 +1C7D04211BF48C8F86E34AF2CBFE411A12BDF382AFBD63ABC1A42BEF2825D07D +1343175C428704AEC8C925ED517CE7CAC954BC556690E61278079241FCF33CA5 +AA04CC20D34B12BF04BE34848FEA0015CCA8192D7B6E166025DE3F12B4FD08A8 +5833375528FEB9A4CC7739AC1C6988B21F3CBAED01DC535A0999B5200FBCD961 +890288CFBF06B0E8B55CFC0D28A3D660B9A79A4A65C2E0F23B54355E41E5133E +42990B4B1F4925AD1DC6176919F37122D5B783BB1A18E8699F8E3F48EA0B9415 +DE9376500F1C31AA51B98E9D5012476EA6F89D93EEAB943DEA72DC6B2734CAB1 +12FF2C8391949455BC5749722D280CF49B8FA5F6FBA1D55B332E0BC935E9B33F +F47FD34619FB0E217E0B5D1026D29A3C8C33CAAC9AA86015B009B153B86215A9 +BD54F753B708FEE773C9A040F23D99C941707CD0200BEA970319E669907017B9 +973BC93F89E7229F4185F95A70537935ACEAD61E7D458C33307560B6D0DA4089 +B40AF5C8E3F428116D5D616E4B0DD6CC7FE203885B32931005D517CD021B75DC +A4EC6FB5F0F8E8C43067DC7CC99B4055E45F38F8D411CCC80514814CBCC8747E +DFE0FDF457428445D64F5E1D0811BCD103E6EB290E363BF1A2964C5FBD63A405 +D0394E066E54774E7B05CF3E250FE7E5E2782B06BECE8D97C5CFA0BEFCBCED02 +08879C6B8F93460D1ADBEDB3CF5EF9469933832A83088D6563EF6982E5F1E704 +B0387D5E746D708B7787B7D7F91BB5D99BB4BB2C6646D5AAF8B1D70E0EBD2054 +492EDE6D5B226E2EEB6B868DFE0DFDAF858D7239520824943413105CEA5AE042 +D9F12A6EC811415A257FF2AFA0FC15F64D7C7F21762238B86EDB5AE4E4CB4FEE +9501350A8EB10809B265D5B52F1C10A89B5F5564C8C077C4109DEBDE36F5456B +F6B4F3889DA1AA3855374A39B9AAEB76E26FEF4683821185A8157B392921ADC3 +5782BF866461D525CFEABD17ED262785013A628A017E50EB70444CB1A9E8DB22 +775040FDC83D38CB5C91064997A88C4DCAAF340D66608C4A28A473EEC0A08785 +C765166D9B6C234AA35ACB7A3E676E756C13A67D80C148A2BAF56432F0AC012E +612851ED8B16B2C0673B11BF65904F7B9718E12179D36023CE784FEC7B79D0AE +8EC3F1244A5D293CD4E67C7B58076A6DC8E4168398D4E3653AA7C0B44649F372 +58A5B2AFCD59AC43796B6971C27EEAD8A4E645B78559FFB90A0D2C4367F25F7D +84EF76B89D09855FA0CAB5BC5088C220E2979FF17AE67491C77E229B4668001F +DEFA0E5B581E24AA93CFD0A21E453FAEFFD82A27D236FD5913132FF54C925EB9 +F59D48E16FC904AA8C498AEE94635D187C7FF354F48771A3B730A994E4085077 +53EB73692AE569A52EC4F1FDE59E793357647277C96A080FBCC9B95044FA71A9 +359225214796A4C58C90C47682EF714B21F8C289E3870EA06BB9DA82227F7ABF +DED110C7307B86772F538A937885873BD0D427966DF81A871F1D5F5A2105F25B +C2BA884C9C3D8342064B7C6979EB116A6077BCAAC52EF21BAABC0AC1BFE8DFE7 +3BF35A96077B78E47551BD07A89A2353366F0E3560D495BC906B40102AC68381 +642ADDE76FAA8AB2466D26B4A322288ABFF4AEA43A5DA09F32F3B6ADF22B0409 +3F16A8CFC70421613B04078A94148E47DD1608F1E262884D8C47D856C1DE30BC +C60933D7BF141A433AB68B81BA42326E2935E37217932DFFB28C9D8580886C3B +DA86AA0795BB69DC249050FB9434C900DD3E97D8C7556834DD3F66EF47347B13 +77E60D03674E47CCA9F3D19B2AFF6660420940EB68A843E93BA89131606835E0 +4EC6CFDD92827C56A07DCB9B7C6FF016D3500D1C6F62ADF954551C2C072B0F7C +86CC8295CC7BBB42CDB70DA78807C2C0CBB3C5369AB2BEA7DF33281A1770A562 +A19C5FB30E616743248AE7D93F8ECDC1B081F96F2F52ACF195A86DAAC8E53D80 +CB8883F37D3BB12CC0908422CE4392CA1014A45C7EB35899A8B7694C2EAFC62E +F69D5179D4B6E893C2CFD762CC388C6356D941E89F1B0A8249E8A701678A86A3 +AFDD4B74C16633087CC14AB94788C32FD74B1F01FBF8C7726DBEE0013E576CE8 +F2D2B7E3CC723BCDE5ADE760D387EAAB664A6F4043A0AB6260755868BE302157 +551883035BC8D73366FE63F7BBCEEDF072224B01DEF7651E0CD9EB85BC58C7BC +01DC0E874147E9A1F9A9116BB60A1FBB7FECE53F802BF95E3A52C4202C89C99E +BCCBC7DDEA17AD7672CF9AEF169B20FB20D7F76B2EFF1696674623E01642598E +A86C5365E4BA709777AAFD328E40D3935660CD986FA959451A5D1AD43161CB67 +5A75934F7EC456F55822EEFE030DB1AB048A2E69AC59A50370763A5AA4E11C4A +DCF9B23C9DD7290E73E1B72B179138E514E99167EF94FBF4A97866EEA33828A4 +275804BD9DA8101E6F7C78541D05C2B9513C7B03A4AEB0F5D5646626E8C81486 +610F1EDD9748BC95F93E9D0C859F270AFB655E2154494FDD83AFAA383389BEAF +70A4458D0D7CCADB3E4310B29A262C084F4D3CE3B0BB63A271B90AFC60EF2EB9 +EE6D7F7AB4ADD46F243D94F83154333ACA2358E4F6D53E633C37993587320978 +F407155D27463A47282D27D50C22B7F38BF34974D60A361BC6F26565D5CE5DD1 +A48B580F5A1379231A8B6E90D0F0F770EED72C9D9D4B397455C59A0687CBDE0D +AF1CD3AE0B83ED3DF977C0DDE3E7537C8D03AFA3114D7AAC6AC5870D0F4F03E0 +06579E9A7308BDEF66E5DD3FADC07D612E6859AA57D08E6A4D118BA7DDD45DCA +2E003472B89169CBFDDF8516C43851451DC5B37C32A111D9D7AD1323C708EEE8 +C500D1E8F5D94BE9E6F3FEA2BD8C5A3EFBE1EF84F5C95BD6CED21C8E2218E513 +46BB8456BFBBB143CC7F0D11F74D53BC996C5D5A0A157B2355768DD153DB21D6 +C2382318562DD4D1745DC04A3941FE0176189D8B041FDB0525A24BF5922A5E78 +420ABD3B2AA5E5410025C9F65FB43D0A68262981DD8952002F7B12FAA9D62011 +3AB3A84C5F720AC7D53671F33477E750EF4F700B2DC3AB8B44587E9BBFA1D67D +276FFE23F32EE806D3DE9C138035E0B4893329A3CFAEE28E6992A3834B016328 +D3B1785119741A71FBD79193EA6EB20EE914A644ED41BB29017A20E534256894 +4D9A5DB399CA943AE5351D842154542016528ABDFF55068BFEC1F2B4A6689CD1 +1E416FE8D5B150FC6A8E68EFA4478BF8931F01E405BE2531B64B4863AD649294 +C0391ACAD1BBCC2627F52FA1E07D77F0A35ADAD416E837963A0E88F67C827C15 +EF55E915BAF4E5F3E4C0CAC6E16654331B3ED0991A7D01C93C60F6961A73E72C +A77434491DD87F8EE1401583D48FC38F63C1E2A35492F93B871ADED0348EF0A8 +437B033AAF2C3C6234A1A451C143CF926992ECDA1F1F3FAEF13C6B1040A202B4 +27C545405D90F77C939C3199FA47F647B482B7DEA16DFB1B36DF0F70446B8CF6 +02B33A96F2E81416ACE4D1B53B6EC5D96C1D9D43E501B989580DB90E83A39CBB +E699A7D49F993EC3ABD780632810CB3CEF816CB7501F38D73106C838BB1C8208 +84382C1DB306315AC4662285984F9D431DCD1F2C854C4AA95CE08C33A99B8B7E +6AA0562D554DA18FEF39DEE068E60469FD2DB23428ED0EFF075A9DF7EF3F92F6 +C73E9CF760FF0523522747F7FA0B9C21B9E4826A900B5D943BDBE82330DFB8C9 +C1F7CAFE80F7F1157EFCD3E6398F77CEE305E39C876D42BAE82F5078E894B112 +3292590F08D820E61B6F0454B47A23C78A5B8F3F34D7DA46735BD26A19EE0327 +E9D27D29AED59C044068387BC305A558A13403C9F713F6C5C2D9C6765F8B824D +5C3DC4222ED8079BF0610C8CCDDD041FCD67684E66682F8434A319E48BBF7F01 +F8BB5FA9FC41902E7285DAD8DDE62B484FA5DB359668E6AE0805B48D864B7C82 +DBC81F4CEBAC5A5108391DA129E11C12138D94EC1A407371F70C6B84023DF9C8 +EA177A087632E3EB4ACBB13815B604140285AD93D1E72D17AA685EAA7886B5B2 +E6C3BF45F83594C841954B58FA051B7A9A94881598929A8C8310671932CEDA2F +6DB1F7F015F8503EF84B19E059E8124E4843D09890DE094EA6EDF792630EB0BA +1486947D0A0B484F4E223DCD215EE78D24C090A3C76C550B065225B957C47C01 +9C7AAF1498157177EF2A68BFBAF50A3D221B4320D71EA261C59A5600B55037A1 +8BF30F7479E036D463341CCCA9E987C3B87CCC44E383BB5FF98BDB2730C840AD +C388CA6480B85A9AB7D42A63F9F4B049B45AF49637E9464A2C9B709A7DE3FE85 +10A6842FBC7B4C56D14F998D6D382D31892F7C066C77A6114185E4A573F9C378 +489CC8551D1102C2052555F93CA134FED3383AA3F28A0E11F5D471819582BA7D +852CCB06FCC3CFF6F99338AA046BE9F96186F288D3951F75449C1DBF650965B3 +3D1030CCDC4817BEBD6216943F2DF5EE8B9FEFE6CE4D38DC52F3CB8A7D29722C +990AFC8CCAA016181A26C3EE67AC35FD6119E23D689EE78E05E2FB7EC3864120 +860E8BD2EA388508327C46EC8F895E24998AD2EC0D8CDE2A333719DC03F57C3A +229EC6CBEE7FD13F538570C2DC2F1031801BE075A473A2A2A7C1E01F74B8500F +DACC782033DEB55C23B08368EA6C6AD8E47AEA7119D76D4B9F80252D66F70D2E +6A498A684FD131AE7B22322009A4870CA2C684C5FA7027E1D98750B6BE292FF3 +0EBAF205FF0EBEF7E1C322DC79971EDA361E0597BDC717668F6B1E66EB93EF2D +62CCCA7BD345104EFDC72D1FCEF328857B84439A811819558DA11DF635606EDE +FA44B2AEA013F1FFA384905F5E32057EEED1FDDC33E3672F42425E8520999004 +51EF287E37D33E8F2A6D33EF933A9A1B1B6472889499D5F24BBD442EC57A6218 +2DE6452AFC09388CE79C10C09562307B117171AADBC4583AC258F3525534C141 +6A85CB591C56BB9310BDBEBBAAFA8270A5A179A368EE401D36A07075F21DEA6D +B1A64E018F87AE259E98401E87FE8A808848DEECCE5B9BC45F44A621301E0D38 +AF6B9042CCD89445F09FC971F94007E7CC558F81080A51B3163B7E6629AC2162 +A410F477E9709541D6B4EEFCEA8D2208427D82F6D46A6DF1E180F621C5B44EBF +D262084531D95974D7BB0F098F279BB04725C16955BCD5CB341F14903C5EA661 +7752778CB6A73908D89835CE1D302733EE233EE7099357A243E77833FE9E9178 +5A025A89882C9677467821A7414D970B9F7C0BEE6E0D3F5EBFA3438640E6630F +916E9523D92112C2FFDAD975FC3D3DB51273AE8A250288AC30F0C63DF9C98DC0 +87EF8A135936A2F060405A4B8E2B597137E9C0B115B91F67A7015CB6D895E688 +45D23AFEFB6434789178094B15F666DB49AB7DC74454933692B36DD82019CBD1 +4EB94D1C042285E9D76F95B80FA4901D85BD16056ECDC82F068E794CB4410D65 +4CAE5E1B495D1D14647B4F3CA8EE5ECE7081693A7AA06646594744FC1AE4723B +49EC675530C977FF95B41B1AF51A84E777F1124602DF8F5684F3225AED18B990 +EF1150946A5D0888BCD0C79975A631B147C627514406FCC022DC0875CCF8B036 +653B15187BA94DD8C5B6127AB5069CFB9892C6CB64848D4637C523AC2A5D4B5B +611CEFBD818A1E06BFBBFDC00EF8B2602BEC466D996811B2B424406A29718C8C +F57418415DD2422065C2CFFD83949467243264B16DA0C1508E597EBC4B18EBE4 +4A4354E8837173AE628FD5DDB5610D35F96CD42386C234A9EB05C71322847C46 +ED113F60A988110CCA6DAAEBDA7155A28BC035B803B81F0FB6A05DB7EDC4A880 +80DED199A41F62EF60D904F55160EBB83F40D7125B66750C881F809F30E5F72B +26748422CA9BD09A8FF4D86F1561C3B8AF623DCE26C85BF643700759324A372A +B2510533A3B8D885472BA12963E9C400B81898E6E116F4977CA724E782834A56 +D45F67C46CE5F9C0C267D39ABCCCCD1BBB002B4F7F2890B868ED1071BF8A5B0B +825DB9EFAE17C7BD9B887D75EFABD94EE0B52FC811A8EF3C94EE93838F4FC793 +D38929D6E0AF3F6D624F4BA160BE513F683E7751FAF422AEEF111463F6B889BA +B264156139AAFF7A1B64790F78A9168AC655FD94FB82FAA0828F1B284CC2D027 +CCA9153FD60BF80891AD0B45F0A356A3F7B90B0D190F1CE69398C1F2C5B8E99C +10A2C2E97C530A8614E9203F424A431220A4F5333DD281FC1CAE2F2C0E6EF57E +CB9074A7C7C0B355A1A567CC2D6CFDFEC64401510F29EDFB0DBDFF88D4FAF643 +8E721BAFBEFB4E1E5B2AAF576027CBB3A2BCB8B26E252CCEDFDAF8740104724D +020CE168B39A12E0AB7F4E3BCD05C30C5419A9DAD1C3510CAC11EE4BA2B74818 +88A1320E5FA1D6BCD4B58877927878D9D3A65C38CF9314FEA0E37EDA580CF121 +FCA5FAD167856A8588BAC41CF25B3F9C0C158A253D40B53AEA357806A3D0D706 +BE64FD7072267DE22936D8CD0E33DEAD240C795750299728D41532FD445692A9 +08D8EF48054B22F12407C5846ED8F14F24CA348FF9760008D2F85FFFC514789B +63E5569E73BF23A6413C4C077A7471E7275107F2C7BABF43696B746ACB2F4D17 +A4194B4660E7C797D3DD3785B92EEC1C7C9702F5ECA5BECC027FAD6731B49E0F +08F0486C25CCE8907B68C18DDAE8B42655B46B19B652670790CE1C9F3C8ECD3B +C88890676121A2C89D464D9F27B3CCCB5C5C014D198B5AF358699B998BB61488 +59DF9D0D706B84D457DE5430E8B5B6BFB5124B16C626E9B3774AEB27B3461E73 +0BD7F788F60264CBE30D39CFAC48FFD28ED12D55C7D0F2CAC21AF25FD25359AB +817F0320B766B414547B565B52DF5702B5957A0FB9D7058DD7F803715D122859 +87517638A22E700783EF621F407FF829E19C6B379AA448407D79FD4F76BEE1DA +71F6295803F0E7F2EEDF22038E3EBD6D56A1F0B72D203AD1A89AA7344ECDC16B +83AECBCF61F07C75B07DC7D0D5824281C08F0372762047B3E745C58CFFDB701D +2D35513F4EE938EA93D7A1FF911C07EBD7AAF2151869CA572A225D305E4D2883 +FD885BDEB7876A89AE4858FD2354FD4E347680E3DE3CBC048751600EE94C8DC4 +A64C4ECC6BCBB494A8B5DA6556724CB090FC00BE670E7D023F843CF23D363BF9 +36960292D6FBA48B69330631A12A871E56D9BC8772897F6492EDD55AD6DA5117 +3937DDF370CC6B366555DA1A22700A876F6E535E07F76C28B864064D5474A8D4 +CB2455AAEE25F2CBD6CD19E9B91D1380B73E79C7F852596B97B3D1CF32064594 +42B96C2FFFB054647CE2318D4EBC68EAD9DFA5029ED858DCAA0D5A972B0F8DA2 +2E080D507304905ACF3943644BE25757DADD2589D77553BFDAE17CD50D3431D5 +1CFAB002AA9A493F305BCA941D8CC78B61AAED56E4771FCA6D29CB0B9DB7F542 +AA16E37E647A3D71D0DEB3F18D9E19DEB7DD26DA826068554445E54144B6FDEA +949D5D03EA3238916260DE4AC2152200977C51E5693616977C581508ABEFA156 +B0767661AED9D47675F71455CD143EA30464077398E8835FE9057C6FCFFD6576 +8EE913496CB05D8E3AAA6478685A5E03093A7F62BA5FCED32040D00680141C48 +01DB98BEC6F83FD2B395A97C0EC0617223F19486003374A38147AD0AD996F6D4 +9E6B70187368A368C84FF0C5C2E143CEFF967C279265FBB2F1C5B94DFCE706CD +702C0792DEB7FF682848529C6B7A40BCEE5F7F2A868452665E00B8140C1369A8 +133B5114A62C9983FC3A13537C4D614DD9E513FC9ECCC001BA6A3287D82E9E17 +FF5D88A373023E0A34CFDE64113A6BE7C365D68A64D44F74205BFC5914D669E9 +06D94DC90890DFA84A169AC8D206ADEFD4A281C59B49F12DCFF9D9A2A4B42049 +1509C1F929D2820803279DE83D0A2B20887FD3026604DB42716F32378F996CC0 +792CE403EB698C865C21D26600E8706BFDFF5267F7D9DE38449AA71FA2C3EF9F +5CC34499FE2CC522142C8C1D55D7E6DF5188F9263F37F51AD78E9279A823433F +5755D9F95094B7FCE2F2224236585967CF767461380E28A674E831DC73F979F8 +935D6816947EF70D41D5F64DB5BCA12C184BFE59EE26334C7C9EFA0DD1C6CE22 +D8315677AA321A9B470F63ECE4DDE11AA3604E8B0E9DCDEF721138EDAF421D7A +09D9D6A74ABD55112FEF6593C062EEC5AF3EEAFC4B9C831C7E8D56B332E9844A +FB85AA1EB94C1708592E5E7F3266A037CA3AF551F3679A0B67029B61E9D20190 +2209D680032D5DB92CCA9BDA51820F2185C5678E879176F4DD7A9D64328F1305 +FADCC214B9BB8D9AD595EFFC79D6CD443C2F0B7DA981FBF696A43D4B74EAC3B7 +0441144EEAC59F52FC83D7CE750E0F9FDAED943D9B67BE023367F920DF5A220D +C18432A6AF622F53D0B240D762AC25137DEEEC12AF276246943C4C804254BB04 +9C2510885398BAC62E2F67961B2D24F00C86053BB14200DBE1AF4B9DE0BE615E +127F1FDAAD1AD4E939C1D3DC71FFAD3B9264AE547CB5F11B4E3D93038A95B4C5 +5B0D4F249B20FF04922A1158DA5A7C9B99971AE16FE252C76C21475165CA356F +1F9612552BBEFD2A020635B7E0159E37847CBF22B9EFE07FF1CB9E9129D1AD19 +E979E52F78207EE4DD64287C0A929FB5BA5AD68D395B61CD12C545C6E88DBDA2 +2224BB1751E82014F2995936B6144509AABB965D9947B5B5D1346C1FD14DEB6D +36A559DBE82A31F2DB8830E260C9069613B8DCDEF6E6A88C7B0421A4B99D4EDE +F22CAEA7D7B519A2D12CED44B4F4DD63E3011779EA4B44DCC803E062DBFB6BA5 +098CA9E78832C1E6C6B7C0AD47350BE81377EF66A93134CDE2CBDF0EA9DCC5ED +E38F663F72B1810DA8C23F287ABE369C496902E3D18B718B650324FF7D7434C8 +6B8FB37E30DC7C5B59DB7B8C982194F148B26914447FA86CD95E9781B3918DF6 +5FF76FEB4C8F0084BABF786C5771ECC6F9033C1528C4F0C5008F19D8608557B3 +9B32BC80BB28CD3C9636A8CBFDC7C3ADEED9BFBA9A59904091E31E7AEAFBCCE5 +2DF80869EFEEC3E3B3A5C20B49720BFE300F8D0C807FE3DC3615DA21501AD3B2 +9F602644E6CFF34AE0E34C8DB132643D7EBB7E485F9EE658D6E5F2474A0929BD +768056CF7A4CF2D42B3ABF73B5F9CDF68BCA4753CE33DCD014F646F02229F9D5 +A207A0CDFC782280B8FA180A8B0D26BA629672E6DA6AC08F523C030747C7DCD1 +2721543837EFD203912078F1C21B4C12E1D3D99CC3D41A1EB4BC7A9C7FF233DC +56251E5951A62BBA5164C4455FB7C420B1544FFEEDBCE126AC7BD5259C877732 +5F434F717210DDD55C655AD55C94A81238FCB7B105DD2B13BD30CDF70CF5190A +6B2C723EDBE8E171EE85CE4BA5010E254C217D8A110710DDA85C1C16858D84AA +6CCE64E98F873104628594126EF0B15489D651D8E9FF1EDE0F7147C3E1EE5852 +629A2851B69CBE14F784805C22AE7C9B2CDC7EBA0661DCF803DDF353E2A1F5F6 +8AA7CAE75B44C6187180B7FF519208887DA1C895BC7B8B1783E7EB487D02D234 +4EF2E529CC10CD2538BE4879ACDB5259E694675BA50DB78A91347A4C0E58573A +055A91E73E3A6AF81E890DACDB9589EB34E061E8936D1DF638B35F22FB3EC97E +DC0FD73913009B9895E4C95CF9D7719D9D63C25678C45372667AB85BFCE4C77B +A37FF8E0E6215A718E1A4CE6DD6756BC93A8C1722288FFB56A4082C530D8F47B +26EABA70B663BB51AE64FC03543E7C3F285A38FA416B20F4A73F1442648EEEC2 +3611E13EE34250A248798A2F0B9D6E3658EB1B97389A66C96C96DF1E41A392DD +F667EC2A88C557F4DA7F708A33692B98A8A75212231B395D6785CDA4297737E5 +13C16F5FC9CCB761CC3618C75B259F46C45926F3BD3E4994E6DBB890997E3FF5 +D0C9185B9D91A54E6B0BAD88018DB6466492608DE79791EC93516E67C7C52977 +F9E27B153910EF29F9F24B0C9DEBA4C3AF8C59098BCA325824016E26EAC228A8 +1126E6D8821B379F140D2ACFA1DEB12D434BD0383E5BD448FF624D8A9FCE8CF7 +D843B625CE6ADF6F89794CE54C5B6049BB95EBFA62A296515688317FD1E7AED9 +97A2E7FAA32A4849114921C752AEC2C52B98C69C57818EE73CBF916A235F34C3 +3E05CDED2956DB5B0CB7D51AE40E56085E5EAFB0BF29DF9B04BD66B030BBFA1E +CE3C041E8A175033AA4B4C592575F28775102F8A45E15E3E2D550ADC06CE6514 +B652105633B5E7876059C81527B9512C40DD586CA25AAD144BEF5E587C97E6A4 +45B9772B8D54C2B75D4A716B83617CE59A1E52889613FBBDF5680E676F430ABA +8D80ED90B8410AD5BEDD7599306A8EBDF90107594F191F927C6D44BC816652BF +95C03DC365DE827A1AE756FE769550AFBC535CD3F92FBA42098B2613302020D2 +15F884D51ACD348FF9A0441F3E4BFC2C02EA7CFFE8B388BC0640ACB468F3AF2A +CC50955F7CE335B7E7C8E16F03A9DF18A31B257B6106C3578A343F16ED459E76 +43FCB7DE1E9F7EB80E5D21B7D4BAD5D628F55E1DE0ED07EA926E73FAA6FD190F +796E75D43954E67F8ABD25A6414F08AEE76CE48B180CB1D3458F563A3EDB63F6 +C9C3D9078D20914B83E7A9DBED2A2CE6F0775D3EE4405148F15A5AB53A4B0626 +E24322A78F87041E956C655601CAFAFDC6F3C75B919B4E5A584E9570B6F06302 +99CFD1B95C575E45AC1EE59C798E726F129643964A47283088298D9ED6788B30 +D48341D03C2C1BEB4F31BD92ED5494A6B4039A88DC8C726E053006F9798E9C5F +BB96B002056FD39A7EF2195335D04E67EEF12E0A16E0FE37FDEB37B925144A7D +DE388DB0B4782BA6D48A2084C5A821427F97D22C1938BADC908C772F1A578179 +4FCDC28D435B6BB443C31C4C9BF6CAED51370E133F64A53D0B56334FF57AC964 +B6CBF0D85791D12C68A7A8BAF82CDA61335057A1B8FF0746F94C93D360F4B0B1 +8FDACF3610C902BD03E23FE6FEA2E5935067D10AE5E83ED6214B0BB2D4A4BB49 +F05E89CF47483357C676989DE740832C4E004FF1F2F3BCA3E34DF760ABCD85C6 +95D97A55885031DE77C16B89F18648AB25F9774E495D4751ABAABE7A25CED555 +60CE44A39581BDA539D4733919B9948E2257DDBC67C14E6CA051AB6A2494A818 +93C567A1DC8030900555C28AE6D1A0CC6513C7B31A3F4EA137EF925CDFF3F5E5 +CC9C88776B12851525A920456464431B9385B6D1508FA472B3DB12979DA517B4 +1568600717B7515DBF20E33240405655B3039B7B8C37BC146967C42C4548CCC2 +50EE136F210442A8754946C8DF57016D0109AC569AE4675E111A7D14CA742BEA +47F0629A7EA56D657BDC06D84E4B248A2628123D100F5ED185DBE2BC67BA6F1E +CB72947E8C47E53D91F3A28C0125374D2D78FF3EC984B3EB47A5B1B0421F2EE5 +4827EA2D74EFEF8427FF88BDF27344A82B622327EA307D805E93ABC2DCE0D457 +46C2463F1F5FAFC898D6C7F64561E385646C8C71CD624F6486D9EBAECF04A0A5 +ABEE1E6495CC0B1554C0702ACDA0CCBB7275703F51EB6F10D955DE95727B279E +9F61F19D9D54A638E0BDD27FD15B7DE67A06C31BECB0C800DBB1AFB099CCC2FB +0BDA829E02EA8EA8CB86E97F9D074A99CA8F0E464762BD1B0F41B444BD6BB73B +916DC811EDAD9F9775890D9FEB5337AA6EAD524C1E293A78ACB15BADA0BB59FF +714C43A89459636515E61E73C2F4C648D2916424B688896567E6B53799A79697 +E9DACC8C43A3DDD425AFA8B542ED9614B482F73DCCFC20C4485A67545E241B9C +CAF58CF1811D639E6C79D013C9CA124565D5D9FDFB2044198A41CBD6ADABE1BC +F1B43683A55E7D67E1E00CC18986F446B1AC2FCC22B2A2F0EB7B78E567C3987F +6619BB27788517FDF9B5603BD8BAAA894CBF354FB6F066144931F91D1D8EFF57 +F75B1ED60F4204CF0EDCEBD9252EA04F29712B3907A7AA75964C8ACF7D216759 +931C517183D319B5218AFEFE28F64471C79447A8C96A02D2974A67778DFD3409 +BC4415F8D17B12773192F7485B93E6CF9C99C281514C1E1BDF3628A5F093520A +9CADA2D9BBAB43139F4D067BA7B1D799BD3ADD62EAD68A70C6CD5249CAD7BD87 +C72EF01DE59557A3C3479E36CC872062034B67BB60D8EE0B703443CE7B982E4C +A6714F3333D6780AA342A9FD1D290225A79536F222F2393C5FD6EDBC1325C4BF +61D3D3E5B0C7FD0643DDAC4181FC223C1CDF89A44E542F2AC67FC46D06881683 +4E611D1993F6353E65086553C9D8C415FC809A289795DC5CBD74FC1199E0EC66 +C984180B57F710E59FC74EBE76A8C2CA96AF6A7774DB9879F9A73958A8DAC26F +BD6C2CBA67E3AE7AAC3AE51CEFD4CAB980AC13FC24683151C15E83B23565214D +39600CA55C611ACB9941F78B5349B51B1C489119A4381912AF6D74508A1194F7 +D825C41B88F8BBA571414C69A085CF400D4F7B88D16DA3D7BF554FB6A96BF754 +238680BFE0D23146EEFA3CAF7ACF4475DC40A446758F5FF8FDC0BCEFFE4C5D23 +6DCFCFB0663B70BE4BA681C5689952A7A26223CFEF28D76DF18E6170399EC32C +14B40821724CDB09EFCEDCCC932EE90CA228D888B76A18AE6D94FD69B7BEF356 +13EB8599508321F0DE786EC7A5CB4D6A218E8A62AC044EED391C8F6D4F657C8F +D9E5E8ED382685556E5FC2A8214F93D1AEE16A49CB6A4FFF2EE61741EB41D56D +282C083DBB24FA25D4C765E336899B10EC68C62358CAF2CE6B21A74F9E554C82 +221E8A0414E5397DBF86F54FB355640CB742DC10CF865E0C2E16EECF709B2A0B +908BABBEE0175F8CAA010031CB98818494E670DAC8DA0ACD46959E51669420D4 +128E38F2251F7E9F20F107A450E23A658F3B6058F63D699B4C5135E348CFACFC +58BA180FB43251958D72F2446C6DB69A17BB2416B5B0975C5F01D4B1C29455BE +538BA23611CD5FF3F06278641AF5458FFBC44181D9DC7D4D6188D8A506D61035 +338C78D5B248F2812B3493F890F397C1EEB051D1AB29050F1E1020DF89E192D0 +930A1EB5E35E0844ED2B7B39C5982CA708A33E5164CF14B10EB890EFD606D80C +D08206B43A60C21ADAFC0A57A392B40CCFC7FE02AFB2111F3A20B18AF2F8D64D +C511FD613492F116AD08D2F6E8193F9685568B83A08395331CF44DA500C405A1 +58D1E63E6F36CF298C02D2271A27C9A454329882EDB15736CFFE070FAC32ADD0 +9CA8FEC258CAB9B80C0E4688322B87D4AE222B574C5C599DBBD24505FC00876F +7ABCD94C089010E6DBFCD033DA2476EC01E7D0EEF82D6C761126C42531CB6880 +7D7D887817FE9B688447A04B38709197A87F4C0DE7D26877E08E53F68354C2C2 +492B3F3C82DE586A5BE477D2EDD5A8FFD23B55D05BBAE7F6D6ED28BAB27092EB +C859930DE9BBB54EB2DB5452302F46AEFEAD89721FADA13D5340C7F8CBE0270C +A8861D53170E8050F5C60D72D85E2767D42E7A9407D6864A2118CC70A16C80AD +18A214550E33B636BDFA811DD05C871E9BD39F80682BE56F0E9D0132D5B92958 +E4DC5F4A27BBE2D2508B6B66322C4D2248F09B1112E63032DE8D750092197808 +262715C12ECAC600AB628B03732E6214AB1E2CC952B4BCAFF89D31D186079AAC +8D18BE05414AC7D3433B95FBAEC5186269E8C4F5D01536331A78A3D405DD8311 +8D46FCF30F6A339CA1E0C12BB42BF4C46612F3BEBA9D5822E3978C7E7F24B019 +3F883DE1D353C6BD609698251802B3BB06AE88AE85CF069C70AE3029A66DC96A +2620389074E61FC3FF708B5B9AEEDF245BAD27A66025636ED25A38A1BBF095FD +74D0A25EDD692B863A29E3F224AFCD67CF5FB9EE9E45C06702CDF81EDD74E000 +653C3CA9A8674A8895FCF6922C77EC3B63115CBDD52E8859A7A2F736C9CAFB22 +5A62C420FF7E6410386290B35DE4384DB00AE1077CD28CB6A27392F0353260B2 +8964096063D8E225240E0B357FFA444FD04EFB5B9555A7AB653C9F81D879E718 +E408609E458BAA7F912B8E8587A14B27D38792CF0B66EA0BF6FF28AB27D2F132 +0C4EA7DD61F4619A5131828FF73B622C8136E2DD8516194FA86B91A1FC11DD19 +315B3BEEF7BE8856F36C5A41ED2B8FAA5A35C46332174ADF029456721D204003 +17CC6CF3DE50601F8DA6A943A1A5FB4EF6263738B2801F5816E171020163C3A7 +4A1EFB474171B8B54A62E29A84B8025C0A486BB5871AD62159C8C2C2739BCB3F +1C22F406E26F311AF6D6E5DCF9394BD6E0F2271E9347150B6DDC8E6EBE12BF4B +4FA1C6D03A1ADFE14053F1DFD4086EA3FF849AA0CBACC03AFB2567F9A4A5E3E2 +4CC1DD4DFA6281350643C771672B4E8141593AB7CC1D684307274E42547239BC +1A66D2F9B88FF19774F77A29DDF1441094DD13FE8B60BE3D172E2F03F5642995 +D3B4EA77D4B8C2A5B95E17FA3F4FF3BDAF29D8FA2A1B269839A961E6D5F05079 +7914FFA78F79641CEFA7C1E7029B45CD3DE6289FEF5AF3294DD287F8243F4816 +6963C42441B459C2E47C48D465B3F73117A58E45F4849F7B84A3F7AABBB67BBE +C04E794FA35C3DCB2EF8689864AB5EF05CAD5839A181E6E558355A212B7858A4 +B91DE81B88ABBA4DD07243F9B7E7616F28A294A7A6BB6A91467ECC40DEC2DD68 +C46482EF44B79EC6726318CDE1748366ED8A46995C1CAC6AC2D95DF400C565D7 +8995FD0D12B5059FA90DC42F97176A89A6B77C06E89DE6AB4647D89733F5CB76 +8CD689C40B2BDB5400914EF8F081423A9865060FAF419E3CA66BA378985F9DD4 +FE2A90B6B7C189BF2B9530D43BD54AE78A4E6F6CF1436B5B09165E501F5D03DC +4921066327922289B1642CC41DCF873219055271129C7A1B573AAE9EA60E0072 +DBB3FF4A4F088408012F3F6AA8C85FD786C1561431014FCFDC04D9EC154B14A5 +3FBD7C31E281C866EC9336B78531071144CDB99FE5D9411EB5A49DD0DE0270A4 +03394B3129890428232C45D40685C9741CB09EE1F1382216B1DCD028FC1E0F5E +AE9E6A1339E911DDAF47D74ED9E46908672F505D44D5B96674EF2943F17710AD +C05FEB120520F8E5AD6293FAF919A49051D2B7B0B87C9926512401D2B45B1F7B +818BDCB0F26A70F48DC1B0DACD6A2E5CD23483F545BC78941F5FE1008B487193 +B59180C93EBA03BC0DE031C43C172F4B2FCD30B2845ADE4C96C662157B1001F2 +69CFC12DE72A3901E825E11F5F7B1B1DC9F8A783B840CA9BD21D082F6A9CD8C5 +3CD6EA5E2E4ABBC4AC276CBD9AA1E73FD66FEB9262B35C637F8392A92B598861 +FDCAEABF130A5C21E646B711566EDB6803F1012CE88E0771F7001B683094629D +04FF9CC28D2268C22F8EE75AAED16D4A2F95851E46B9809CC519DB0E39618DCE +C22BDDD8BC151BF4BCB0F7CA35786F6B68F68E8AEE4032B1BD963A83CB00A249 +1878844DB4DB27B7FA585622248E4FCE609E4521602CC6AAB4713FFC6A39A396 +7C2A1A82EF4D6E814B6914F24C5A5AE2952875EBD6CE5B7429582CAD0D07DEA1 +72E65642AACC1DB37E1C51B920BED00C4C6D597B5920A5861DBBAE3B43BC09A4 +4BA3B4C52B3930423C6D2D39C5249F6C2C0EE21B27534EDEEDCFF791A302E5D6 +2D18005FF18C046714B9938AC93B5B8099CB7DD3C142F3BDAD20CF23D7CEC7AB +C64D591809E95EA1788036BAB68B8E4CDB12A0CEF717BEF6340C9CA1092BF8FC +C30EDBE372B3D640700717F98E9912B814D1668A1169259B529F3E12DF309B92 +E0BBC7B6A9C2D4903BD44C4B0969E9E5DDF3B8CA44B8BD065C77CD2ECD3A946C +AEDA6FF655D5F8C94509F27934B9207534C98CB3361D8767D22360F5C4419E52 +6A3A861A6C56AED8F6871DC5671011DF104E31B3D5DE68F2DE00F49673BDA295 +F03EE38F4F2BF2CBE7274A6A6694DB0AC0A90FEA1714F798096B0B47453B9F9A +6E7A4652CEFDF5755A0C9F17C5574FC5E5623874D5360ADCCACE26CA2393188F +A81CAB8D3F35A3FC81D43D450A073474A391A31D7FC994416AD2DAB64AA6D4D5 +9AD3DE4132A10074BD4A27ECAD779F66C3711BBDD7AC92203583AAF0E70483D6 +FE5C76A25FD50101D6DD76C9898E8A996F6DC34F1F22085EA743F966D1FC36C3 +08A4CD8D337DCC8E1DB190750FBCFF37726FD48D1E3D036F1556B755B3C11974 +9F81BB7C7B6430235FED173EDFD5FE81A1815F1A424E372485321BFD6D92ABE1 +C647E7A18A0CDDF2CBDFBD5BC0A1A57855D4AE646D27063179B2FD6E2A01367D +95D63DEB069446A7AD2346ECD9290472E4D057BB82F5B2F86C8C81FA765FFAF5 +937C8EE96E839472E591378995354261EA890AA0CBA33CE29A7CA6BF1DE2E312 +AEF2DF4F66B742C91BCFF17635416598A0CDA87D2B94E0AF915BE7EADAFCB9B4 +5BA814C81CE08C377E448EDBB082987970203A20B2BFE8B58EC3E6AEBC7F0CE9 +DC5733F5A05CBC25152EDEAB6507B8BAB2736593383FC9FC744EDA54C67726B8 +199A3D9CE9DEA371CF1B47FFB18951D8F350DE7FC5D45BDCBFFF8005B92DC257 +DC098528B4AC8BE791F5FC75068506C2ED97CC77204E2F37248A2BCEC9ED4FED +510A7B9603779B68C57D57A94DB76839004E736177752A2A63BCE0900E00B493 +519AC8820D96F9304034D948C8309E4D199A5BF01052C9F807D27FC0C1C20C55 +1AFDC48CE6A0529E32AD7C316A4D313FA9E28D5D68E4692C48A9A030BB275DFA +004B19FD59F6ABBF58F5D2DF093F0ADE1EE44FABEDA97C775643F4616A0F5262 +076FC11E2C4607EC5AA475B89BBA1117182A9CA235FD5BB9FE9B15798658B285 +6C35315A41D5DD6BB6021219DDF2A30C7A695330AACB6D180F53A2C5AD703A8B +41256DBA79173524A8020675CAB62E557CAE00B396084BA76A734E1E01D46BFC +25AABBA5FB4D48A1654E1BCB76BB5E792B2E73F6E7006B6BBB435979C8218585 +C41DEB66A2B9152FEC7CD454B4EDA06A73F35AEAEE33016A2142CF0623E93969 +F86E81D72CBDB19B4BBAFD70DBF0F8EB16443A9987769C532B2A5053A7B55910 +50E459A1098F5467E8175AFEED1354F1C50326CDE9E761427F585DEC3C9A4D36 +A76A9CF4C0EA0B8712E890F81AA6C2A9A81C8D9B061931F75A257B93723BB6C6 +19CACD8CF81536DF0D2A466463EF195AF59B5207CB52D0902AEEDB39D79EB566 +F647A9138A81F7B3300E8D1CA514B6C481904879AF3C99EDD1D94CAF56C61166 +CF8D8663E452270BEC6324A17F6893F1447BB9A3F086E54FC1C2AA2D7F58F66F +7EDE9BE293ECD25F74AA7B10E3DE10513B13333A4224EDE43414EE9F86978C1F +0ED1C404CD511F243A1632663BA338317DC7B684A84C1D4E022D567821331064 +D16F76253F14F91DF2A50E2DDBCB6750D6A75DCD3356AEF7CB5A9B699DCDC80F +0F530B66BBF4A60F102C402DB836D29BA43941AF05680AD51D4F3EC668E6AFFC +CF0D36B5CDD912A6CAF2082B702EF90E16906596E4BC20CC979080CB78FFF0F5 +C928F5EFA8914DF3E56D33582504840071B2FC38CE433A6DEB63E6CF6E808E87 +9866B05DF8116F0972DD25F2FE5232522057A095E311C247336F669BF10020F9 +45B9B454DAE2423E0E9B432B1A2E3470EBA9CE177EF28091EF444045CAD0EAEA +23A3B620D0903FE4185340014920AACE478E93919FF0C722B77A448424D0DEEB +819B8B686125A6D8CC719711E108C6A3F9EC056C4400CE3B5D209696A45F5CBD +913F3A9AB9A6BFEDACD7C207DC01DE4554EA63400489918123741D1AA8843EAE +14BDDCE827785FC2324CE7689B0B7C2075A87520B253AC1C61AE34F5AE34866F +9B68061D1C1D4E4C5763DD68801ABEAD6967F056B8D934CF84081A6A82DC2B91 +2A0F350A5FEED1C1116E3E94A18427CB4A4D1A6935532FC4CECF43E10497C190 +AD3AC6C300A57715E3FB715AFFACC30D4D4EA325AA52DD9BC29FFFCC3646A7E3 +F97A12FFF8E0E355DCD3CC5E68CBC9FBD67DEF5B5157161BBFF5B61C401AB639 +DCACBA6C3F09E9683F872288ABFA4176CB69B8D5E61AAF135B7019CC8F6AE07F +573B897F7AFC0A5FDE3A922DFA3529B65E62372F2CD8F57B6ACA0FC382C148FF +A6CB30FE9E9891275705FFC71211EBB0E7307B00E629E2CD9F4BE16C072F3247 +51ED89B8B087D69DAE1D6EBC237AB8D3483A8F9D48C2F6B465430E12756CCEBC +1C5E3566359B47A0AC0B5D4A5A1B1712457FA33FA5BADF1E302CDFDF655D5ED0 +FA9C6666022302D1DA091F8A19CEF58923AF8996B4A5AEE228D166812A6BC684 +9C89B9E6F07B71454B91F5EAC87333AA9B29B1E83A3FADFCCE5AA5044FAD8167 +F6511E27E444AF65D09B8A7A0312BF78EB35CC34545F9BB06C88A074EBD5BE87 +763B3EB1EC2A4CADBB704F7A2DDA34B013390F0B63B0A618C6CBC2A7156608CC +332AF4C93466EF7D18E85DE5C5B3D2AE50A44DAD39738274E4B1E8D350FA4ABB +0189273E99A3D9659AFB5C29C68FF969D3681D28B9322EB08214CFF9289B52F0 +74E74ED0F1DDCF8011A5D3BC4AAF6D8EAA4643C347B912544026D328BA2BFB5C +ABF3D683F2A0AA01EAE0DC9760DAC0EDDB432415B1221D35391FC5BC5A30AF20 +79469870D85F59B9BA86B928A0BCE261D4A2296BA7AFFBBE7F1AEAE1108CBE81 +C2E5C9D7F0B64E634268C2510EA92E10C1CF3AA7FD146106513F7C1F63823DB7 +F7CECB5A80ECEDCB41D3E91CB4F3FA9C8FBF3F62A0C488933D55DD2DEDAF0947 +0D067211819598DB2CFCA285E3A8F74E7887265847DFE8353C428B253EFCE70A +766A823759D68B665CFF11BF62071F2F8879D076429DCE282C36ABF335E2DE77 +BB53D459A024B61A5CCE35ED62239410C0E6D2194CE14EC54DEDE8F86BA83FC5 +3EFF391C331C78C5C9C754F81D1FE358D76E84F470BF6DDF6EDD643E62680098 +03840FDDAE498DA27306296B282E76A03EF8D593EF0764AEFD4167C98059FCFF +CBB638E477D6FE42537F6F7BE5957B0EDC591363D434D1C60F46ED853E8E343B +68CC70D92BD90958345DE0CF9F345AB7641CBBDF225AED9BF559F6D2CCEB3D7E +91A0211CB5628CDAD748F37A8E49369425CEAB98C9C4F4F0554F263371D2C9A4 +16466A96356A3EEB31C362478D5D6B849E02F6F1F7095F9A7CDDEBEB00524F2A +3191A5B347CD1C75511FB605579D6D718723D3C1E26862F78B5803AD3E6958FE +6777D6E374B40F799F13514A7DAC43DCC6B68B7A5A0F25A57F540FD87AFFBEFF +3BF2D62098BC62B9F111E663E753347E7B40B2430E89C4056C71FB142DA00204 +6D59F1053CD6A1A030B6EA70302114E4480993E3447C926E208226375ED723D5 +B18698957750DB23498A960066FE6FFDF50B97B7C46960DEA0170CC19568A0E0 +371359569055135B47AC83242238F42B29A460798E246A70185B30A026762C21 +B0F1F1EE8F3F309AE8CD042DADE3E36151B3B7929BA6A14D90D924CBA141D1B9 +8DDE94E46286CB6BC7604D84389890C0AA8B97D329CCA87E5889F695920588B4 +582B88B39CE78B8C35836AE8BC5C66A86DA1267E46BE9F20186DC3BF636FCC29 +141302F57026469542DEC1E8EF2B54814EE534C87A1B4699D58D1CD95EC4B957 +802383A21B8CFBF29FBF643E452898553CD5FF01F7D73E461CBB43186A96C66B +BE5910A0F78C730FB54611E4EAA909096A77574AF9F481E0CB8D15AC003F336F +F8FC934023F37DAB1F5E0FD58575440E3FABEC39851905D14FBE4745D11246AC +2EC21E7E547F4E0620EC4900C327E20248F7F6D60BFD8564FBBEC1D36AA9C27A +5796EC4DAB33961A2493EEC2035BA4C49FE459BE440562DC1AEAAA6330732146 +CD7E01AD940744DBD87AFEB4671A0A0ED5CF115E3F4AC466A741F086DB742965 +3204FEE04DE803F0A0F53D1EFC1A916EE0EACE7476E1C173EBBE0B560E95242C +5CD33B424B8BA6C9A26CAD4B4A3B37C6FCF2EECAD1E8227203686172B25B376B +8B03F6B7C6D6184CFEF80170C1E8B97B77B3E7DAE20A8DD97B04FA0D2B955F92 +8994806F6B43944B520F4DDB8B0B6DEF2A4AA7E427F6524B915FE5145C055915 +D2753FCCBDA11C598DE694011B929475D5A1855934B03118D52ED86419047DAE +CAB3FC969D072D0036319B517B51679755B7E5647543BE8C60387800139D5F8F +1002D480015EA8251624DC1442E7FC84B46356200BACD8C99F1A581DD42F5798 +5B5FBF460CF1F10E3125211B0128586D65B73107E32FDDC354541917310B1467 +D92B15C317576BDADFAA7334C14E32C2D811B22E6ECA84BE80532D5FE222576E +94D6950015F2EACCA793406DC18C427864AB6F4E97EAB9BC634DD0B3179B9EFE +2C496C1AA898C2E821E23B5B16E7C3081360CCA50D42A459FB603475EFCBE5C8 +8610E9D856933CE6328DD3EED0C2EB4497C9D7622259AB0CCC303901051C4136 +4A235BF3CE520FC4A6D4E99937DCDCFB359D15FB1830A434CC01FB8A840D893F +79F38DA3641419DCB90165FAF459070A2C4205E1772ADE564DB3E5AE47045EC8 +83FBCC23CC6D41C71E83A01339C2BB9A4E8FFDF67D3DD149C13B8615EEBE0963 +21F59731B52B83DE23808F86523F88464599EFA1E726D3C080D13752E18AE05B +60CA2052E559B00E9F055C692F1EE98A0C0B734035A21D59FDBAED45C5541A8B +839F9757C6D3041144879185F75952B2E1A19B01CA1665B50B7FFC911C4D9D1D +05B0107D9FE3961A5B4A447C1CB3E8E88836D9096B656FA15CB9EE3D19A5833F +A5899996A26BC047D0F69BB9D243328FDA3E9D9975DA456946070A48E641D10E +676B14F21A2610055B5D7711620A201B465EDC837E661D4633AF96F60CF1808B +D32318CA59537415287AA572AA8CE82E522ACA934B9AB564E1648E3378648C26 +01C8EEFE576BA9A308E2C0EAE7A100F57C0DEB11623C6FBD57AE045048D4D1EE +81622AE08EC95179E21AE1C6D5BC9A0463BADC098E282B18255A0414270E41EC +B98ABF908114CA425B3E4609F5601151B3AC79055A14E1A2CD87ADE46CDC2047 +C4AB59252E633EBAE216F9EAFFA55811772ED0B7A75CF4AFE8A7E59EDD252CC9 +43FC4E60B3E47606760D06E3C22C599856D0C5FDFF00627484E77DA4D6F51460 +5412849807945C28B25A0B684E33D02EC26401708C1DCA683C85FAAF9F3D74BF +66C485F3D5F73B785F0A2CE231538BCC1E9DFB145152768C84E32F33CD0BA1BC +36D0B9383AB4333598627553202A39EF3E696C8BC58B0446D514822245D888CC +F013C52BEB7067214029B943D7E93FD42BDD589FE1FC0AF049E20F60A8B03B41 +5E7D4CE78FC1229D48F7D751407CB8ED28258B6ACE47F74E0EC4BAFBB4D3327A +6EE3977D9643A67CCCED9D34A563CCFE8BE6C57CFA39B90E5BF8AF85BFC30B7D +D6E697AE61FA9633EC1C7806636A916B30073E4C215280F73B6BC10DEDB15202 +827659B00933C6486E67F96D81FB80CABCDB9F159937989AB3E55878D53394C0 +C7D5E16C8EB90551B1F0DA4F06B911CE34423CC2328EE5E43292D03C9A41D13E +871EF89008148EAC9C5CAF24729019609D114CA82FBAB5EA34311D5710EBD6C0 +37F9D4A31AE64CA73B1499B39512ED67B605EBFBA6682D0DD96E23063CE3830E +AAA4CE2F1C6BA52DC2523DF4B3EF1F97298F2523123FEDB43F295D84E9F5AA3D +E6F1D4F813CB884E940A216A0C6658D1E69D28F2CFA4DEDE60059F4E919D2246 +9984DAF8A569DB04FD56E11116BA2296BF63ECD1B65B3391E6D8B8A8A8B95318 +8F9C9B88B7171D73E0921E5C9959186A20D01982D38CFCC5A4F91D31E0FA8503 +E05950007B611CD36D3D714BFD49F6DBF09255535579D0E0E01B540E51FA68EE +EA6362213A0B8572AB83BC8E533B63C6FDC4FF52507C34739F64C528A815B8BB +628BCBFFB3CA3C2F501182B46DD1A72580E91BF85FEF40029BA737438729C51A +BF25EBE3882B8351D0F356A6648ED0F11174EA948F3F140FD7DE1821BED2FDDF +8FBA1DFF2786C0015EC2A8437DF5F02AF89CA383E622570EFCF2895E3CDF60DD +A64B152E2F5B1DA795F50C59D80FD35AA7A2CA4B55C3A1E046C3C84882EB8D86 +AAC4750A3A786948FEC26CCF63395208DB2DC2DDB6310B59817ABDE61C856183 +500C350E58D4847F1FE95FE6068508A834B4882D863691F3DE33A9953000D8E9 +A8AC105E3486CC974E06351B1365D157A6948D49C904B075C195277F943C80F3 +786F1CB9D118766439621C23095FA5749C945E94648E70940DEA20F7BC66AF49 +0D6BC622CE00143F979085824A2A1E850D68204BF44161EACE7F8AB0E8097B9D +C4ACFC76E36776BDBFA4F03424C4E286A6B925B98EDE522B21641C95C0D2910C +6425C3465AED57BC4ADF0633D0AB3716F5C0EA050C493D84AA1E0903A20F0E3E +04F2BE6265DA7D2E5D308337E1B50D361D0BAFB054FF5292C58E12ED0A095870 +D39C50CAC7B0B010DB79001816F7C5EE04AA562E11F87CC6006B9396DBBCD9DE +4D25B032C5419D85D28306FB3543971B4384AAD68824D78C4E30C945B610E315 +013151687496006EB9D8E867B82AD13770535C982DF8F84EECA2E8382D1971FE +8C4D0F28D8CD60B2EBD10550F51B3DA50C7CDAC3553F8530D596558B238FC24E +26EFA58FC455D2308625E4ACB5A954732750A03D25A88207AF626534D73D7086 +F21936FEFC92FB0E1942DF5E43A52DBF41595BEE66DF4C66A769D9C3B316E332 +F1B94E86370C14DCB944486E47A0EC71D4169ECCC072BEEFAF645A4CF3B8AC01 +1543972D34F94639C7CE00CB64F522BE3053BBB55E8E7470680BF1F01BDFDFEC +06C3B76ECF3D8BDF4A150ABA5455ACA30AFB5F63998B277BE7EDF9268C07A751 +9DCC7CAF54B1F615F1D03CF3E58A447C377929CFCE75A6681A7BAE4FCE70281B +7E4B69B0288633D39EDF2F69BA310ABAF715E9B1533EF655986811EBF695DFAE +902D7C4F1FCE16EADC43529513B9DADE8F0F4DA4053549A930D311977C6AAE0B +D5A74E1F269D484A3A209B8F87C9D5A1E4EC5FCB83A2292DA43389FCC2756007 +EE9FC95E4072CCD35BA378DB6CB79CF7B27F017F1C78CDA81D887EAD7A9F3BE6 +53A80FE9B5F6B159E32BB7C927B069B0C94524F061C8D05810481A44A6F12846 +31FDEE232C38AFAAA1C81BC3D6DE2A4563A2656B0978DF8D53936C728C3F78B2 +671E7F22CDB339E25111E66AF44DF414EE12268DBF4409B84130157D861727CC +259A9E95B9BEA0D98F6620001C3912E22C2267D7EDB65E2C20680728C4043D5C +0DD01B294BAB0A5AB7936FEA9879682F48B1C39CD600BB8CFEA75F04D937E654 +80225375EF6F2EF5B77857FD79D050A2B20BDDCD94A9B455A09BBC746CF8D5B7 +93D5CEDE3997B1CC75634E2DA7B19788083B68F6B8ADBE69276F0E1BDD33408F +27497492E0624F96998FCC221F8587D30D45E56E5531A730CB08345B9E792AF6 +4AE3EDD27A5C6D8E0F523AE7C97E8481C775922B48E3C91F09DF62E1D41F26AA +F5C72265B567BE0B283D6981EF0AD941619574C4584CF84D9693E0CECE14F76A +594D849968EEE1F0984C7B2A37544FB2EA102B1ECBC8E48113579EAFB12226A6 +CBF0C0152DADAD834A437A3A59D6672E74DEE4806A820477FD177A8967023B27 +1291B58E507B0F68FBBAF99A963E9F90F4A846F627FAB4A2E11507689C4B5EA2 +D0A79B352E8722EBC3A662C84F6A163B64E3CF96C59AB5FE04201C0DBE426AD8 +9C7775FD046E1F2F4FFD1CF5820338C5353506C34D99D474054EF9BC265A260A +630CDCB706D2BB45C343E8918FCC8F65FFDB3655F565554D1D451B416EA838D6 +59A66763C9515B66E20932B41650E01A27E3A250CDD40ABDE0B7DBF60FD08700 +6885C8A7DE9F14F7E8DD6CD85E4370C2E3BC26AD2AA416A36877507DDDBA6832 +58E0A4BEEE2495BE6DDF7C71066FFEDAB5FAD4ED9B4D6D97B70468AC407A9FAC +EA45B5F501611EBAE7CE46F9FDEF54AF912E238315325F664BD295E53A05F73C +5318EAE8D4A34E472776F142C57F34087277308336A511A3A65B4C4CD419C288 +F6E5206D62CF4364C478E9F4C6B64E51D2457CA950B9125D22ADDA4AE08AC275 +8C2399EBECB69E7A5D0E31726E520DC5CF7492C59076B3AA425383A04C653C50 +34E222AE91DCE83E758C1C6DC3005CA2757CA73102F584CD2E799DA49C77FF12 +4911D74BEE8DB74B1F0298CA0A9EA5BA2459056D6D6CAB0A90A68986D492F5B6 +DB37630B7058B6161926BAA0D62C8511000BB7D2FCB92C5922F0519A1C1B3977 +81329801A5702540D4F84385876DA07CBF5D648BEC2030473C5FFDCC29ECEDAE +C3901C5FA181AC12187415086F68D913CE9993D40411810C505DAA8613C80EC0 +91336623D5686BE49074CF8A39E1EB7BEB212F635ED15C0CD1653E692623437F +91314D34CA09C3F66C6C1F11BBDF5F720CA4787F2441B7B9AA47C7FF9EB113F5 +E4E57EA7040314E093B6729CD3ED11D18FEA94D60E1D976C786EB52475293FD3 +C0DFB12695BED5E1562D3EDF6C9A54120CC23CD025D0D3DC32A37C5BD00D6263 +5D2808D9B2E2666CF4CF92002B9F1BD2D3E12DFDB18D40DD52CB427662ACA883 +1190B5A2F9860B20D521E55129E7333DAFAC54ED4783F40A8A7A69F04D7C286C +A52B8F3F608BCED599DBE28AA6F69A0EA54CED3B0A21D199363622352E8898CC +9B5B0355CBB533E6B179220872212360EB718BA0D9EF404E4FA7439891D2370F +BAF1CAAA2802FBA445687E743200FA6B9E85266EFA88D05E3B2720979A43E724 +64F79B714FBCF388EF35E9CDBA1B8DFCEAB836395907A0EBF22D285883B1B3D1 +772E00B255032ABDA52DFCC0BA366CFBCD081156072DCFC3CCB903C305FEB7A6 +D16B59AADA73E1A06073D20392DD17D1FF43C4E01FA6D5801BF3C61887658A72 +32E319AF638CA3D03BE51F832F9BB24920B4E47D0E3C96FB079D771CA5C310F2 +B8B4183CB714383A50E3948F6977B16F4A368C086B2A0AA57C66B30A895B159D +CB63B0FD7990279EAC00F0146D58282A8EA7367BA2885660ECFF69C64F4EEAA2 +F357FBF8A514D1002CEFD82AF39D461E2BE59543321C7A991B9576778C5A7EE6 +34703E9842983E2580DF60DF6EBC642EDEA4A1F1CC34E754327A02DF2E9415DA +08CE3AA32E1A615A484E69E6BBE4A64C2784E27626E017DC0DE42DD71EAF55C3 +E3D15BF87E9727FFEF3A66512C9458E557517BCCA1A2E92191259D1EF91D6E12 +6454380986B17C55A4E631C6DD20E5F87208D2045BACFB6AAF14129108A5B35F +41B29AA518D795C955EB247BAD1D1F03FEC701BA6CF3261EA985A932834834D7 +DC8C65409644E7315D66109D8F92DF5F42070B97A2DE3B69EA97CFFC71511DC4 +24A903C704479F445BE051E96AEE9E220EDFD0934CE793AC43843D88EA12757D +52C10F73BD34C812C1B306CAE0F18D7D1B095B9F5EE76256605E312AAF795609 +94D3FA76A6984C63809F0EB8741AB3AFF516C3D6F8FCD8B1A43F5912A2D98019 +EEC4DD105E77EE0EFF0D69A6A55370771E21851B58AD57332DE44B5B2B2AC29E +B58FA30709128A9862C3579CFD08D85E8188D26EDBA5901D510B258531395FA1 +7CD5E059CAD028AF5AF313AAC4B8BF60966CA2B53DB31F0659898D105FCF4FD5 +DD2B78C838EFC626CB81B32359CB11C5A3E9F8ADB8B1201240E34009BBD2E23F +C624C1AC532746372CD00EC50C92B576AB3D5F086B64119510DB8294D48DDCE4 +49FFFC05594275C796DCBA291312159CA9EE7BDCF3613EB3D962B6967BFE2BB2 +5A9A441DB81FC861B10F910BCF5E80B77F506EC8A64E6ED10839333BFD7E25B0 +CF6FA7AAEC17251811C44031C7871669C3343CCB0D0921BA8A9546E2C052CAD4 +BF765EA279DC4446F1D31ABCB9E6358A11DC2C1AB1CC71C244E57B4852A9CC36 +8309D3B5C0FD91CC6086DF741237ED81F847897FE5CB939AF97C1B9022CCA3CB +227B7C49BDB2FF6AE381E282B42D22BE5C6326A8602BF364BF81FB7367BCC437 +DC971EDB49E8C1AABB29DB90839A1A70CD20DC53DB0CA61133BA0571D00FB797 +13629C59658360CC0472882E8E6F085057ACA3FADEE34BE0832241EF68242F90 +AB650BD7FA6E8EF0DB539346515580E57D3B08BF7F9846911C6779A481D1B348 +D1D0A1265498F0ABCD04D50581ECCDB89117E4889C4BA30DE7155F6177E3F40E +1E9DE1367427C3A1F17C27AADEA655D59CA7B6C2FF4B833442BE50A87B2D4D1D +DB57A8B5C3201433E00728A9D9511A46C3442C3E29F6D9554402A516796E60D6 +23E6D61F0ACE1B60D45CABED468523416532810C10DF9E7C711F5356970D5FEA +FE5D366722FA3F10E097FD16DAA5B68614E7D29636019C4ADC916AA6F45E592B +C429AB5A668E1795DA4F755D74126B6E230587AA57E3F9630715DD6F224CC236 +A5F67B3668261FB2D2550F16A9700B1D997D2801EBBD0F113C47B8A13960775C +6FB40EDF6D6276916BE3198448E020A46BF782B4F02F3B1C85FCBFB2B2F09578 +F90BE57A53B596E9499F9B3E23DE0BB1E159BCD9828A47B3B1256D305D879517 +E172C1E3725C4771B3C03C9AF0B62EA0C5AF7C0D692F94FD1E554E3E52A0E7F6 +835B95866B7F72514098BA1CCE2C3613FCA568C3594534167648E2AE52BE3F9F +E8207FFDABC084BC74DE49FA0E8C61739C28C78CC994AB707C2C04860F0C3F03 +5929D056CC4CB6FB4BC1DE83D2FDF9B2128667B6A2FCD13626D3889D83683715 +131AADCE22BDFCEC3C9B03E50200BCB5321B42D108DEB519A5C9992B2D3A87AB +4725F5DBD2094F8D9ED8835777C2793FAE8FE40F3EC0DBF4F1362A148F890CA6 +FDE1970FF1CDAB096D9355B755AA0D93E6E11E9D3B1F5EAF537E48C401A75C85 +58AB20685E5C29DAAA6A9F90B066E991968475ADEC1F946C522449C0CA2A38D6 +A8789A6871F96165AA3EFB39089D22EE69BD05B4E0853D3C33CC84FA7ADDD576 +639456DDAB65EA50A3C711F78E8CACD7E112035D5D1633819EC419BF5AF0CE9D +40EB6603A55A7A2BDE2D6E9FE476B1ABBEA673B397F2510066D0D5AA650E3D1D +BCC93BF8585AA04228DEC13A6082A5DB015A70FCD1D3EF72A1CDC6D8A9705E02 +662BF3F0F8B318108CA4C9621C01D02EECE3817F9EEE14D30C34EC262CB9197A +377828142C04BA679630C281AE4A02E65604DC7FF73859163F0F0640316D079B +D42F807A41D0D128E010C3961B8A742908ED989BAA0CE2BC9E9C26DD73DCE3E4 +7E31D958F4DE4E3A1B161B2C5DDDE9D1C693745D146C83F807E5BA7E00057959 +F00E3FB89781B4F084F5B24A42113E4B74933CC32A11877B4499A19272B60985 +9C936AED3AF65C3156C8A705AB51749F99263FB2D2DC4F21F8AAC6C9168F8D28 +414A602824BA3EBC3FBCA1A8D29825680FAAAACB6D9B357B437774E6C6A1BE61 +7D146A9BB073E1903B9BE2CC9CB5DF888C51B73C8C5674B172E4BD5286F80E8C +9718FFF592B56E1BCAF33BAA26F5FD402710D27A0CCB1BCEA92D9BCA09983B1F +56701305AD3830A74CFF0091BEEA6C706C3433977E6F3BEE52E77BD7B09C1D68 +37C3A5ECCF06F8CE25F105CF88FF3239DB905472E10CFBFC4A0FBC8F587B1017 +26A6080B364D6C3D7D8988AB1B4CABF6EA6C5531F8A82F99E5B111C81F9C9412 +0C54828BBC82865316FF0D9E8920BF00E1BAA976FEF21D0A10E8FD9837799623 +E4CD5E216ADBD1D76518815FB49EE4AE73AEF9447255A99CCE4EC068959C8D9F +6FE965ABFC53DD09C063BFC80BC1E6463DAFBFD673262840CD9BB67AB5CBFF2A +383079643499FD42FDE13BE2FFE2615152FD8457A547FCBE2C1CE0691023CE42 +3409A9B2B8FA9C4280856899D1590B36596B93282128E6AA6552B8BA7072E603 +FE13711746B110FCDE142E497CB2B623682A60F888B1514F7CCBBD86150B9DAF +24C9B763172C14BB79AC1F8AE60F9847D9223DB0ED5F3B74362F4AAE3D466311 +79D35B1C81A2C48205028BFDE7BADFE708F104A2C41CD32BF8348E206E251EBE +FA68EEC9738CF3D3462CBE7DBE7F725054F08D6B9F1235C525F8E84287381A20 +10D4AC542CB292EF20A215A3BAD7CB43686DD5675663BF23D89E860D392B6FB4 +6D9021EFA0FAB6E04999DBC8CD3E84D1C751B8D24B4DE92C8A80E23488882F09 +D62FD350C636F73DFF5894861281974195F6BCE45EF55DEFFB318001CA8EF32F +864DD1459613772E6B23AB6B68769846BEABADF07BCF11D78E26CD09E76AA9AA +F5F88F95AD6EA652C8E08D1A7BDB31E60B90F31308E223B6B8262A39DE23BA43 +EDCEC76D6C8D82622F980DF095EAFCC83B79C206A314D4D83624B2617BAACB58 +304274ACC6BDF5D2F0529FCB76E9B5BC43EEDFEB149D61CE36DD4672F80A8659 +331AC6DDC433FAFD85BD5A0E404B878B2A34BDF8EDCC7E9E9147219C37C4CF50 +1D48B7F84E95074412BCBE0C060BB8FF5AFA81D3D8F0509EB8D1B2950F5CEADE +51BF7B714B9784C9A6A91AC635C09CAC5BA326D1F5C52A636F2C6B61BF079DE1 +47815674304950E4D724D68B4CAD2B8E641DF1C7B6F7587D258EFE9CA777E2C5 +CF2DE3D47D6EC50B3094CB30EDDD1B31A58E8915A4D92E89D0550D1630E7D47A +5930E1A7F582DB33E1EAF7B15E665BB214F62D336F4D90C6B8F467460BFD411C +0296ECF5019A05553316BA7286B4B9B4D892AF6906FCE7241AA12A18C50B6168 +F299DB45B7DFD3AE5DE34753A0E497B0D94B0178E66D38B494F850BD820D668E +9F3ABC7142C364D5E26345C6BF93B08B0CE0AAF87838DB65834DC4117B3CBD59 +5D315844A0CC89757EEC0204E2CE0F2A2248B860FF1DB439294E9E107E2560A0 +B804AC0CD639E314BDFC7A689BFD77A81075EB673A7C818FD97009D0BFD4B121 +46FC748FADD2A1CADA10A04566049FB6E00FB8B5C928989FFF0AC4A102D00693 +0FBC36B9EC7098BFCBE62E49F317267F5C8FB541B73DFC277DF4E8A049D09835 +ED628F1736AC2E6F4BFE40AB17554271671A348C4CFE13F58D0A5B2A7C3D83C9 +EF2ADDD7A6B674AC1B96BA31A10BE2276F45BF27344636A19E09D78E56798DE6 +774D7FE7BDD3C18770CA1DEDC5C035E4623BF5317F724BD8EC0324BC1881C437 +4EA69508C35BFD66D768A0AD744D8978DFB3DD210D5629A19D6A70DC8504C49F +CDD35E164B973CFCF36DB986C6C618AAE4C58D32E21188F8C5760DDBFF24C3B4 +F0814E471A0B76950A8BFBE86DBEADD5A2662B56A078DE456FCF8FCD25164140 +694844E5ABF924CE7CEDDBCF7F4492AFBDE34610AA5B54E6E5A44AF50F0E5464 +877D6855416CB8980E1B114B6F6597347C432F2D29E4714A6BD4F3FAE8FEBAB5 +551802BF47867563FEA5290BCE8022DF9D293FA792238B7F00F84E0F99163B06 +744A2EE93224CE855C72E1FDD0E52767A30CF3F0D451081EA69D0A80893FA79A +1D25E6F56DFED691E90393FEB1A97061FC3F2BCD4BEEF1C6F56A0514EDE39BA6 +BA4583B7FCEA404149425F6969123B3119AE25DDFCCA3F2F672B98BFC0C56907 +DA2923A73A30B8FA2377F36620CA0392651CEF036AE31F1E5FA9B2DC87F2E8F3 +B1964898A76BB97DCC8C63101EEED39ADFFAB3BE571AE0210309DCD4E4346868 +DBC33FEE28431EE6FD3D64D570E04C269F6D905DD391D40FF03CBEF98214DBD2 +2BB4638F41793E842B07A9CADCBAC476A6FB9EB23795150785AE1032FB16ECE7 +3DFE9AC0AC961CAF16B492C79B669A9F0FBC7F365BFA02C3981A324E047DF5E1 +41D2E85D6F472A6BA1D1CFC896E3DAD437689296B2DF397E40A6102493D09D29 +06E359254F761F3E1E3E66938270BD46C6DD1EDBDC60CBB35C47D6760B17B782 +76F6F472D584A07146C19846AF187267E7E1635FD04F311B7E70C7A33018C6A1 +943388278E04542E454FF117491AE7B56F3FD5B01A31A89F85ED680173087E8F +CE5365E1CE48CD62DB5AA71F4C2369A09BE3B0C134E550E72AA7C299FD3B26D3 +8D3D744758A87ED77EC946914B8EC92136FE4884E30B545A2CDB474FAD36B557 +509C986F87D992FA39BA7E8D85D5EF322ED08B1EA8D90B9E391D47D3FB2A3B9B +CAF230B61E0F987282BAF6B10CD07A23E3468BBF814EA995AD6224FD4C919D96 +A228947D0F2BCBF4B189F1BB9D2E1D1EF59F20CD6A045251905C39431C548318 +9023A4297D0D21E380F93C9FFADDCE951D0ECC25D8A4967447438DA572CEA724 +6B7743FB7D68783CEF142E50212C166D2983DB08B1EDCC59E426B4D73716B920 +A14805FF0FB04DB3F7AB70A1068CFD39DFE12443ED4E8BB832DF520B0A750139 +57D9A8F4CC6AB8935A3C01858A8ECBD75F740652DFDD752F4FFCCD4278ADBF75 +C27537AE1D759AD75B7BAEB3401925949E4EFEB1C20D441996D671C51D327FD7 +FE05253BAB53DA22FD071BDDF4DC3A9D7BEAABF49958249B5AF68B88D96FC333 +FE7D8781FE9EE147E162B0F0B487272D44522D8FA39842C472F9D527149CACE8 +AB0AB0E6E2D88C03E62AD7F6BAEB6E67C8EBBC94F330EC8DF632A5AD89FA1E9B +D953CE17AC117024A9E4671E5FC05FA194D38BCA2737E73D079881BBA8BB78D6 +0F72C39FF3F87C4161458CD8F6E07FF06312B5FF9F157014B545F6F1F58488F0 +E64494C390A6CEAAA53576A32D53CB5B51563344002931AB82AEDD0BDAA963AD +902B6AF937798843B5DF895CD487402ACD82BCC95D10FFF93F71FC4C93B737B5 +FBDD6DA8BA8AC357620F0395252BF8D626AE942B759F18D26C4667C67BC43ACA +FB4240AD7DCAB1A702E3AD59138A1B958D23DEEDC8F24D46CC0FC6B58037F447 +45A537C7B8CFA4D8494E737358151FF023B729C6BD069F980F33D5DAC4E278F0 +FFD91D253C9AB617CB9546F992615C1647123D25E8DC34B257FAC60B9B04B7AD +AE705AB62C31BB5A17E8CDB319B7A6601E8D3A5D144479AD66ACDF016B351226 +80ED7942FB3E3CE3EA9C19ECD870DB4B1E616B0B8C5DF42551FAF463FEF88527 +0367D3C5C0B8D9CC318324D3722F36E62EA52C1C7340A4756C8F79CF1EAE7A54 +66FB610907CCFA40C9DF6C64D2AF33427AC1E44A843D417C2CE47E768132454C +42BE3CCB830D5BA1D535E0E0A58D1AE992C552D3C0C1A468C79438247FE04119 +7D8217AA8E7BD66DB305893269F99E48A3248DD33444CD317B6B13BC7329F9D8 +50AFC5BBCD7F7E8A625C70ADFF0FCCC913945B53DF83468D72931877B664595D +1189CF5E16CC19A1C4B0C8A1B9861593F722E654DA0D166DC93C7DDFC391F223 +A9AF93757B01526FC9737C7DFE7258614F23E9C3FB8DAFBD8BDAEBB411E6B106 +280A4CFD7371C884D1CE8710704751B639ED78043DFD06B0CE0EE061E7CEAFDC +C442688CA7341531833129B28B6A3F012A60EB39FF5CAEF433C13C60A6F1DE5C +C2E8384E7708B86EAB25E29B10E46350E3A0A01F09F3A1B09E79627A2B66F6C2 +7E5F1C526FCF92AEF1399BC65C6D6C9E53EE1676A7BC66F41F6C97A8507615FF +4DCF870DE5CF27265693C26AEDE7684882F920B5A37C98F5B3963013AC586135 +B5A5FC99B222CF400D777EAED21F3B0B5EB3EA34FA5333EB5478D17AC7AEEFDA +368AB0CADBDA738B602D1186D3CAC6D79ADA72D2E1F2EC7107D607B663A9EABB +ECD6DB66E5EF29F60C54928B28A0BE531AEC484EB6B43237652F9756C8C14B64 +FC229E9CF2CE82018A7F05694FE9234D5886366E342384ADEDB53AFE5CE37222 +F00C4B60A4837F6D2B04798360D2E84ED5EA7A8EAD38DDC0C1A30595FEA4F2A8 +E1EAA5B4AD4C4931B17A971F32A07B9D48DB35C083345DE2F74DC9ACFA988B3B +C909264AD0E95EF95E475AAF7D3681B4298F24854CF9E93915530BBBFBBF715A +0D6E9C83FD5E0189D714E5BC01BEA29FBACF253A0A2C07D5774AA8ED1E837452 +1DCEFCCB4D39FF3B748F1EA2A3A02E3E9562814340CB4D01643745A795FF68B8 +7A49AEAB3F795D2887E1339AB5E58E97CBA70D62BC844EBAE6CB0D9ACCC55D0F +22CAF8510023FC9ED3307A31747B1616A87026AF5E8B7A3882041AA8F98C7FA7 +BD28891EFAB5748F93C9983ECB6EE46C525699FAEEFB24BE1226BE84BFF7C967 +0C2826527B4152ACFBC75CA8AA608C83E650D1915292D51555311AC9AE837E36 +1731A90FC77FDF52CBC5E3941188080B792B57F98317B1FF61E92E6B023F531D +7BE4F036DC3DF11711ED1FD118CEDACA9A550CB846E10C93BA7037676CAA105B +33F600DE469E5CD1768470D8A136B0FF623931A8E0861D3A35EE733B529FBFDD +924A21B496489112F6D210E0E4C98EF989FB07DB5B5FBC228A164358B3F2411E +3C2F24585AF5EFDA32325B466010F0273C2FD0907F87B16BE8039196B28751EB +F6DD29A4F455CA05496521A74E3138987C1C2615E049E3E5AB14B54D6E2359EF +DDC13608EC4B7F0713796C312C08775747D2275EB26FABFA3371F05DD11BFD74 +3512C5FB8E8000D09E05F6871B0860FA88E24A7C5CB61CEA9E3A112C53D117CD +6B89CFE96BD9EF0A6B9A24261A8BED518CAF65F0797D6CA6018BD6D5598ED7E2 +148431FA40639E8725FEB6E10B48DD8B035D57CC0E554877363DA6205FCCFB5C +718323B7CA09015029F7C3253FEE03D11022673319FE9FBF54A2F5261C4DC16D +9ABE661AD52A63710EF6C546A3EE8E0493B7B5808169F2D86CCDD826CD7769C2 +65C9253EBDA76C1DC6A431750B69BD3626CEAD87323BDB20189D09E1740A63D6 +C9F027088E51A5EAA2DFD8733AF1870214AF25EAC63C9F90A55E379BEFC17EEE +61F31ABF17512798EBC9B4F1C96A58B15238D3B5BE2BA97B48D27160110C60DA +40FE2FFD4DDFDD4161A89158BEF42CF9E726D5797C91F9FC76CC90D24AF59CBE +60A97A6494F32B95ACAB0D59F24703A2D1350530678B40D66238B4BC48110DD3 +A880FD437C78AAA94997ED8A49083B9CD843937F4FCA9739F940778EED9413A5 +80BE8A47258282C2337E630F6473CF9022011F683B87A8EA0B02A343AF7C896F +F4B8CDDCD917248E37C0764BB1E1DD0FD406A0D80D9960C6C32A81E209E6478C +ACADC1404FB84BADA418A5F950EFF6FB47B6FE500752E1E5923598A97B96E48E +9417BCBEE2F698FDDB9F5CA45568234525CADE3F3EBCA7D1D36DADCE085F2E12 +B6C6B26E3D70892486676191C73A7035A6E4F8124548332A0354457E2B931A67 +7E15A1DB1C802DF3D27208B0B1C8553ECFCD9B0CE1C2F950E26708CC128CC965 +4420238882E48BE71CC52707EDC8DBFAE2563E66503E74F3B71C0BAF3872592C +AC12D490F998E2198C8859342B3E769281EDA05289F8A3A4C4399E6F427ECD18 +A8C6281497751515282506477A9E0553B6ED1AA8C89F2EC6D244267BD358C8A7 +27725E0D288A0344D21ADBA5E498898A284B3A5F2494E4AD056DBE7461FAC6EE +0332E721A7F7E2058C864E02EA3DB74E476A1094F00BD5CE8D85E0B11E150C9F +95D584C11CF6B285E4EF068C533FD49017A51291CE497F6E336577EEA1C39E67 +A19C2AE6E8EAE3A8658E8174D98289DB1AC6DBA0EF27F2598F35E47D6B94C8DB +059AA1D803A9EF242F88A7993872A141F97D76B3572CBB811F34E066412C948E +7B7B22AF31C9030E333A104DCD5F29E649901D9168E330C8BD4DF7E50141408D +267AE9599099CEBBEB392A28F74CB75802B4AC5DC979A0FCA75EC11F25DAB3FC +67DF1AF2291A93D469B3278A2DA9397B018024125A974FD7D79D149475726085 +02F30E996960097F6CB908C90E5EF127E5D2543871139A7CB94CBB2A5FCDAC6D +755A60F53344570C9846812E6766F1E2C952AFBD260D252129CB7C19821AD057 +2DC1737D49FB047C564C4809EE21B6899F02916D50CF72DC0174BB5A75A3DDA5 +74F578245AE90CEB882AB4EEBD1A4533D922197C400A2F651C1A6C5F4FFC17AC +7AD689F45B1722BECE5F648584C778C96FB1C606DE7E7C6799964BACDFF5B239 +A7D25397BDBCA2DC06B27246728A6A6DF1F5EF6D8677E6DC2459472211A35500 +C8315B238FA5796C2DD19716204C9D6FDC7AF0419A8C3A927250192E85FE3D95 +924C818C60F4234946EB58C7CABDCC0ACF82601468F963C968209AAD57296D8E +92797D765E68C6B64DB292C1AC7A779FE7B671D505343A2D32D0898A1D90E000 +EFAAAAC89A3BBC3A92B7224E831F2132824875BDB04C318B018B49009FB4D0F8 +A41C484ADE005751538675AF75314008C6F45FBB3B6B73E80D223935B9D7107B +3D2B8F2D967D7DFCD9F2F9EC3338844F5D1F36E2507B2AF6F33A495CD6701B1B +76630A10878911FBDA1E8590BB83D5A59A5017A0566974818686187205D6C1E9 +4B8BC41BD5CAAD046F99F989F3FFC38FB507ABE17C03B466E423BE3D38B5B659 +4115B2527B2D3FBDCA1A2944F5C107DFAFA5B3FB0BC6536806F5D9BE46166CF0 +F84D3EA7F0E5A904295F84E63A3A08BC02B75C33507C5F09412242B348EBEDC4 +7DC51DB5D49526AE4344C51EB3CA8CDE0F11F9059E85CA54122ECB587BDC5A3B +7EB1B5E4886F976037B0D1131D9CCFE5656DD9F88D7E5B099D4862F78B30A7C2 +02B3ACA955C31742B0C732D84629D705F3C40ED57FA05C368EF688D075E57718 +6DEE8CFA86CDA31277ACDCC66A23D0656B20BE6445021E16DC406BB68D548F3E +1D2CCDC247B2A9171FA02878C108EC0FA6AAC271A82B8444E714360681676A9E +2E30C41E9A40FFC67C7C9C7FBD10AFA5DA7C228A1697A090F6781F2E75C528DC +56BE079C98DBA4D248DDF9AA7B6C52BABC2B66218AC0DE509F08A4FCA26C646C +9972C2CEF664ECFD1D924B5D5D7566A6B859499F6758CE7B762CF986C0736D80 +0B4A4298E5EE920AC718C5B64D5433FF3F9F631E8715ED604D708556781B1539 +882DD8627E2FDEC4B216C62D4CABBB2F115CAC56A5D93EF98E30D058EE634DD9 +95D5D1AB4C42680B3635639EDF9A52E29B37FD0BB0478E6ACCB4C7DBB5F9C428 +755744092BD250A8DDE731265A110615C300DED7F143D52417377E90B91FF8A5 +BAF6324B3EFE85B2AE0423DE309A36A64E4369353E6C2603E802ED31B56E318A +8F6D19FFCAF6627099C0E3C190CCEC20C4A7DD4B47816D529138E2694EDF54F1 +867F0143A444024E0528325ECC148D779F4C98C06FE9E752C366416044EE3FAC +72D8AD35D89400B4F00286191C16E16979D5EDCBF4FF9EC868D6E3BA7D98A83A +0710CD1AAD878778C0A4F0C9829723572B4DF407490D64B5C49FBC047DB49F33 +E824A4343825D756D894B41EB70093103C35FBC09FF55931B81340666A0B50A2 +7633105B04DFB6386ED196F7D540ECAA058C0B44E89141B68CC41FC21BB2C4B4 +4B13E070FF953B88A70B3880561FDBBF309C68F5C159D90CAB88B04CFEA0F33D +A48D289473545DB928964A1FF97B90FB16C449A27E333B56A1E49386AC738A91 +105C3F6DF518A43C97FDC345F5553842D8BB735C33271A8FC7E3BCB3C662A375 +53B8450229EDEC6156E41584971A159960569DE8AA7A959D328CC8C8ECBC0B11 +DA239FB55CBE641B71150154F8A9A8A128F8B58409791B88AC57AECDCCEC9893 +7B3363B091289345EF59DD66D83982931E090B8F2A8CFE8F46F3978A67E28047 +48A7C711553E9846164FFBBCBCF505F953132F546583ADBB7F0A9EF02A6C3163 +0057C83CE31709A61F2B9B09CDFE58F02211CA00C0672CE30572CA53BF75538A +57C1DFC3E44012F882BD50D4A3ADFF64D8E09ACDC5FB80CABCC56102C59C5B3A +8E7D70F350CEBD556CF6055160C1DBCA6411579F959C873E4149A3FDE8836252 +FEEE3A2F3E8BAABDE53FBD71B074FF5F26AEF5A6663E2117BE561B21DDB5BEF3 +73C1365F9CD57FD44C29C00395B7CB0F5A4BD22AFD390421EB238707C3D18BA6 +C7A1B0B95ED985D208850AD1BB88103E7A7837F707F0B824BD1BA350896BC3A9 +88CE5607050B136104344B3C9E999D4299546B7A107E5254AEA34E3DB09AA599 +CBD028178511FF44D04C530ED6AD10EC5C41178CFDC71DFD30B1F856DC2A4FB0 +CABC0906E7682033B43765B5F59F7604BBB01A7D660C3E5BFA8651CFF42936B6 +22059C2BD479060AB78AE53CA8B618F1DD65DB73F507951738DDB94B1B2898B5 +9724D93F9872A79725B86FD72BD7CC1D53061F8B55D3ED5701D99CB24F3F7469 +5D456C51BE9D32D8F101E50CE4BEBF5A8E97EA0580046639EBAB22BA25A69EF5 +D80A9854ADF2C2F754C35F380F72528D1142EE6CE628942F3F98C26EBF5A75BE +C8F6DDCE438A2BCB35A51DECB444570E36FB2C4AE1AF422C91AC39A18DB9AFAF +BA33B7C945743E2EECDBB82C10510C7D8EE5CBB80AB3036F259FF0053E1CD954 +650C4359157167A10C67372C068DB33982CB1101757966FCEC872B24CCD65E0B +E1CA44F1CDB5B42616DEA1E07FE6038A0FBF4B1C314FCCCF8E2C8B96389BB33F +978440D27041708AFD22E3E2E3D944D152F9A5F2E50A08BBEBADC84A7E0039BB +4651884B79D1AE90EF67AAC2A94BC1EBBF38F7E4B3FFC5A421EE7EEAD34CF658 +C89D114027B859850874A5FA5620D70BE94D480EF1D2069F64C9E70C669496F5 +918606F17D2B02178746BBD22FB088A7354A811836B7AC7CF69964B01F7B6C38 +D97DDCFF7F2A5BAA1D509D5EFDFB82E5EEC29F2F12879510790882D7A6554A0D +35394CD4CAB3E352139B4DCB9EB2AD2CD31E9717FE5EC1A5D0CCD89D2A6D9A55 +B0DE096EAD34A9170CDD32D058DB6DA9DDC7A20FEAC9A351B2144C9CE7CCA732 +7F13742A7F0D9A1736A857D465EF44F316F8B165E30106CC22C5255EFAF1C02E +0AE0B448B88CD712E94BE503D0424B6D2E42CE266D35B246D9C92DB1032E372C +FEF9CEE8853617CCE04505671F6A2F421B8D86C775BA10ED922C06950EC3F162 +888C5E240F3A4E2B8A1F5584EB8A5C86EB099396D209DDDDF6239D612330484A +7D1578FD98F395EF6FACD488B64C4BC127C129260C4577A5FEFE60FC476AD32A +FD26A711ADE1F32F869172C4B770C0CC0456730C5090A39B81CDDF7F43189A41 +A830E3D0875FD39EDE7BE3A37C5DE8BD0D53B2AEC076E977835BCD177D55B487 +ED28D26B3CEB6D86BE909C92C4EE1D7BC27BB10439A27F35C405B76B79C0CF98 +21A58E3E4015E50CE027AB45E1B1892AD44477D37E09AA6CC12065749339D505 +D96A72AFBA6A6E1390A6F01849D607E6DF07B928A490A424017C9E7199573F6A +8CD3D62355CF57FE164D79903F81679B4998AC7A65DBED69184906D6A6AD7618 +A93DC4288D72AD42116CF3A527E6F6958AE02E2AB2820C4C8235DA5F8C161D62 +7796C9FF711917AC9023CFD7BC831AA847281DA84FC40DFB8532AA9A6E24118A +F6F0E95313894F71754ACF52FF8AB3C9E48C811D5D19A0B686B8E1DDB9E3DE55 +7669F0BC5BD721081891536D9FB45D5FC6058F768007EF51315A619EB93AF0D7 +74DA6F7C1F0C419A0B623A2DF8AC5F81AA66CB8EE50B69CF20B7CE88282AC1B9 +6A758573DA78757BE583FC05245BC6457EA6D1073FBD3F3F506139D493E56B05 +EE5897161C99CAB23AF97135F18C72D6B0F9802A339E3576271AFC00F077075A +3724F96F7D1904838BD92DD6787D86763B553822D81E63ACB53EFAD31981B71B +BECEDF7DE2AA12ADBE30A544CFF6883A0869631F70F36D931E1077F8788627D8 +AD4868D51502C35C0C3697C811AF509C526689FB4F8139772964F414C0F5B120 +37C04E77902A09414406E447EF46510D80B5BDD17B712A5137869B813F673C63 +988A772C0B49D04118B5D5E5F8D07FEC3E8000FA1FCF06AAB49BB73791E019AC +148BAC5E4269A39347ED188848E503E0C04E548D4C5E0D1FD132A3EB91A9C92B +9218A29580F6A99352F46C747C29F87EEFFC7912B6A60426BEFEAE7EAED1AF22 +C757AE1D228A336D999E620934AE9D1C124E4190BFD280B24A40E8519854D386 +8A6140A79F2C1621D94FA49B4B869DE236E51FCCBA2600BC7BA951EC067E6759 +C4C616BA9F1AA22C72DB3759A24F77B63DAFF16785F0AD51B92DE05BA3634D4B +941AD4E19379CD165BC655EB7519B58608935196F2DA9F17CC2BC1238781D29B +EAF0FFF3CF529CF48890C17CB1D97CE95AA2BF2827B43B39C8C61FD91E7BFCC3 +85A92AC0528C12123EDBD7E9B1FE798EE0CC8967CE01D19276E8BE4014A06868 +6CE0F5FCDE2256B8D2FD077945BFB2BC23342E4EC323FA864567F8867AAB0196 +3946CFA77BD98C46666D80D4C67808DBD53B407E80CEF7DE3E9120E2AF3B27CC +4F3201027C39A296C1406FB76BCF9E46537DF1D3409812DDA774C146E135BCBD +62E1EBEF09C3472DC0DBB9CE13B31D15516B50280B3C09E9F6EDE5B05B8D0B4E +C7AB274068D129951FFE53FA5F0E85B5F1DC12382F11B5225FEB793A1EEEA45C +458B1EE64C7E2A787674140AAED80C0521469C3469EEC92430A9E3ADBA3A094B +73A71FEF38E2098E4B882D171524BE3B4BAE4A568846BA996347E728580F6AC6 +EB4CB545123E55D0EE933CF9CB63EB60EDBFBD3E972B544477AB4D68826331F0 +4F8AEFC29ABA9E1D6EFE807CE2D7E8BF254F153B3C9BCB6507E89B97158EAD5F +4224068DA7A1686B8DFBAEE60EB405CE71F71B4872D396FCDF472EA4CF3E6E61 +7F35278F1E7B3ABB2714E1723F5472821674C130E7301D598A6D1CB33FD3A94D +35F73E34AE11BFD6070CDA2EA1C994C0AE4304785A70A38622C09D47EA08238F +7E497A635032592C8E28814D114AC8D1B9FA512FE66C692F75E42B67E51E18FB +3F642D14C8DC0DF74FD81A594376BB9B7DBA9B4930AE048E4344476943D31F24 +35FE5CEF1A0BFD45EA5C43BD6700A38796626A1EBB23A3BA4B7C64E1B145FF89 +E1E3CD5F27844E66E9868F13526D31B87FC9DF2676E7ABBF3176CB2CC698BBC6 +23D39533FAEF149531AFB05826F48BD2CF8CEFF48FDA67C72EE1F32E41745A79 +C96B8264CE368E6FD3DAD0CBB224F8A9525C6FD720DEE0FD278EF36886ED076F +EB24D1D8B69C456A9543F4543160B6BC57D0F396BCB5F416EAD863C35BB5DA81 +B218D99B5CE34FA719E6C67CEA1B25DDCE2B019208C1DA5D9C105F47A382797C +A73AAA78B4F33F509E60BA34B4D5D55756639BDF4761C9F221B09866291760F0 +4ED5CC9406061F7FAFB0B6F93796F64BDC05277FDD466DB850B5ADF5C6E293E3 +A6AF3C0CE77608F2027BDEAE4076B776AFD67A7BB7123A1F2F1F95609779BFE2 +9C1E085B68A4C444EAD8ED8E3E7F08CD5F90D12C96005EB144157FD1A85F7176 +3090740FDF72AE20B73733DB0A0A9ABAD612F6133F77DB8FC48DA198D73C1CD8 +797C02A00B9A6343D43D1C0B392047C71EC1D62B5308B76936F64EAEC52FB0AB +A53516E6BF2189E657E6DEDF0C680A81282F877B0DB2EE045919FAD21BD4153F +1E3B07E23F7C13B55B47B85E99E93C6C64D7132245FD325E9FD9C6760C01C8DD +61930D6F4BD6C59F880CF11C3F1588E72E98F80140F43DE93ECA43931919237A +2450397829719ED4E34241D30FB4F5C8A85B1A85FAE2305C47550BBB555EE76B +DCEBA951B61B0D3A7240B105695337170A9A56468EFEAF599FEA0CCF01A2DB84 +25319E635B3EEEB2B1A6ECFE58E2E387FA5996D311B87ADD09AD373BE347B291 +140162A7BAA5CD747ECD0DD86807449609C1B86BC5CE2A087AFBA83091CE4B0C +49E6C7AE1306511A1BD1D4FFE475FD7501461D782745128DEE7C1BE525A3B04E +5208CFC6600196DE9ED2E7A7E20E20E29CAF5019130609E1D3AFF1DB46E12579 +1BCCDCDA2A43E93CF68534225DD7CBEF77AE71AA22565258FA39AB4D9448D462 +326182601922932B23CE0E2567E30BD47772A11D59E2CB15B0BD340C0657B465 +733E5D4BE23D731F0AF280EB827526F9050776DD06C6CFC96318E91F821952E5 +0CE9F613F0C595C55F7351D7D4114D9611AEAE733A45A7F6645166307E210930 +0F1E4F7A64B77EA34F19A5F52445EEC38EE28EA988EF3478F03929AEB7ACFA8B +12AF9CD3778F13FD2ED625B825053F2E8532562AD65B4BF0C2631586E30FC27D +D2B5830E9EB43090370C658E1FC9606BEF5FD9CACF8FF8C051EF770B95C419EB +1E21C8D10456ADA6BDAE7069829B6760DAAB8F4772B7FBCF8A96F691BFE6802E +F9EA5F469758411B191623A09A49B22E042310EB212894282C023852E11D1001 +225FBF626AE3FEB4F127D055FAA2F1D6533FE15F30ACDB50FDFEE0BAFB1D4CD3 +FFC9A8CDDBB834E06F0A2009E96E82EAB4364D42897631C46797394A1745A3A4 +45B2551DC83AEFFAEE4B19C824C88804C8789EDC04A72079561B851853585AE0 +E4DC3FE1515E0751FFCCB8747E05B3BF7DEF41CA3B9D17D8A3452D965E7F1F0D +1770F771EF9B8CEFC746F42EF799828CDF99643D61F02064D472E5CBD1F01AE3 +027615C852F4F2455711D642C5AAFDBDEBB87BF4389897DD96F463964E84BA09 +75778F0201C395B006083E068C1CE5EA1725AF409C9A0C9AB1DE481F85511594 +79A3610A5D62625D9177B7DA0E2345FB16178DB9AA58588732C48BE70A5DA581 +EF630C04C61499312B2C456A5AD7D3EF4B6BA25A17E8990B9351A5232F783D89 +CBACBF1100EB449EA090943C73CBFB94AAC0D8C675D84284B83B4871F7F1F37C +549C0F4194C12B2FC3E52D8F89FF2A8D18EBE7F270B786500B3238D7D8100CC2 +613EA077722458508F6DCFE09A5479D450B795A1100FE3ACD3BE0EF191BC1625 +729369ECF1EE49693310F8A241EA75CAF7E4B2FE14A91E9F0C13955496FB03ED +E8FAC0DDC571FCB38B006A186E9642B6EAB0A7CE39B67112D9F83651A6E9DF2B +9F6B6046744A77788DD927DE5C22FCC918C93C7B42C834391F8D9AC89A2D20A2 +1D979C7D6238D4D8E28946FE336A43402F67BE9FEE64B7AA3F4624358C09EFA6 +99FD5B78AC68D5E3F1854767BBD97701ECFE92107F6E51F00D0245484732150C +C33E963DB666494C895F05BECA73B88B7043828D0637B3986372F28F1DB8D68C +0CB56793D0FB42444AF9F77A634923A09102AA77F2A5A36330E8B946806E57FD +47BC5B0CD1605E564AC173D7F3E1E19870DB668D87CC1A2BAF539925C1BEDC28 +ED5870BF8BB79B0D31DED055AAD85A6D8EB98D1DBE04F10FCD01932867FE787F +1CF53587378BCEBB146135335100E2251577F42387DF4517DECE711E8A65454D +FAF19EFC6EA9CF50A4FE3DA6E4902F895702F860AF0A82D47FC7E7C4F3FDE9B5 +091A7AFE227BA45E85679CD34B38B14BB824C7B499590C9DF82C7C11B36354EA +F2A862100807308908B088EC066B2B20410914056F121CCFF70EAAF9F8C37D31 +9C09832C462EB0315DB838D2E2816528FB8391213B9CB687ACE34E6055512C6A +543284441527EA2AB308D7FBB8BF137D201042117527E548909E3951A68925A8 +1F741254040BC520FE89B7F675EAFBCC1C2EBCC6F55BAA59D211572056ADFDEB +3CEB28BA5B9987C4E5CF15A23D558815AEBA5D4EFF8B04D2B9A07F9EC3195A8C +BC8E5E8422BB1150444C5683471207E26BA7B42F43583DCDB2868337362887F2 +8947C359480DAD443D473C61C4AF2E6BE2F7BAD06C79C102586C325EE523F000 +334B1AD5F85E52486C07D5F2B88CB36D7C5E61B421A67F76F1705CE79FBCF403 +FD73DD06D579EE0891AFA8CCA2002D031A2791B5747BE3FA9B7053DA6CB943A8 +8FB3D8DF855C16A641AF1B9E0FDABD84A5074B583202A8C120405C781F2A591F +F44D17300936BF3C77591752E3F3FDC5C448910A7DD21F2C84F1D44BAD9C7EA0 +2C29193B42734103C2EE5A6A0A6B3F9A668D0E58B7450450290C4DF4AF6BA8A4 +EBCFCBC4363ED8209DE73972FF2DE7872AD38ECF92393023354BF50C918F84FC +8EFAC13B94DF583EB1F6E02ED73D73560DCCA4E2F1CE8A7EFE29988616867139 +FD6636485328F32F2A9C2D1A26306936ABA671225CE1685FC633E98F198AC865 +C0ECDAE559DC639FA8D0D9BD2191C97317C07DDF2BEB1B8E6B0A2F4DB30B11CC +FC7CF4D9EB529CEF39C017E332079C03FDCF16EF57F51CED595ABA70EA35E643 +88C4313F914D6888DBE345B1E5B97DAA93CCA097E330D3CEE75B91B36DB308BC +EB676516AC72507CEE7469A7DCAD6E98000B1E3C77D8A4A4A1AA3C31AA384F2D +2BD50F44E9CBB4B5FFD65C4E7931BA8930920680537920623C80A06AA95EA0A2 +DFC56A91E877CDC9E57A201BB933B4B15710CB4C1BCBB88AD119C273D9238020 +24DA817F6E77BF55F12E9F61A1E0D2A9DBC432E0827AD7F023F1DC6C82984F68 +F6F778AB1DA064EEE453A2C148AC1FEFE43E20392D59BB8898459A11D71F9713 +610A22F0DD1797E87854B0922FF58FADA2AB26FE02E9D6838D4470B8E16DC017 +874787097C64EC851AC4BA343EA6D9D1E0442F0A8AA1D6AC71C79443563B1BAE +B4B159333392763A0D17962080B8243A4A6F11FEA2C8D5F4BBD4482638854019 +DC1BC660974B96EFF9C01DD2797B1E1C8E0CA2905F783B042959701A74AA8023 +CF44AD6A3C0B7414D41BF9E330C0EA9230853322C41F8A40E782AD8F4587E647 +EC3943D77A2ADE03D8FD096408B4085690CCDA8AC71C6C11AF690D8C32036AFA +4ECAB5C1F31B05FDF26CADEE15383EA1BBA59FFFE6819D3155FFF76BDBFDEC24 +5BE59C61F3F0D704DD0862546F77DCDBCBC313B354481A9D529C4228E0E43EBD +1BD15B94876AE370FF835434A588E4E8757025F2B1F82CEBF20AF28ADB8ED79D +2412535DECFFE25B2109229C9BD3AC9A06BD241F9284EE8FC77096DE5EE21BB7 +7A7162D9AB3D2CF6C100D66BB240E43992444151A9ACC99D10B232B4E400DCAC +BD38E0FABA6F475E6FAE28448FF34EC8C1656A1CBD27CD6561F9BFE0FABB1444 +2C25908CB3D14B664B3E9BDA6F0EDC8D933FFFEC2CF1A4074FE4CD3C8E72EFCA +925FB57C53202E5F89D8CF63DCB5EEDC1AA68D11F263359B84A3D7F9AEEBE5F1 +4FF089AC97F1222221437833F33C06166B8CA011A5D2F9DABEF2750CFC00DE12 +9D26BF74021ACAE3AF901CAFEF6BBFBFDF7A496A73BC1F495D0F8AA6979EB23A +0E4936B95B1636788C8937078CEF6AD30F0794115E019D187C11D6DCAA187303 +706FD91D652D41AFB4E012DFC5A0F78F435FCBE98D433CE9C7DC248106C5C763 +AAAC5FD1DF5367B41E004489C01C5FD3AD98B8EA7FCC66E1B552A4B6FF2AB13F +93AFDA81E74C7304650C1CC7E0162AEA22A754E413C55D571349758D8AF0D508 +9324F516E8D4FE7CE7D0C2A574E959AD1DD3CD001E95B429E4FD1A6CB65A6133 +EC9893F1A7F476481D209843208146D10F9A4F0AACF2A6DCD4462CB4FC9D926D +D5AC6B561BC9B0CEBC0CA2707AA010C66299C1DB237B020DED71DD7D80C47732 +9FF3A32D0EF7042C4021585BBC826038D69CB48982BD348946F44D80C39C26F7 +C15EEABA258F8095767AA5447F6A9CE1D43D6BB3A6B205B8B9E8CA81089CF71F +5EDE578C4C244D0E35599CD00FAE11024952E3ADEC2ABDEC90D2FC76F9ECD6AA +A6B40D16DF171738262230DDA062E9154DAB0A506DC761E79DB40C7F389C6E8D +71B5BFBF82B224C4113A8E4580355E0B80D408B1D34F55E3586E9E680C689413 +5D584DBAD8258397EB0EC2EDA157621F90CF742E8F98974C36E2B1DA6DB71C53 +02A1E09A7E162F6E9B23F0CC5CF025CC9D13F55F787B2B565746C2AF129F0F4D +3E304C56F314EE80A250BCBA45112194B4A3D8EDE0985F9067493F095520ED4B +7F1CC08F330EE6F17DB5EE43DDC75AF55B1EDD1B41833FCCE5E842516E49BE84 +611BB71A150B44FF998B5866DA29D7DDE99D9D63F862EEB7C935216E5E60B772 +43800ED5868AFFC2CAE01F16B50902B292C2BEAD2EC5F7AF059BB8EB0CB73C0E +EA8F144F716F3565B3CE4B9597B7C0257BDED508A600D3F1968CDE4E3F773F72 +C1AF5E675E3AFEE289515A32C4A4038E0B01410B58AD63AB537FC501F3470514 +A0AE66FC127777C616379F2DA2307DDEB634C5968C1EF03BF7981D9D90C14E37 +AAA1A0C76CB40A95B77D6ADCD43281E3F680AC687F859ECF4AEB35639E1B04F5 +3C88A52BC559DDF82BDDF076E58368AE6C8072EEBE110683B069FDE3BB0F5E38 +A3EB4E820CC8B98E2716D27925F5351C3B3ADF3D60398813106BFB474617EB33 +12C56B1BB2D743E2950677BB680C01DF42517D0E7C7F035D968938CFABD07E38 +A86BF53ADB0CC8715B052FCF6ABB0ACF56456F4F88C8D0E17220D88C82DC5087 +CD762D2538E309B6BF33C1F9B449BC0EFA035DDB9D4ACDF95B12FCA8BC429A78 +FB6CF03BEA0D047832E23A3A3215225CF76F2C213C92D706AA96182368F64173 +AA1D106CD441938A5BF7218EF0E1B73F2AD3AFF7C87C580B7643BF5994FABEC3 +CB362FBEFE73BD731ECE265093411559A49A5CAA01C4B55BF0E4CD7EAED28FDA +8C264B62682DD64D12C7D9BB5119269DB43239AF2C80AE362D7716B5E49197A7 +F25B759B90DE0A436703CBCE72C472C53D842364D3BF567DD3F7615B29F2D02F +C4A8E4603F76DA39138CF8596733947EA65F1B8A55DC91FCD08425B2DCECD526 +5DEB615E7DEF0155ADA336A523D0974D4D441FA925CD876CBE1A85D644831ACF +705ED79DFEE14D519EC7930E4243D38E86CF01F355E675E9BD24529575FD4A6E +2187DB6C8AAD53613FA7FCCCC6146E9F99DCE7B10815B49659D24880A949E036 +C849783186B13EA91A595FDD1FEB4DBBBE58C512F89537B27A2BDC4B568D1E38 +02916E8B4AF4A537C19453F94710478DCB89743D7EE30E15C165C0CE881CA43A +E18E3E98BCF0423223E37C9407A872A996901E03392F8CE81A928727FBC9BF85 +6DC374D2AA3B2D2A82CA328E4F1A261B3EBEB470E5001274F564115691D01E8C +A7480387E7EC74C5CEE5BDEBC0250108FF13D87C71EFB1BCC9C5B8028D70A79D +0D2161380357E0E96D15597F673722E535F7C459F2650AA6403778C64F74F10B +049AAAC72E6A409ABDAFE7C2778154D6E920D5E2AD710CB4F7CF7B52682EFB68 +FBD7DE55B4B5048A5738A329842AF53128E3A9E89ECEDA65B2B1A634EECEB846 +6D7C0E11933A5278BC377C5A1F50BAD2DF04CA0AEC47908DC12CBBFC367448EB +7FE9D1ED7F2E13E35CA8E6FFC9734CFDD15E5322ED7D476A537FC691DF5B1CB7 +9C8396431356B92F4DFE47212F403D0A60253C0F0E7BD7768B157FA239753729 +CF0C82DC68EF1B83B56573BCD38C5D97A3D3889C650AC889046FABAC4B55856A +858896E794BA81BF7D3917884F4989C120FABD9D82698DBF7ACA6FA03B7DE0B8 +DE93ADC29B8FA9DFC15D5B6578AD6CD89DFA21B2E0AF7F0FFE862D1839882472 +809FC43C5255790B323AB759EAFE0928391A8E87F2C6E50D7A7B87E6464EA553 +A1AD7FD38833956A136AAB9BF20ED42A2972FB4BE9186D48C3759D0FA38DAFB5 +7C4446C3E4D0743817A361984EB4CE36EA8837008484F27750EA45BB0481B07B +CBFCAF075117CEC9C612DCF1F281C265177362A12F586DB66B890BFE45F0A5BF +D0F433D8C3AF860D3423F6D7515192AD9FF0B5DCE2F50074BC2FFF95AB9ED49E +73EF0AE628B503E7EA97A3B3FBAD0FAC2857BB8219ECBB90CCCC74B111A74F84 +2960056DBCB65504628C56B8E5F887912C80D8CFAA2226E23588AA243C14AD88 +BB92D576D161A3C23D065EA003369BB7E2DC0423609C2591D4AF74C86D998620 +B7F6BC6162BB2D98CA81222349BAC8C5E6A3F3170713B188FF08B8C40FFE0B2B +DF51D256BB2A08D1FD0890BF51EE599578E189A99787022E19B8F44E8F0CAF54 +BE711062BBD9A270D1FF131D69F1ECDEFB84CEB2CB1AA8A6B474683911C895B9 +8CB36086B59B54B4CAF966749A2D395FBE6F4DF81F71E37E6A0C5AB70C65DFED +CA21D87FE11CB967AC0E11B70CDD98CE389DAE41F21C429D57482B736EF9CC09 +16AB1D0E877AA92557D24375804161A6C1AB7C8912512BA2E0D0B1288A6C6784 +9EE2F3573B32873DDB0AF81C83B9097C0E4E5A62B6E324A02E19393A2A344DD9 +C6FF7B8D8405A6985F1C82FEB248BAA43FA630661F9708A1EB25A9C8EB93555C +5878D5CBA73FCAE33DCBFB998B289E2204D62B8463AEEEA2DBDB450D6DB0AAA3 +A4EB5562F40D56A252C5D76E71CAC523C34F2A3CF56745A909C79A1A202D64B9 +EF5F98AE02CBC7B9B4D6CA1192930C93E9516C7B8491A38254EE14AFAE4C5E3E +CD9560356BF0E1BC7CA29753C978394A4B06BC0807323267A97E6AEF0EF163B4 +2C92A7610BFD6257188892B55B5BFBC1802B0C648C1968AEC2BE35CE5788F7FC +9FA1A42826378BA3F5142F8C9DD8FE321DB0553838FCC28B2191A5A26154CE54 +AF61C72B0867FBDF822FCCCE8E08E9BD728A7D063E3E9AF29BAAC110B817B34C +A5D9B8A61CBBB74DF4FC0A490BAD78938C4694B26F84DA7A8A241FE91471D2F2 +0F1228907E852BC113205EC367D43A6BC47DC77742A8C0117704A0BFE29C1EB1 +8E35DE45C4FB9B4E48AB4E9EC0FA0F0A33C7197C19B41D2526E74040E6E7E797 +E18A45E86F480DFA98164CE339EAD8533F95274C13F26F1433D7FCAC9E28CA00 +5CDE03DCC7AEECF7FBF442840845EE1E17B58D71E9D58456CEDEE36A57C37EF1 +7159E3841F282ABC7E1C66594051DD8C7A9E7BE73C987E1640F345DF66E42360 +65E4D30006179A3355B7F0C54CED3F577A82D30E99617E52C0CE533016DD5B10 +211A47C3FDA4F9F7B54E61BCD46F7812A26D127EB37C047B67D547E644CDCCC9 +97CB89F6FCD4B80C83F15D5D280999772613A4F08F3620894C7C594C115A5FC4 +A0699C5A13F5D846F2220FBF86F2AB4C209F8703659389AF32991377A3E7A38F +5EF88E603CB754D88E536CA1D071BCB9E9ACE9D737B8430ED73A1642DD094D87 +CB2E636ED90ABB1FA9612DD39C767B3C0169FBA67B3946E1E852E33588B8AFE5 +D593AC0BA2A92D76758BC611F252B7B0C00E0274BE5FBD392EFA86EE49473788 +BB5C80A82FFAF17372F480A08459D6E042361ED54CECF42C88523EEBFCA805E1 +E59A1743234BB6775AFD46BF07C533588E38634FAD480E63002927F24680B547 +6C63D3A937F4830D31E7689E6D422662651CFFCE6EA129C04F632D88FE43EC27 +CBB4BF4D4232D3DDD19599026EBCBBF47DA6C805E38AA6C11F1E1857A5E8F1BD +4CD21F360419A0F3E555DE7EF68DE7E081573FE845402365C846F1F6B58477D3 +1259A60869E4B93EDB66C10D6B0E46D55D0842CC47DA05D21C8FEC6CB299409D +7A1BB8B99EEDEB3C4F10A2699458F19C320F3FAE9CC6350CA383DDE889047279 +0FA91175252A42834BF9BF5D19AB0032B8383AB056BBDA41480F476835457F53 +D1083B641023078AFE58B2CA0FAE3832ABF70567D5E5A0EFC39C3FFEC8A3B2CB +3624002DA2706BE3AD3DB339BD43BDDD9BF9D336F25E572289F105F319A4FEF4 +60E799202F759DA96C6489A228EEB3E975BA1EDFE6BB1A13612BE4A5B690C615 +97445B00FCC75097620CA90F06CA1C58AE637D12186D892295FD5FA126CE1D76 +011AAC13442F1DAE04AEC3E7A5AA6DD27F26ABC69EDCF606C10D34B0F32CB8AE +2B0D21CD02DD3456FA3BD023E4E92233AD9F24146B7EB0C2A68C49FF71A01FC2 +2CEA9C5FA57F09147C6DCD8D3A4A33C1A70000B334527716C12052092B10E905 +9F22B1E3048E68EF2525762163421C33A1CE61D0923C75E738EA9A37DD3271C9 +AF4D55786F5BEAD707EC8AA26DD53D88476BECA54403293E8CDB02A083294545 +D4BD7DCBC7A73C480D4F3A903AC85AE133384CCCFDB357FE6B6B341FE71E4A75 +D283D1511423A2596D7543A293B4A6C26FE21040F0A3E8BBFEACD0152EC3F190 +ECD74D3CEFFE9C3E86402D8B5923CA46C8046AA3C6DA39983B645808F97F4332 +D66EC475C8B93982A7EDA2BDD0792B332A9EF932DCC11191E399900EBC05C3E3 +8AEB4B4CB9539D6D209EC0BD5C49AD675409BFF8EB2DAA5E425D4E65E06A2458 +F0C4149361EBBD54708F4B4EFCEA571DF325AF6835652E7C493DCCD8C8C2F01D +382B800240082986A52D925D6F804BE8F048CBAB7C60DD389F7F3501121E1752 +AC0606E26537356594F6DB786ACC6152D194496812C20C5310970505EB0C3EE9 +73C5AB36FEA992F2ADF54BE9CF51B77D4B1E3E63B9A40E2D701F904C5E0259A3 +14C12EDB20B2F5D534ACC7C3AAB655F58C73659C9A177FBBC40963B6ACCEC0C0 +8BEE4D7EB45D68FD74C3E8AEB3D432CCBED396C3EA5F7EF4E40A8BE9353256A5 +25F88514221445F3373BA7FA3B3D360E533A17FA74D1F63EB847F313EF4FF04E +62E3057E60FDC0DCE1E8DDAB7B45678F68D90680E750DAAA3BB7DB64E938D89C +6246C43EEF4F68B65B0A8704B41882495F83742E12B2EE017B1A74DC8E1F4761 +576DD2027EC0F9C65F94E887C1E82D403879FB4DA7CE46B6B64B03541DDF3788 +6B417F4557B029C1A5CA503ED1379FA986DD2ADFE5D1CEB12F1B9FA0B4404132 +FDCBEDBA2693C41F999E5FED058098745312F520189CFCD89AA7EE42F2BD782A +FB595F059CED0AB8D0BB55F65EBF29D89E023070E8A35964F7D8A8D5511941EC +65C5BB39B27168C392FA68D211056BA38830B5289B399927BF79BE6733395940 +DA32538EC63BC1435F6500BBFE3641B96B52D46D4051E393D302672AA30AD51B +E3E6E133CE80E6E9A7D979C63F324C99B5A6FA7B8555F35891AD9F60942D4085 +68A4D12E945BAE908F2C71993851A616D4E69E27F30441466DA68E16C74BE058 +C8920C64CE03667344F9DD28EDB24C5062BA27BC75B924029E5D86636A0E347E +1B41D41B6556EE350C0BC921F11232DA04D5387176DC11C4CC64E408C164F8D2 +2EA268E517813474172B3787747D4C12DB61804D93F3ECB81A52329B87294C9C +DF2AF75BC8AB538565E066992E8F6C2BA4B89D5DDE0CBBC202396D31227C777D +60D7D5905ACF8E02AA26DA2E49BAF4464701D01081E206291FFAAA45C5087028 +AF59353DA8569D6000ABC1B744CCC4C0A8A391FE1FFC415EB4901F950D0B4E7A +89C6F634E5410DED1B428A87EC74BDE51BB5EB54AEF68C385BDD5ABB283D390C +02BE931669CB603C063191745F913756B28E81DF6B3760804300B01C4AE126BE +C558B85BE08C2787A930A944E9A6F7DFC85E7C243E4BE99B57E2B120190708A7 +60138412969D73387995B15583B8C2B3BF6E14DBE22599859EF551E741B04DFE +36E53F1D04E091C840C1A9D43835A12F4244D4D694D46B6D3376E824FD3C50F0 +D889F2D544096385C982B5004268D199D46E56051B2C46BBE23F0D1A3DDDEA28 +1E1B0A24C80A82C2FAA2732A5B9CE81B6D22EB77ED0EE9E3E1F89E2C07167A86 +839255DEF07653976250EE4839BF800EF371ADB3B19F92C34193399E6C2B005F +5CACCAC594DE4B92EFE30C6E891C622BE799804F691EB54BD12E95F8CB57C618 +8FDEA75A9FB8B65F3AEE065B9B4C545AE70F9A1925A0D7BA9187E559E85C317B +F1FB71EAC15E75E1E93AE8D29A56F4DB65684D6CD4AE9BAA74E1C57914BAE369 +17C403097FC47954DEB81B049B99B80B9B2CB80B709FBAC869077B9E5279888D +987639D5CBC79C8102FB496E5387450808238930AEDC3F2A13558E56C9587723 +4F9FD604CFB9831A34A560E2F24187FD519A3F2DFA87541E4DBF75642A4044BD +B62A47799D79B6A6341B2741018FE8640CB8129AB492355B0CFA3B4C7D0B8794 +E0BC808057F439C71057A5E15C1008793A9733A0007D7C95C408443F851CB1AF +B2D2DE86AE8BDD6234002311C81AA07E10B58AB87784DC665E498DBD1F19C7F1 +7B3278AB45C358DD71821ED3428296EB77771E230F82933E71A99662199DFA5B +2A7988C4060180B916EE8EA9F4896C0975AB0B33928BABAC1D7B08C4C80984F1 +3E1EF19F0B8B61ED8AE5B5325EDB72234C4966B0953C463CA79935C22EE21855 +62C316E3C26BD4CB68482CBFEB2BB05C353F1671EEDE4D30162472879F82BC96 +F9C32CAF2AB2ADE3E14D704A1871E193BFE97F3CF8BF9C5E1806446FA2207B68 +A1ED6B9EC3C914689F2AEF2436792D25A7829C2E7D53ED15ACECAF1E79B589F5 +90D80E0A25DB1F40F6C1302B33DFB91A933B888EBA3F58D267884F0A4A0C675E +5CB0FCE0AD0F58B692344E2A3A20D657035046173A346C1ECA438BF92F75A047 +89AAAFD72B7FCA447146245D10B1508DBAC840FA1D52DC174DF2E64D6792E4B5 +874DD42DA10CF5C2F83EDD54DF2045F1E40F50F529CB7F9375BA7F5A57D0A5FD +D958183A252FD7AB88F9E2C099F587E716C6ADAC29A90619CFEC1E9E6E63046B +F688F7DD7843A1216917A0146C248FC12126E8DD38E27D05E8014C7D5614C661 +F102BB47A24CC223EB05E7F5A7F33C554EE4B5E6D16087884FA939D3E56A0B7D +1E3C9E7F6C3CE95369FA6796F24B5A11CF30FC93160366F5C2EF4FE1D6D1EE9C +E21AF6B09F1FE1D076353801D4799A38DEA9D323E8091F591884D471336F0BAA +8B353ECD3B7E2FC36F5F4C49B6ECA8C08078F857F919BBC14A2B51B239807698 +37764DC6C7BFE510F180C63CD0E1A9B001DE2C50CD99D934B71D9CD633F40341 +4C0E56063100447522DC53346428F562E9F6A2B4CE6644EFF13BC5A1B0C1E75E +659F64B4C5D31E51AA2DEA57882BA22D149145FD316F928DB46E680A269CABDD +196FB35A49DDE6F4CEB9D61654CADB3B9314EC1C0DCF0DF00DCA92A944BB40AC +31F94EA1FEC6993DC4E8203E6C850980DAC682B04D2161AE3F9E22F34A874A5C +3E24B6B0C44CEDC23380752B6EF7601670B58C4C9B25728709C322DD98DFA48B +C965B6A283D7ADABEE1789A8BD54E14E6B2D6FBDBA6E19A7DAF45646E036FAC6 +B761AC1BF621780B92CD97E068E50308D5BD6CA17F8BA70AE30B9C5F07C2E8CD +9D4DCEB6844CE6F2241B1D19BD6A1FC5F28848DB10FEFA1F55BED0283AD14588 +7051A33C3854718059920BA88259032FBF481F0F0A2D1749A867BAE63B0F6E92 +8A4CE00F73742D6D07DC31932D8526B78A806B1F242153AB3F358ED69BCB9A9B +EC008CB67844D943E1BD3512F47A81959D74397B05AA8F412A5DAE4F657B4738 +A8B77333A3FB07ED1BF72DC0BA5CA9BFA3E74AEE58754BBDB7D8A898C9B111E5 +194BCEA1DB2035C3B1F6E012D22785F9BA38FF027B3B622FC8F0F256787FF91D +FC4C9F64020219428302102566BB6A8D572450A2647521DBC714D7C886125239 +1001F1C8D9E928873665E89A043BFC9F4DBC8DEBC04E849B1D52B3A9A108FE6D +09DBF96DEB165F0521B90C4DCB60A8187288C400B85E6013ACA8227AE83A8DFD +351D6C8F863197A4D44798FA3A292FC2B21750B077E9B9670D25E023B2A6C14C +A6DECB08D3C3C61FCECEF890F02B6442D0D7C0D419DA2889E7FDC3AD977C5643 +3E61C6793A2729CD435B3D4CF67A92DDC450CA6F4328F028A962D0783EE0DAB2 +4E9D496FA28ACFB0693355360E997D3177640A354CD8DCB8263F18D621218201 +D1E7F6C31E8F08ABFDA261B7A3512C784931514773B16F92D04FC11B637B8BA9 +BAA804CF55C126CD35839A50A81B00ED35C3D32AA64BE73E2D4587025FF23A5D +ECD93B1298492A4FF326E74042EB1DC3E98B4F041F17F341F4277AE117D6E4AA +BD76023649042985D18C3C28C0FD330D6F0A74778787221B325C4D810D6D87FD +8EC7254D1AF3AF46C2BADE5D292225744945CE0248AD303DF4906E0402159D5D +BFC58DB629CDE8E81B6EA2E0D5B50E1C455E7AF6B3368627BB3FA73C2A72AB31 +627AD18658C8BFABF0D7B2E40A9E1490D03296AB1792E160FCCAF4FEF84B71DF +E284C03E87F17D3A440990652A9503B2C45D48D9C8DADD9776238E22BEA1C4A3 +AB05918672D6EC5426E06F688C42F4755635CB0F5C41694DD9B07C5945F6F7C1 +EBA7277B32C92E6754970F6821B217944E09E89A81F325D78AC5AB6E1F9A1FA3 +358FB78159C333EEF87541D46247902155B6DF41F1241C58197825D3E2F8C1E3 +9029904D5203F7120AACB8C012DEE6460257727E259831BF7CD658197343C8CC +9832FA2C62D730D0867DA1A688C38436D26837794BBF6AD78E3A8820867CF045 +C9182C904A87B9F542F4CD87E315C0ED1DC3A545D043C2F337312B0C70144BC1 +29581023FB0C7E114BF72C0D010B3CADFC79E87F303F0AC7FA0CAEAF0A927D5C +A9672235B9E3F4DD72112C1273C8AADEC3A8ACEEEE81927E3F314DAD0FA7F412 +D32ACF1287D1A500730D8BF20E290B2DBA7DA8A778BB9F206BD31E2989DDE5B5 +D5CD2DB85EF2834448364B7EA6DAF3BA0088D9D9260B6A44B0E4C2D3411E3F64 +A748ABC0A8E9BAAEF164732816DE572EA825D945F4E894D7D2E3CB36961EF8C2 +853D2905F11FA8AF17763C31B7216A8E6EEE28F8F3E8A7E9345D27B52EB6AFC9 +33462FD5A6DC850EED8C4F403626B1381AB6AF3D6E8BA6BC7682095B180043A5 +6DFC2F7D7304C905771279E71D05ED597285452E06928E3183F91589774DFFA0 +7344946AB4081EADDB102E205A17F49FEBC1702E33942F5260D87DDF65473622 +8218C9F68106399E2AF3EBCD07B6B58284CC3F4661CE7FBB21073D7A313CDCAF +A15A05658CB96154F2232CD57F183153BCF0DF1E96F1323D1C45F23D68536C23 +D2B141AF03A36182DCB872B6BE7EBD4423A5C048FEC8A6C6E92434A9E1B79921 +333A249BEC6ECA29FA4FCD627DAE3BA8F6E123D95297A9E2D1FCC426BF7E50CE +4842D85C3E8ABA8CA9241DF6AC71240BF1B73F0DCB13E1E9D2D1F9AA6A081476 +6CCAEB851EF19ADBE584A7A50109007AE42D3C3E29971D04A0F5FF1890ABD460 +C0F9C909685D097583ED09EFC536285F752B16A55E31E6B34402B6160DD97563 +1AD5F56A8F1F76A3EEE62A6108C2FA0CFDC25591D00F8896A8DCEED9864EEF32 +23FA25110F6E78C8F18A55A3EFCCE0922A3C733FB9D4C8E0F5952904DD5410B4 +5857953647FF97355F9CDB187FDEB54E8A6E4EC0ACF4F3C13251BA034F5DBD7D +C0F04E856E49FBE5BE24D220048B7D9AEA6689484EBB50AF1F7A1AC4AB251404 +8F62BD7993ED8AA929A029FA4A33CAB57BD9A54749A796DA9A9370E1355463D5 +4E158E05FB99E2094C3B273787D851D433AEE9AEF73FCA873329ABE21E5CC531 +81E7E9B76F347F43D36E16C10C709FF9E16695EAADE5566476B70906B2F93838 +CFEA62C80D0A5FBA21711D45DFFE3AE3F2CAE050648FB91C87EA39757D7D6885 +B7018BFC81564DE44580290F53FB601701342AA22C825C566961EEB9F886D550 +00079A5FDBEEC5B00293B784C5651C747D93149B22DB752958992E64AE87C919 +D97B0DD0851E105E8D4C9FD1792B94E7EE1566A482A55BEEE5F4782065667E99 +FC0B355020548E10A5D7786D6FE53589D9B711D0DBFDE94205667092766B8351 +0CDB4B715EB701B1BE4862B18FC4A26D3A8A680EEF001C0EF439972FAB7F79D7 +18AC641B6D1DD5A613868D67121C0B67012EB27B920AAB6FEC1B5D067B7DE813 +FF1F3CAD1C279036E0F2B02C91A32339E1AA011CBADBBEC510AC628D85273FC4 +956EFE7F85BFD2BC6D57E9673AA1402B0E145A2ADBF33C3567BC47B9BCE16A5F +A049899A532B554245FB468A6024E7F1D6BFFD3F0C63AACBF8AE866C0504DC23 +266A566F4EA034458C160DCA0D860995C246DCE9B8BC76B742AFC3A23E15853B +242CA55B38B3F1AC192CDA70C873363D4F6912A4B6A9D691A53BD33F9AEDB1A3 +0825DF6D9C57254666105DB69A8CD29522FA2F4016533BAE1B75031836AFD5FC +5ABA92E8588B152AAA2252EB8BCB5F5C5936E6072167405112A10DE09EE454BC +48DAF59774DFB93094631DB0F2C97480EEF0006C18766AE1EB1A16DC6C0B52D9 +9ECCF897B2DB4D0F690749F8068F82ED159207E06CAAC19EAF2FE95CD333DD6A +1DFD3F3C2EDF3C0734B14814BDAE8331BD430C963492FF6E7B0BB14D56613FD2 +C27A6FF7D390C13286DE72F5241AE846120CE1DDCC827D00678A3CF0E49CB7A8 +6B09DB2A8072898C89815C8B01240F8E7AE7E20589959FEEC6470089F8415C7D +1BE0D344166835AF7717016826D627AE4204D914A318AE84C6439E4A9E8F12C1 +9D98A1D5E85D00C536811CDCD56640D44C7EFA03E6FEAB29636210534E406252 +A99D75C077CF99D8AAD43644EA16DCC28C6F885A041E0B43981F09959A603ECB +19F9ADD4D4997A07B6317C731DD429A6F0D1D99CDCBC475FAA8BC888EC263433 +0BEE727E2E0B6FF98F982C1B128D097314AC7C696F84F19DAB10DB5160A59B26 +CA44DDCC9284B843425A302C5B21A829BD261FA33A44F339D51B2F95C949D37B +D75FAD32FFF3E76FFB7713FAA9F15FED09094E476382531DC9639FECFFB3940B +E7DAC4BCFA633EAD07643CB27D9CDE05AF6ED670D74760CECBF7160F46742AA8 +FF962C22E1EB0E492C75929625F6839E6190E81E477914979837A9F165B13B28 +C09125D9659BB596B0E8B165DB17965AEE56EEB46022390513F395C2987742F7 +F141E45BE948632B3272BFF43934C84950649B0AF418E42DBF71B4098FA8079A +5F26F81922D97866F8183783DE8289703D0886A704CA6C2FC9DEF3DD9B116F18 +23A11A448F7D8180E1BFB2369B2DA3E6A09AC65A3B7AE63EBF4E388855F85A7A +23E90FFC6965D9643E9FF8DEF8DF0DFD552126E19B92394D93A492B27E4D49E4 +36CCA1D51783E6A2A2ABC9657D5B8841A2F99E6E89F29C2B1ADD7C4D4340C3F8 +AC3877D3D11C28D6E1252E690B3F94704C9FD6B64BF03A46E1F399830162F5C6 +CA081A12E1592D9AAA6103A2C10BB2CA96A7BB2A141385C5D550EAC392EFF1C7 +FB1708AF908BBA2F807284B87764DB4BED8B26394BC24F07D731790A1775C909 +68B17ADB0F4A37B58F55E514E85BE8FFDE0D1FCB02EB75990A9BF953A88FD966 +801A2428593E86E240CFFD0F5A9481BF3E64AB2B3CF8D8A7C6DA10E5D4F96A05 +7E207E4C6F0CE1FE061BD6235AB57F568A664604D913F35AB9B9F693A4B93EB8 +19A583E1057E77BBB0FE596DA83AD659FCDF9F793417643DF22C12CF0152A76D +E8A1B9C890235D22B81AC5255BC024FF69A8CBD1565CF30778A80B56D31CB253 +0C3A1AFA5B912ABBE79D1E84B68407359F72486A6EB1D5095F8323609F0BFFED +303E9A448C3385521D9C6743DE00ED69C1FA67DDE59FAB55738EA5E48FE3165A +6A64B88D8B1F6E033C6209D2BD3FB040C0523A6D0C266758DB2B43B556A6E3D6 +2384F9ECC1BBF49F0A922FAB1E1934B279C7E8754E1C0ECCC831B3A7BDA34090 +31B9B02B8D514E21AF2EF6A66B248EF1F50CA646FA603F9591D4951C22472018 +B5D4C5822247FC61E4201B55CE9B76C0A79FA05A15B85736B7CB5C8421147314 +499706F303606B3A0F75012CEC4A1AB0F30802CF0B5769172FCCD3E057798E91 +CAB106C3B1A022E93DBB6721A3B1386C8878EB7C342D8ACD5C86A30DECEC22C5 +55C18C1DDFFB5B15D1A81CC9A9C67649B555D5BF07FD1BB5DCC7ACCBCB7E8066 +5635FF4F1DDF308FB2A2FDDACA60FD88387821B10753D7DF0AE56BAC14FAB05C +0A38D450C22F13F00EF31F73701F38BF229EDAFDE8C3F6D41DBD51616114FB8E +631C8D64DB1F5C0C359C1C46AD245ACF45734ED7D22A397333262D7268453D68 +B8AD396C05800C05819BC0794148DD20E6D8727CAA6F167F5888249C44BFD95D +A85B651D7C2732BD1FF349E7DFF7778E28C88516C04AB1C67CCD5CF9144961F5 +93A342144450258D359232F11FB19A4AF79A0C046E845B01FB7B5B5D62622D67 +DE1D52D712E1D1B4ADB8D5DD51309F2DABA84D38C1ADB4B31EFE80FB690605C2 +B63BDF89D1FDBECB2AE4FDFE47EE5C122744875C107954341113B31BA1AC4D07 +2166F69F1386BC784D82F69AD51AAB6C22FC8641F1AB8989307F7643782B3FB6 +FC72CE90B42A92156044413464F8634A5B4FBC48C347E8D2CD8A1A407C44ED27 +677CAB77EC2ECF29BD752544A69F46 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049016t.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049016t.pfa new file mode 100644 index 0000000000..e47d5bb999 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049016t.pfa @@ -0,0 +1,1582 @@ +%!PS-AdobeFont-1.0: LuxiSerif-Bold 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Bold) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSerif-Bold def +/PaintType 0 def +/WMode 0 def +/FontBBox {-217 -211 994 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078992 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E494BF284EBDC8877C4E +5D28D2A79EA7D5EC25EB01F73826320B565BFED33D55B5D2B4128ACF57097B2E +BA8BD7BC7EDE9E6C636AE6FF86DFEB5E9BCD723BED1C30F8B20C4086BCF5FC74 +44FD8939C7580185BA7BF311E1E56D7C53EE70ED83BC1615501895EED5042083 +A5A0D8CC28978C5DAF869CEC1F15FBEF2A58A11A3417D1527AB511AA9B6746E5 +5798FDBD24006F12521FEFF4284ACEDA2A6FE84D9DD417103B4B1FE7FC2BC351 +2564D903599E253F6F4BD11D7B3BFCD01EA9DA51FAADA5F18B9F5E5DF25FA0D2 +A1BD84D42BAD716CA9303DFECA5DF05B26EC60612FBE0E931112268B223FFC37 +FA3ABE4C7E429354DD82D7F24B6A342F53EACEF4188937778E2F037B002B29F4 +9A4BAA19E878E7B0A6F326E3DC7949DA57D84E1098506B0B4C1BBB57196B597E +310BF7408315F69854ACD0F8E8640A70F20D4EF409AC0F891554643BD8040BAA +6C11008AEE7BE22282A1328C271E30817386EACF45542EF2DC63856FDD867C3A +4408FFC606DD5937B74882832FE9D3C806AB1C6594AD2F95B763919345E37202 +5C3474453ED74E5344ABA7A92101A287E932E8900F7CAD3083D38FE1EF3ED4A7 +E6C2A0A8A19A2DCAA58F823D354994C9BAFF5FAF8BCE6A50B275F8958E9254DB +32D7BFB3A1F3739B650B9704B7AE03378D90E8432A1BEF6EF20F8F49EFD919A6 +C9C90F60822299B0B50C0EAE5243AB66D9573E257E99ED424D4F7B284B779EBA +1B47D49FFB539EF6D3CAA911911E7CDD9E7CCE13F60F2C698A7E4AA8AB3A2B2C +6F3C86B9EC9EB8A8B8687FCB279B9B2B4B5F838FE25EDE772B77407CAE3C5840 +1EC417A4D627AF14F5E8D5D45EBBF564279361B871A0A142962BDB83EB1673F3 +CF7A34044DAA42321ACB120827402D43CB17607D9C8CB2BC726B8D06AEF513E2 +72CAE380EC17A1A2B0F235FC70D479A606B3360E291426B0C651CED104A39B26 +C4B14949E12B160B048969242BDCB760C123FC89DC73D8A628448CF678C9F679 +99EFF5E798EE5E46F41D1B84A38631876EC8CEDCEDEDC21038F7707A1F4CD355 +81003CF5E163C1DF8E76B1C4BADFC4C887A084E94CA74AA5314BDB69CB0C5F79 +B80DBCF17D95CE7B1B0E3C68652158131D8B776C368203356AEBE5DA210EC561 +8B56C1D5BA9001CCFF14D7AF2CE1175AE66FEC8CFA4F1F2D2C2FCD5C00FC62C9 +98F5FF6209542EEB45BA0DD8ED9CD08DBD58FF8A70C7F1578AB22E25136E31E6 +DFC05DC28A66C6C852092E56590199B2394D5B99D466EDE33EEA357806A3D0D7 +06B658A6528AACEC3682044D37A42E960E1B92E7E064AB891AA0006AFDE4D8B4 +0E61B0480EE2879F3C8455785EEFE3E8C02D9A5EB4EAC0AE01C79C44F84195CC +4724AB8ACC2E93B1551E750DB22D707F1BF8FE2E9A751E542F347A7E54C91D69 +25E99CD65F7A348E6234D1933177E5EAD802D3907161E7A19A3AF41378FDC8CF +464A5A87EE4D83218A9CAD27B1F349E55379DA9640739A502427F52C6A16CA7C +FB8E3F19E256918FEB39D16B6C4734B058373BA35A222B58A6421F7FAE124E40 +B11A646757F60DB2ACBB0E8EAC910698C137FE9149DAA39EEB195ED3823F0308 +A8BA9E889E618458ADC62C8F372B4BE51B66FF0E9F9837494E1E04077959E166 +C3654872114BD6A703746FB31E330BE538EC7C440F0473D5983C86714E002205 +7469E7C388E390068A302F16F7CAAAACE00BCBEA71E1C58E3B59C411965F07FF +04C2FDAE9FE2D314E85C035F58440DC004366307A9173BA9342B0CDF58AD1980 +5C38795CD0967F83E13EBBABC37CDD0155A49FCCEB5233B0031BAEB6EDACA49F +E842B25DD5E791DE4908C94E372B2075F9615CEF9275316080AB9F5E678AE30E +CCCA7B2C9E71571B42A5315849B08DADAD9ED58120D77BC16019006704D436C2 +B36A8B3860A5B63B5864383034B6FF0252E29B409D01BFF9752D9A845493EF2D +2F1DA1B6DA9933D24729E8002E4507A15D90E0CBC40FB562E4C0CD70A95B5D7C +E70186CD14657AE2D308DB650768E9B135E24A82212A99EA217EDB93D1EC03CA +2FE7B4ADE5FE28A21225F39722E0C2144536DA5083965642FFF7438AABD30710 +94D3F4B1118179748A71133050E51C94D9928885FADDA8383EF01BA234BDDAB3 +273FAC0D86260001AD472BFD440009C19EBA1C212C581888FCCE590516767F4F +A17C7F5BE71A2262A34673DE3CA11EBFFC1A971EBE827C4A232E4C6CBF65DA34 +A1D231C875BDCD842BF21E1C00E28AD90C73571F040BF095E28B4F4AA5E3833D +D050545E8B5A04A2F67B7C0EE5B49ED30B189F0130D544912E0CBD25D09EAC0C +334B30759FF0ECD7FC05D11830F0ADDFC9F84028706324B903AA963FA4FEB4E5 +12756E76F8A55E130A14866983058A7FA9BF206924C0C7281E7EFDB384F9F1EA +EC120F349CED13B2F2FBDB930D1A66B1AD1C10B9E66E7AE2830B9BB5A51D0DD8 +0A5A0A0729571B9DB76123040AAC7E791137695FDAB0639FD2F994107145E1BD +A539BA84A3DCAFFCED2FA9A1642FD8123D65E24FEA77CBD299D22AB1DED3AB40 +F0DC657EAEC450B1170CECD360093EC0CC14E2F50E141B8F52A3F5B9D7CFCA92 +30D819A34BC303DB080E7919E573B46489BF79691880EEDD6B992CD63374DAD9 +2DDE4B0DA61C03CB953ACAEC3176B7C474A1A5A351B259098FB2425D2522018D +98C0CAF94E047EE130438CC2AEA2AC11AF18F652C53157DFD31F44261103DE0C +4D582D29B23BCC137849306504F3CFE49EAB54D05FC62754A3166AF5CA301F89 +A1016CD076761A415C900AA958F922C6881BE652F32ECD8DCA3059CC335D3D95 +AE5C4F0DD70CE9DE75407AEE7801B9839A56C3E372F126A22A779D949E4111A1 +7F2E1B2D884ECAC744D2E78C1D16A8D3D67A6E818BC347F6E6DFE71ED0A7F45D +F37653BEF6DFC90D98629BD09DDC53EE1E2227CD0553375AAB4A3F10ABFC38D9 +A55A4D376D18148CE67C7D0062AC884CBC6500E646C84DEAB420FBF64E4B4360 +B2F5EB123D42F0BACF232E9F3392FC1704EA390941491BD97D191F198976EA7A +8FE3D14141E1BDBA8010266CF791D0E700C1F1C1FE69709712EBFB2136026E84 +A246F78B6B713D7DDF9E01745AE071B8CB052B54D5545AB56091E3134306A532 +8729EC3FD25AC305D3D39571C2AA50D4FFAEDECF998BA46AE033AC1D5DC3967B +C846E475352E0468C0826A8E040332D9AF6975859E069F70F624E8A646A65DC6 +1852339A3857C96593FDF7F4787E5A7D691C89396F4B5D4DF91A092863709AA8 +F7D8BC7C7739EB060C3BEECA0631CF9F47BE4854248EF5E88B79FCCAD7C19BB0 +1B745E6DCA8034363F4C5CC4B305FF2EE1B2B9A234F394EBE15B82B5F317EA7C +39183B8D590DA62B3277FF00283C5F5DBFE10F29AE99581F6A9227009300BE2C +2B0E509BD87D96AE7C5B198C8FB02DF8E1E5A648EEA044A5AAE0293BBE43D2E9 +33D55B70F8BB33CACEB5DB36CB9A731B3804D859E020E2FF49BF121A7950B984 +7B0913BC2139A8F70FF6DD3C6DC638477E4092F1179D540CD31C349CFB0AE55A +B0E772894CF02BE0637692FD6574D4EB2A76E93070556665128B99C20296C550 +8BF29B1EFECAFF31925ECBFD147490E3898A98D374904CB7BE2E7C752734A359 +FA107535533B4A97691A242FBB82D66C006A19374AE8698647CE8FE951EE2B84 +0E5836F8A3CCFB6F95FC009F8B5D200C0ECFB0BD6692A8644BA7DA5CC2E80DA1 +10ADA3FF7F79A40AEFCA4B98CDC4EA9C29BC1E901CCE1FB466DF65233B889C24 +DFA2E161FB6366CFF3AECE89C404283546D7814B254798EE928D74FB9B72B709 +E965F4369ADAFE799B4510CFDEFC772ED5516D9EDD5F1AF0410F5D82CA9DF5F9 +5134D9B9BA4984B5A8A3D8320AFC0DCD6305CDF582B08E28C28F0D137F73EAE0 +800469768BA91CA121A42D04A606D1722104CAED2731D73C3304F7C4371A1319 +F9ADFA53A1F7A7F8EE4D7B74E3473EE3C11AB66BB43756CE0D57AB36B5278E43 +B860B5A9C51AF0BE85CFEA6C3D114AC0AD68919A9027DA7C80D5C3456FEF5824 +1447D68ACC05CF272C0D0E62548DC9544908B9F50F5804B83C229F5E9B65C3C3 +CBE220648DC64EFC53C40473A421301F19E768D3BAFEA7FEE49FD3B4EC279861 +D9D751F4D49A64C463EF174D0F7672042E22BD2F55AAF7F531809A541D5146CB +FA4D776AD1AB10289B6EE3E01C19B8A8F7A282AD668D5F8B76C45A68D51BF56C +56DDA612D9E4FDA940D2C4B75593834F882AD142E6E39FFC70744CD9F3B7B19A +1FE25627DCC832F20296F2B4608AAC873F5F7D859D5BCC5C0B83DC569264102E +50BE5724F8F64CB35C8FACB12F460A311D57F4E52B7A08A5930BD56951C0C88D +6FFF6A6A18553FA7A2731F001C28093813676C4ECF8FCCAD89D94EFE35996AB1 +776298BF7E1EC9AB0FC95D6475A635B89F7E0EF16EBC188B1FBE3D105942CB47 +0A4BFB9FA132E1AC19D544423081ABFA1AAAFD91165B378D3CDD2734430EAA36 +B070A780F90863631E2C7CA2079B1EEE7666B975FB9BC62C37DB28EBBFF3FC57 +5356BBAC08A908976DDFCFC1664927E69DD7713A47B1A4150EA0762E9D30455B +F840841688DCD60847AECA495F411656D669AD3168F261BF9C31821EE3E8685F +761276952DCA7E4F21C16D9EF197AE2FCE0D1E85263C738E1CD88D4147ECB87F +7C232716CF20C51575BBB0C771FFFCE3C08CE867F426FC4D1DFEFBFA1618ACB8 +ED40168DCA837A254EDA92887905BAC603606E427256D2922D6FD43AC3A18781 +63EAF11A9102411AA6CEB7119688C106E71364A973EB54F1869B419AA6770383 +9D2F9E5C0DFCD9334CAC426FBA2AFD070A0374D65FF2C203516D9E052462993E +DD2C77E9F84B8299B2399045A09E37744EDD3F3DC1599A2B8901C84DD5640936 +8938E43B662ACBEF2279B10F44600CA2C61647B67C8909097119232BB82262D8 +8C55D939A457E84CC03F2DD9215C78CA82EF556DEFE179DDC0D248A933E9F906 +70850D991D72913C554BA1E71E71CB773020D452247B7B482370C8B190A105F2 +6074F9E154E9BB43CDCFF610B2634061614BE281B1809E7FE0B60D308507465E +13F424FA991810117D147A9D68D76170C75502E60E95D19B30081969BDE3747A +1CD185820B4080697411DE70ABBA838BC6AFF19E11AE35B5284B2AC7A96CEE55 +1D9415C7FB88CDDA4958F9C9892C1119B69B5E2B47B2896F31DE83F6476510AA +CCB73E9E3ED534D7269C8FF23B4AD964AC6A920C20F0CA0C469EA85F6D675436 +CF22A3B92B7A4BF502AD1A94D0A575A82E90ED3CDE6E422B73B6B76C23B1CAD7 +7E246CD8C3FD6A40CFE5E955613118FC584DF75CC434F8DFD05181056CCF0CFD +53BDD45E4F8A9424C3092C42FFF19D59AE1C003D3FD837882D6B0B2A00489F23 +518B48040D40CBF9CE77733823CA610735CEE4FA8C907575F0F0CFCBBA4D2E50 +04ADA5DEFC707A82324D7F288302C99D2ED5009D20FB875AA0F861479497643A +0E041E76CB10B898E1EC007BF8F70444474A75D3C005ECB947B8F8DE8356771B +EF4052F1D5CB3B19853804BCA33E0EB27B418E75AC398E79B1A621F85E4F5C26 +1603C789437477357A69A585BDEF24F8F0C9246FBB04F40AB6498FF72BABC3F9 +2C5D9476A87DB82859C374969A1016D0068FEC4AD30EAF10E871DAB9564EB600 +8EA14C41EBA75DC1D4B4EE36AD57CBCEA9E862542627551B530AD763BE607808 +5441ACFAA3AEA5C6DE659B15F522C10F7719A4F868473883B8D1BC1E40F7E525 +3C1196E9850B6D58F7673D6403BEB6FEEDE3105BC4F7CECB15A3BAC37E77D83A +D802F77B9A4B4014C1FEFAB1DED101A0FE0ABD220965367F99DD6E4C34C6F47F +040B8A1924E7889DC4A131408D8BD1AC15B3DD07315C4A30BD30BCB9C03D6C90 +ED4295840906E3AD448FF83F74257F0549BAA5F0D96FEBF943F07941121908E5 +AD6A27A33BC555B602F72F067273270498410D2089C3D1EE95D2C423223CA83D +EDDB1552B6E121D9FD1D0F5BBC1E9E8269C0CD6515B1428D61704FE230AB513C +AFC088CF436E7121630478E115DE2F5157D244B6E081FD74E5539385F6FD056C +5824847358D38BEF8896B93424F40ED6F485CDA0D9AFD896F921750E331ED55C +B58A93CBF1F74F1B11DFE0E35EAA56580E949130C6D670271921C65BF946FA75 +1B9472F92BDFDA5D71DDC5C3D03260B67E2D94773961664EB4FD4D23D49D368D +F2D8ADB7F2D6D41A019E20654EF4B78D35F26A159E48093EDDA1FDABAC484D23 +88EFF39E0A4C2A64953D53B6039BBA748751F4B6C077C9B66AEE9127E646723D +26F7E288365818F30A38071AA011E67F0E9AB64F4A943BEFF67BBDEAB4915B31 +FB6326BA1EC27EC9F525CD183D97015750C17D2944F793407DB6ABBB72AC2F85 +98C449326CEC03227FC767470A3F102A12C2A8122396D00025D84A3778A50869 +FBA49AB1AA1506839DDD675A8AE2DE1E44E83D300CCC1561210A23D1A97CD590 +FC257FB5367BEF1BD15AB855D07CE21771EC8B815094721A1CF7306AFB4EA421 +DED331B92C7481C683785A92B9E213B04A2E07F420ED9B9C025DC23D4FA9DBF0 +B11D6948AC62ED02298B8F1C6B519364B6140AB89B4B53CF1D05FB954FE7C185 +4C63616799FCF3492ECFE06D0D1E00712756862C3F0C1BF21FF08564BE0A3AAF +9364F4E7DAE16D828E7E5A2780BF6A9EF1CFCF680B4A96CBC4EC5DFE7E64E140 +31968BC00CCE67789EF5BB4B1E7A57D5FB53819CCDEBF38A555EC145FE2F607D +C199E3E514EE3012CDEFEE1FD70176F39B5071EFB08DBF3FDC2DB6E89E2CB41E +5F6B9528C7EDCBC41B3C4860CA7EB9C469BE1D5D1A9E590F6E721A956CC53870 +9EDE2D930ED28AFF92DC834913C4284847CA619D27B68CCDDA91E7BEB15F44E6 +DF8B38AFA1C63C6F484F0001247F6C60043DA83C802E0116A1EFF49EB943EAFA +01412A0D518E2E860F61B649D2AC312AC6D84BD5D7DE93A13DAF1C4336105813 +869D47538CD56009E8BCE20243001E87020BB2DA91D83EBC9E9C98171F1BC02D +56CF45AC7DD7358ACBF26590A7894CA6F99AD01351A384540B9615C233ACB22E +519CDEAF5A0A975B8B6E7C711DD98603F684259B9210E8642D955A4F4D977291 +4C9CA4F59C76E598F7E48DCB42A331BDC8D4427A13468B735FF5D2F58296FF65 +180B22485EF5DB6838A5C049B1371571D7257701929CECD5E1A315AEF62E2E98 +2AAA70C380E40C3CDDCA85A71558E3AD0AA1064F840FF75334059B84A026AAC9 +DEDB589213D45C520F8BF067BFF0170BE3120A8F6E3BC29E4D1114DEBCC4626A +96926AA20AC4396734C91808EC5DC632CFD69ED1D517D9ABC261E00815E1F3CF +A4ECC31B5B0348F96BD4AF2EAAA634EC24FD310F86E5C760A122ED44D2962EDF +06104A5DF36138284743DDDABC2EE689499333EB31347F488311A93DF9AC358A +BA157B8898903AFD6CE2FBCC2A558360D174E2A68015A676EF8A3F0A26021B55 +AA27B65B2755F48A46920C0BAFAAE72E051085538F6C60D0A77295754C755BCE +D30F94627DF2AD3311767D183A22D64480ED1E06BE21162BE345CED43DA52047 +3975C8647A025E2411F15A78368A2689E100D692F23E0FC660D321D55ED4AF88 +01532431864B03835099474C36F1C39C71173A04965719A7ED95995AD5AB40F6 +E8A33CC915D25C2E9EAB91107E89DF746FBC96DFD6FB7A9F020B0E3AC7C81150 +C21D9E5D9EFEEAB4BDBEBBDD705BFC0F3F52A77044831A6A0397DDBE135208BF +1E86FE2830A8311768634E62B589921D1B5B1347ADB167FF9B410FE902ABE465 +2E0C320C3B5F7CDE7859749978D7C2C80E5FE38901EB75FC166287F5BBFA6848 +C839C5FF11FB245ACC7B6C8A74720BAA44625D84C721AFFFA310E52EFA782EC6 +96014134479A15A5C6DC7D11D8256DEA0CC645D9F0B0524D7885A8A59A2638AE +9DB5273E3F3302D1C94C96CFC9CA768F3A1F8E41543A272FBB3D40D65D82EDD2 +EA11E127CF93E345E87E41401E2699FF0BE4E92814DD959EBF4FB412D768361A +7CA5399AA68C6153C77FC080273FF4A987EB649C9F5C4FC18BF106E13BEBAE7B +8DD477865BA85C53A797BEF5F177C053ADAA1EA2804CF04692817BDD0DAC9936 +C63088AA328EFB1B4CAC4079C2EFA244605E362EF8058FBBCE41C2774AF399F6 +E9949214D2EF9B899B5CC5F628BAD3FF2054AFDBCEF21A29783732F56C52D19B +12C2301D5C525099662DA96E0E07CECDA9A2137655A3BE6F6F828C85408913DD +8F31D8521A84FF78CF44DE8619B8E922CC7313090F45860C5847A50792518480 +6CD5C1B6471F14D10372AD4C7CE4FF0E6A9B4D2F627A74B52660794691F1789C +BAFA5D38F92E492EDD7A0DB2D7E860250C0812522FC5B912CF0A39620FCFD304 +D67F4F79FBD079FC05E403651A30489B717FD71C42DD2CFE0B970460F7D12C2A +04492DF55C523C5E9C62318FDD451FA5CD0B7325172B5A07287DC2653BC5EE83 +0B78FF312012FB0AE605575EDB52F2A1F16509C12EFBCFBC070A4F9A90E58F27 +30D5CEBDD6DA1D2D740E0EAB4AB226F245C743D2808C3D843722050ABB626744 +652B3D3CCCCB276343C1BAD5C4D307753FE781FA7F47B3D9FAD9088586FECEFC +E0977B68BBEF19034F53FB1BB7868EFCE3F3FBF89A26FBCB3F8FBF55C12017A6 +4743BD2279542A3B824ED697B866609546A4C27D97DB532BDE215CF8AC0C5E97 +059A761A197606B6285D936096EBD2AD7DE53C8CE2B0D0B4F7E50D5E11FCDD0A +2BF4736B7B9848FD1D4ABBD8A6F3903F1EFE48F0034F9C888923EC768D4DC7B5 +EBE32CE269396D9C198BAEC1076F842C503E546705FD1678E7C6B8C3F5F431BA +1C63CC1198893BA77CC79E5829E39B541962F6B110E9CF545B064E46F3539A1A +CD080E98DE474EBAD440ECA7E820C145955BA0B6CC80E7C4109185A3877DAB6D +4886FBA0D66D6C3F619ED6A81B346F5A196D1CCB4D796E02C35E5301E9C34A58 +3BAA4CC1BFCD6B0906FF15F200FA5859E6CA7F2A21872A51B7E75FFBD92C3048 +9297C015A3BEFFC5B5D13A988AAC23AAA4F0DD4F86FB5E6FC8279C43A10D5C2F +624E8CDD2C03794CE1B2246F7BED4DD4564395FEA490A41E5345C6F86D847D0A +7AD58C606ADBD3BAE5E649998FAE5D0257FE2878CADFC7581C22B31CF420A0BA +A3A76624A582909E209E53B462BCA38014162605977B87FDB8ED67757CC363F1 +A50E5DC6A8441B9406D874A756D91B978415651D91E8BAFF5879235B830E8702 +700D5A797B9E1ED4E04123513DD23604951C26C892004DF6B8DCE876430ED7E0 +56BF36ADA204464C0789A18B2C8F9B212BBD5E8C9E2925D40AFA394F8677336A +C406534E239292FED55B20E5A8F986EA761D33B46BEA1A37DB3E76FEC6A5EB04 +BD38F5B8DEDB095993F81BF12936932E610D72CDA00A2D3CC2522793B7887B23 +0FAA526C9D42B6C087A936EB98B776EBC2BE5E2A3301AE9A91044DD21403B2F2 +976BE40E7374CB47148F8CAF85C16D7DE4CF8FFF13470B2E6925099C3C97219F +5F967068A9E82488FD591A964FC3169C38AFD8AA352CFCF35D3E0D6045484475 +4EF4EEE6AA387768FE9767CCD9F81818BBC7046AE0C2B7B42BEA5FF70C65CD66 +2ABB14F1E1FDE651C260129E2235FF02A7F27F1C948CC500657A536FACA3BA8D +8C3FB591601310A2315920555BE054BCBF4668DD8032C562EE12D2C7ACB9C50A +11CC8E3B3EDCCA00A5067ED11C24E5F0037FB82955F242BDBE1524583D2B676E +12BBD3C0FBE80DB47A23D4EECDD1F6545860A415AC6BD2E852A39DDB12EFC723 +D0EA87E1A454B661249959DF54DA9DA50970BFBE0113821F1CE71670827B443E +6544081B2BE1260270A23E9417E4B0155A1302BD9845A5D62FE9EDF7D1172353 +85BDC4F2DB55CF4FCCA18ADE873B53FA4FE0B58EFC867599891A165631064771 +5CA76573ED070A85B135EFC0B619213E0518F0D4A95490C32535F66695C84124 +A1413AD30D918BE68A3335E65C2BEBEBE4E29DA17A0FED672F3B714F809C157F +006AA925F96003CBE7DB7C7FD7BDC5A890B9EFE60E9915EE7AC3B3FB9EDB2CEB +581E71527907A1E43FA1A06A12CABE01979FF0E28EFC4965BD7ED592142D9F82 +47BB2417B528590A116C791E19A006F274035B74C8401A35952844F22DAC9D07 +EB2F28E3C9BC5B8E1373F1538F67686055D1273C565F536E9F35225A67D53E86 +510F371B7E6BEB04027216BC50AC67B2C0E9F528CD55613195C351098FF6F9A8 +D713269EE95CDA3CFC786F8F28DC3BFA23C6E3253E4E5CFDACF097B862636CD3 +B7C78FF990ED9B7BC27AA51DDCCF408F0EBECC40E555250C8077DDA1646D8BA5 +00697705ADBC54DB525A131A1AE59FE8E7C3FA81A913FA5C6BEAF2FC393412D2 +685F1AFB5C1B6208AB5E4900E29036832E8942550F206D721A759E994814974A +11EA5E5A027C3870A06622FED8632C3D125ABE15C71146A7FA4179DCEA8BA117 +E6CE9AB0DA1373933319CD27BDD4C69CE672491B1F15BC249B7126F141FD1AA5 +30121588773D42E0070723427DF6AFE7FAE3DC6B940EE28A8195489F1DEC2811 +A4773B6594A8BBE4F439EF76D5D4025BA7FE822A72C5D7DAEF0F1C88342EB016 +26203272584C62E26D16F6E1A5B37A65C51553F93ED4EB12E95D6F39DA5204EE +62B52BBCE5F29A47D942F247A10446672FF26C6F710244A237C89A7BF6D86F7E +1889103269B8932632BC0F0F89FE477C24133D8F06C1C74325FFBFE82B59923B +06045FFF59B25B50897E71B8D94395A939C9319190F0D891C24BA6186900F8C7 +9824B378C8570583C5303AFECF6D32A4AA96700D915D0DA70DFF8765D44740B8 +518FE4A6A8049E3CAC9589A3C0752F4E0DA6AAB319E1C21D0A760867602A9CF4 +CB372F3F4B7B28712FDEDABA55A6B24B533FB96701728762B2F7FE2DD070CC3E +7FAA0F6214500B495F5D986D13C012310BE12BF864B7928BE4FDD9DB68EE7C9E +21D645094A676809C455F8AEB85E5B5B33F9AA13ECF24E5258D49D2B233E22C6 +F9926353011DA6B75D17AEB6BA6EC8E4A405181F04A656E0CAA13BD463BDA234 +5F4692AE9FFE0C4240B7F260AD199668D27C07ED34E69BA9C3E09AF0F18E5731 +71C576C4431B9DB7E83D645E7FD6D3DDB5AAEE00A9A3C806FBFFE1D8ED8D8A47 +4F69A5BD9747B6BFA7EA057DF540203AA6030B5932896D1E586A8AE9730B32A2 +8F6B27400E4F0773262505F37CAD309D48B02FDBBDE883E0DA5CEE4AC6B28AE1 +7C7663C7B4AF5EACD32EFC8A8910A3BD514B8E19820CB2741BED0C03DF65DDF7 +ADA651E232059D9AD05257A8B271BA34007E8E2D6BE190CCA9992011EC455E7F +1443C4DC5BDF1098C399877B64E02DF566B5CAF6B8BE73CEC6A2651305E32C91 +2670B1D570CB8F2CAC29D30588D7C6D3D810F660F7BF30C18609D72D60FF745D +D879957E4542F5877A05D0A281BE84656D3D9879FFCE5F667854CF00DC01B8B2 +38D2473544E81D8ADFE49FFC6DBA711AF38BE51897A42FAD78DAC2D1D08A3780 +50C9B002A9EA58E0DF5F4FCE96F3405C9BA1F32C91405CD058E9EB51C43457B5 +62755B6FA91CD94C22297FEB48DC03CB78C0EFA09C74D2E7A8FB253ED4F6769A +E54731333C9EDF078829A58AEB8C1D28D1D7C852EC574B0E2ADB99F2A0CDE7B8 +4FCFEC125944835A8E3F1FB0C15FB669E670D2D8DBE24886AED75A9190BC52DB +BBEDC221D68B88FF825E69DD69E61FC2E37459DEBABF7BCEBC179D4082DB17F6 +12408DA590D1F768F630951D7C72A74E5172F71C97624F2F4DFB37E4913BC382 +990F61400A362D5AC3A29D64F1F1BB24E572832C8A1A8983903D086ED747442B +EC2DF2DDE41AD05045AC4BFA77F83342BC1CE856BA2359A66612962A5A2E0635 +806D70FF2F6FA279F639E5C38B0360C33A170362F5EA48E096CFD7BCBC43B49B +CD4801CCD9E9C421F24B6CB3F793D4ECDF9B1713E7C141934D53EB8FF655273D +810ABB04AEAB956AC369DCC11C17D10F08BA7F1BC47A45B3889068A169A22761 +52149F3BBBE409F8C28FB89460B55FCC0A357A14FBC50A396512CA588A4B2324 +E557EC51138CEA0ECC37980259DCD9E01FAC43FB9D7AD36B1D17656A932FE69B +3D224B98F0E562368682150C9D9D4BA2907E4439BDB7A6B8F0D18F8CA351B446 +96CBAE1B9EC0C1BADD2EE20443E01570A39BE38FFF7A2329CEEE5EDF6B2DAA05 +C51F9F75B21E7ADAF05591569AE0DC92F469675588F12A28E84D178699FB76AC +D75E66C0F26F4CFEC9BD0597DF10342033D0A2CDE6DD2576A651DD1855DC61DE +FDD8BF33FE487AB7CB0FBBD811F413BBE9E23F2C832A654B37BA922AB7F6DD9F +689AEFB8B49DE285E7CCA8EA94A0C45B5431732E81F5DD0FE804CCA7C82D5234 +672B3670A16EB11024C31FF89A5B4C03B28B2B582315307C8CE8686557A644F2 +65C8C2A9CF1C9A2862BAFAEE0E94AABD856A183394331992EC764A3B82EE4306 +2B40848D8D95D0CF561911797C9A2C6D9E334D3F6E595D59F54017218A8E6376 +39235EC929904AFA8EA42EFE54D294768DE0B68B4C1907F61662FA6710682673 +AC64FE11B84BFB0BAC6D1F5F90FC91AA5954BE48868AEEC05E19117B682186D9 +A0CFE621311708B56EC668EB0BCCD9E9837CD7E957D72AF5B562E51378E8A9A9 +34947A8BED94C55FC7A429E28DFF9BEDFB3F28E5D1A2536B84DBD1677320B132 +27F8A8DCBD4AA2B971F2F02817DD7753431BBB210216F822CBAED265C55B79BA +D7D5FE873E093D62250A27022D63D7C0823E9FC09209550DD4BA413E50FE2DAA +8D60AD9AB7E6FCE79E1B6CD6FA41F5C723DBBEE00FFDC8F614DE64DF40B45BF2 +84D3B6F96A1375CFE96E446E6757F31F8FD2E34DD88106015037F4F5B5D381C5 +AFA0D5724AFC260CE676DE70C666B34520FE2E2515D2C5194049F89EFB0D1A4D +10D40A12986228BF3CADEE7E8C9564F9F2D61E094C44310FD5295C5AED950A23 +491431F3EE071FC38FA803DFC580A7F0FCCFF19F3D8CBE0D503057E95A2A7D00 +A490CDD1BDE01EC8370310A869793E4DB867496094D4B54B3B9AC440F304906F +AFF32EB87AAE8075149299798E681B83D47935D93FD3A26302E5EAB671BC2C7C +7E87A4C1789A772A9643C5737084462AF596F23DF9F36A8C00488FB78C6ECB64 +60A22C5D2DEBFA17E2A78968EFD029A29CC04B6E231B58ECE47CC6C93074F701 +65B19F77969B4DE3A7272E769CA00D5C481F5791E559F61A68CA64D4FF88D513 +642E82C48019C5BDDCBA0246448BCB765626462BA0CF6DE0E55F5C4090DAE3C5 +15076B25A8673D89A4DB9B5EC5B133EEE44BDB76AAED2A91FA68632997927EF4 +EB93C9581DA7663A24CCB982D1BCE9315F8F719E20C9E388907555FD27ADD8CA +81B8A4C5F4F7614F15F5A6D3A542E3F22215F0DACD6D78E22209AAC0036AF039 +12045C916E9858E2C07B20B13B4715DBD513DB1003D256811D019BF84EA41069 +53731364B773A23EC103ED81FEADFF565BADC9B698819BE95D6386980B13D678 +A33460A92BDCC24FB6EC68FB73A8ABB4D240DA5146F04B1529EA28B8C47B661D +3A27F5E03DFB5C7BEB8B1E6AC63E1CF7236198487663AC00BEB5F59EEFC366AA +C9FBE97F8EF03A80F37DB7F1D98D5994203FC3DAD6EDA29CE5079E09D504E360 +902FAD0E67257EADD77A989756B3F1B866BE530583CA81610AF81D516A78E37B +4AD1D27A2ECBF67AFFA6914F06CA73AFEC79921474F3BFA2D2C169A7666BD668 +821FEE767FB326ECA936FFF52FC87963027983B23751956C9780F1791595C91F +3A5B497D8107667B12CB2D31A64F16F51485CE00F376DC07CEFD4DCFB7A91C27 +CD8F3584B14CEEAEFB824C59FB4852C2F285159BD37CF3E3880F47658D3799CA +E8DCCD4C79144D1503EB5492670440976954FCF0487F54EB23A1CE0A139AE7E6 +3F34594B7F85379745113C0EE8D05E10A6E740A76CF900F5EF056DF772B07258 +A3206320647253786225D4CC14548B1750CD034CBE4FFFDE56CD84B07896D08E +2EBBB9006DEEFE45EAE3688F06806CABACCB255915C695608A6C99DB3AF5A6E2 +DEF0B77D903B0BDBA16C66541905C737FA79CFEC143CC89C4CA56857096E7A07 +B8A0E2E16C778C5C929066AA567449553D2824B68EFBF7D7184E56470080D7C7 +C847A46A9C6556560B86FC1F82B7231742325E718990E81FF7323084267F46E8 +9F4B6BDFBF811CA84296216FEBE788EF20101B48EED478454F1B238C03A1E0F3 +DA386922D1A038EFD0555799B29712FFA294AFF0312793F2349B1DD00E16240A +6AFBDAD7B8AFFD1AC1AC380F35CB7DBE92D517408EE81517C04D9A82E1A6DB84 +EE4A6EB49650B0F94A64500A771CC0788F0CF8EAC76EA80437DA23D05651F9B2 +65C5112FAF87B2AAF4A8E07DB8762229DD3C2D74C364ED6F41E853DB2B6DE3F3 +9AEF626535EF31913165796AFC6989371B04BAE091F9980448315E43B29AD252 +5676CF2B2DEFBB0702007DCF4F8E2BA032714676CA56CC18BB378D138075DE54 +316D7F4D9C73B08A83FBE43DB11606B0520EB9C929BC4BA925680FF37726F65C +2DE1D25B9500C2C2DA7592A5212290DEE61552175001675E3258903873E9F3F3 +C2D5F7F57B1ED253596425E95743F67145FE18B80AD5194096E10EAF1329BAFF +C5666BBEFE818C9F88ED0A728F5A791C297C97B4B398621E921419358666B69A +63D129C875A930087A889420CA64CCBF0152CFF788360BF88A42464C40D03B1A +1A342A89C26CCEB7014C0A5A1669331D918604AA43AC4A0FBEE0A39DB47028C5 +44074EF228719E1C3CB91FE9F053148F3FF3BAD16CB57DDE5E3E863D40632D10 +68E72FA28B258913E38816D9E0A25616A8DADECAF0DD52625FC5BABDA943017A +3B36959C495A114346E805A9793D2F30C5F7AEC8CD082DBE1386640593ED1E97 +63A98310C1EA703BE2AAB203095ECABD48D761E92D614233788E4FF98C154A95 +15B460EF33121AC9EF0BBAC00683346CB2586ED0D18A62CB0D6DCDA7B0500843 +B07D9C149678BE81FEF9AF9BB18D18B5CDD59188DA9FD6A79822A69CBB9F0A9F +731FA4955946D4363710FE1AF278EBC8792158D431B74327017814D69E5ACDE0 +2877824093AD46C7FE256D4615B6A2EC4997310AABAE4F3CBAB629F1522D5B2E +5B43E931917589434F5731D5418AE96EBB0C07573EB153A6E5442202BEDB507B +4D09872458F184159873E21F91F999DAEBD2E29BE8E82C6B796345B715693703 +CD412195D1F170A2B2C9045A4D3451752FC1945F82E92B07F37828F44EF2EA61 +77F614FABF81162CC1ECB0676E8C121CEE5B20F325993CBD2AEC8B7BB1D8B1FF +85D6D33B75BEF89146FFB0BD73DF334DD1A9396861EC67E447477A00A4276652 +F67B8FBB2AFCAFAB9C3A14B0F7BD3F0C54CBD763EBDEC129DCD7A7DD2D6760B0 +460EB2E5EB3414C87365BBD0500C5FD4773525A9455BE7954C616C3BC0D892A9 +AEBA406B14B5D5340785E7EE4C2DFEEED396DB448F20E58725E213DDD11DA1F7 +000EDE41596161C72151B05D902FE2E3203C3C6458F3B462E07FB0C40FB83FF8 +375942B9C7440A0EFCCA65322797DD2401EDB69D308DFC579403609DF855E29C +3E35687C40EEEF2D02A2239181836DD51D99A366D88C31AE289787211A3D5FB3 +0BF10D01299C451C4DD869B8BF132018BCC45077647F72889EF81A5BB63669E1 +66F5EE6FA504C44096F7AEE1031A39EB8CF7902D881F6AEB66CAECA514618719 +2F4F459BF2E7E6E2462318279F15B1B20005AD6137F3A4F2A810A7F08D3E0BCC +4710DB79054C4FBEBE5AE07CB156BECB6316065D24C92272E276EDAD21FDDD29 +E1F4500E0358D8933DEA0609C49DC211A7A592EF2CA1AC5108898F9532311CCA +37C83333689A12AD0B185747D23E12EB86B0753311DEB69F6F471E0F0C99AB14 +CD4FA8E882FD8D6A17FCE3B2301D85F0FC49ADA6A508FB36ABDDD7A8835CE644 +264A62708CE1742A26ABD8CC7DCD1FA60C856B96F84EDE061B534431E012AB5D +93FAC0808CA1629D45817ECEF15B78EE77BA22CFDF620AC795E4FD1965976657 +DC97A3C35B513C8A31723C902D38F27714D3CFE6AC6F107CBD8B2E99FE08AD85 +811F052B6424524B1C049EDD48BA6F8D98B7C71302ADF601C3E5BA4BEDA0C7C8 +C1BF6E4B8079B303D30D0434B7F2E47FDBB7C46906AF947E7B5DE1E6ECE052C2 +9935D2985B98DF860982B3D044D325306A769065576686DA5F2E552C6150F5C9 +25D0AE2009A796D322521BA3329467B6DA1F629CF9AD82F9F9BBB30AFC68CC30 +97440AE12F41C7E4192D740ACEFACDBEEE4EBDC3045AF2E1E188FD6E1DE499C1 +E1B3EE148659DBD3B4EA6215791813BFC674D4CC8C066771F82DFAF4C5328AF0 +6292773E07A15B213126F96A3634CE70FBFA7DF4067D540E0C951F919DE5E0BF +DC2E1B37EDD3B45AC9F009412A6A237E7695AEF028A8D9EF4905EE593FAB2BAD +EAFDC2DC8455D087E72E9AB830108A138EC1D55D38A040C1A81A1E1E8B95F381 +9B44E42D55EE9057010BD0F7E32AA87D636CB9130F4793DB86131B9B2E9068FE +E8CD989A94FC0FCC144CC99B52AFD4976D651C0F855068753303593FEAD53AA1 +2CAD243638618F68068005C923E681D214597570B8C418C5F1B606D33C0D0C54 +3FDA50E8CD52D8ACDBA45C88FA875BAB5E4690F866E154C525BF02DD103A7567 +70A307E5AB1EDB318E5E32B6B40A6995666657136B18F9D45E0BBACAEC4332B8 +606F8473AA0971E2B4654209B2353A94C5E698519567EA54377A533DBE6B0ED8 +FF2D5BC21D0EBD7E1FFA597B59826271C18D582692614A48A433A3ECFDE25400 +C4243D260370C6D23EA8EAEC41B3561AA399C67F1E558A192B13F258945C318C +8B5ACAFF5793CE0FDCF1AF2A05152489398AC405F24C24C4B377F5D44EA10C71 +2D9BFECBC713A9E8CC834E52A5A9D58E9964EDF7BC4F1C0040DECA723C0F5C4F +1287CDBA5314110299A1CCDFC00E55759606AF2C52B2C47BFD3FF62D892723B4 +110D26139780B49E35D77D3C5FCDC51A3B3E2C64AC161ADD295004B271A75823 +D79AAC2D931232623409DBC3224E61CB529DEDCFCD86EA583C4097FCA9DBF18E +19700118D65A186F94C261762E54AC0A6FC47F4877236EBF23B0E497F6138D75 +0E20474E2D11E68F7CCDEFD46C5D62E81E559496AA830960F6DD379BA16BA099 +D13AA5FF5DA079A7ECA28B701CB49297C5F2E75A1F851008A0CB290DD0EF6E27 +5A8E785398374156FCAD3D45E704C6DB247CD56BCF919E836DE2E52C9FC0A8CF +052BAE14101DAE8C43EB766806E26BD91F48FA455C9269721BE8492FC68D8AB3 +01D638D04856E5D203D28CCD8B702B90F32870D104787F8EB6D61648417840B0 +924C38AFC4B7CAED1F08E34E1A3D46A545E86A4A4542ABD6606672C07684CE1E +D5F2CC4049DAFA3304817E05C5945F70A251873D93DB4D5912CC4A3BA082A05E +1BEEE45050212C93EE272E8C33AAC196B201E6345FCEDBF5143940B5D9263C31 +B8DB7ACB464E0C3989A8AB68EB7DFF28AD666AD3BD003C2978DCBF5602107943 +E5060D5CE3E42F27B65F058839099C2CF9B7F045D1927C7168202D39C6DF70D5 +00CBC98EDFF8837D6CED471DFE0E7F84AD5BEEBB25F619D672D9EB812C3B0FAA +9547AD117E6E27D7979151B2512884799AE8B4503308345680D61CE8FA394EE3 +4679989798DEC5B494EAD4C0ABFA713281DA98522810589A2CE473C8C3E448E2 +57BD26EC6DE17D8A9E1847795597413B1D80675B79D0AF56E8D4031300081FDF +1406B9A2952EFC0F2D086443FAA4D96EE5AF3AA562F67F9AF495B0F9FB438043 +4F955599A04824F8BE5CBC825EABF544158D99FEDC664150D66CE9C85C08B720 +7B33BEFAC455833F57C43CF481DCEF552AD267BB90D0EB2662BF6CF1945822A4 +4EB709E8DE26B4858A75CEF9689EDF05F91BC2BFDF73CEE6B9090A001D97ECBC +7CE94ECD059F992B608A19FEFADCE3B5270A8641DE821FDD3EC1FC766F0975BB +8DC349EB7D3179749B16832C7615DD310F815B71717495308C3902CA46C044AE +78FDE58FADFB233DE8DD6CC412CA9091C02B44FAB96133F0F617584DC2D5C51D +CFE828040673A5114DDE42228F73B42E1E7C9296C51BB657773D8F15B0797AFE +E846B26599E20C73E1C9620FBF224446A7FF87ECFE64DDB0D45875B5CDEF1C8D +36D20EA6F90E09F2A3EB423611423370EED5DA83D5E845051C65755A24F7E11C +DEC48C78F1FBAB97F6306FF2982E3B61C3AF46F2CA65BC15EF35803370FB787A +0831506C9FCAEC8299005C68DD453D2107EACFDBFAD9F861BC46FBB3802901BE +1C6D99EE609C7D9712D9756749D7E8E1FAB8231A9897CB4D7C95A19B734D1631 +71532C43E1E247CDBD404F33B080A3202E23B6F7549C7E8A8F0B050E3DB2A89E +1E30428EB2D2476F5F275DDA324CBA55D3772B0C460D711FED6D6ADC43CE821F +683181028981AE66EC16BE2D7FCC2BA13BFF93F3F1BB1BA32DBCCBEDCD9F793C +30C078A839C27CDA29CB694C74A70C86008F4F2B2B8BACA49ACBBAD11B0DF198 +184A6F107BD42D6F129A7DDFF949288AA27C916694D62C9AEFA24BF172F43B68 +930F7E369000656155A593BD360E0DDF160C273A4B3F538955B11F25846146E9 +4CE0A3DB78E8BE770A7B83E0043B3BBBD60C0333AC55BFB8E1503D03A37803BD +841A19848AC9AAAF32AC249E880BBC04CD4396DA8F4CFEB6BE6E9D261A3FE54E +C3BC8A01257D032E916CB34C9BC20263DF0828B5F94FB9006B09A00AF195AD03 +8665CC1E7A772D9968D35B5721163394D221147232ED6682CF081607D82E933C +DEDABB994359350A95AFF6153F29CD96E4C3FA1FF186BAC26D6B41E275D2AACC +68FBD05ADA7BB1C68EF37508607C9A81151D88FB40E78890E76795009CD1410E +FAB3DEDE1A0F2E63B8835743AB5582F45EA40C86469A140B33BF721B936FD1C8 +56D1D571B04E8CF1D856DED27BF608FD3286E827984FABB52D7579BECD5CEC42 +A0880A44C230C6AA718EA897ACFD482E0B79C46E54F6338EA5C58BCA595D735B +4C1D3C851A2CF846E86D685E6667B8A975F38DC802269CF7B1B0626E5E435448 +406913DE4D10772741BD203252280BB13624C2C56E861FDD9F1E2F9522FFFE42 +AC2E18083D916B54CBA60179AE3ED01FF1792A17DEEF47731BDDAD86ACE50673 +1D8330252BB4D8D4CA0D617B0064FC1F13317F799C1A9F368A3E0AEA888E2BFF +07C78C6048718CA2D0D5D1A20686A7C44EE73F6D749A9F0A6B978A4A522D3E18 +C4BCD89CBB1151324182605BFDC24C6C450E79EB69E79A420B2E271CC1F903D2 +8C1BD054304250E41624F1FCFE70F0509EB8C6D0530E1D6BF45604FCA1FB7D44 +FCB548EE92CC85AE335A8DFB27647879D0BA25409E4066B4F708D3B0C1FEF15A +80892005B4CDF4DCCB2B62AFDB72B1E1B1A172C313D7CBF31BC56C897E8D266C +AC8D30CD36BDBC6FDB790FF6FE1658FBD3244B447404E98BE65368F48B349003 +3E50B4F6F048042CDA62AAE7C6722BF80D56F1EDB47B87028D85081289617129 +15B21BB051833AEAA4BD415D04208A562D73F149543DECCC768AB03B0EEB3CC9 +59C09134821939FD322DA9A66B4EBFF6C0D10C0A973DEEF572AD5C92A12AB745 +84B1624E7200D285783930F51ECBF19AD8E48E709893EE0F1AB7CDA6CC7C1864 +F16EC1D3FFB6B4FE4DB7C9FB1620C3C0861F900FDE317599B4F050D465A662F2 +DA6E93495CFF5DD8EDA52514F3F8E6AE745AB86CD729721E7A3CCF64B0F6360B +A4F8158F4B952FA4CD3DAC4F5F81C4C93710BA738F96DD57595D424F45CED71F +6F35820FDCD31533FBCDFB56F354935CA0899CD8581ED5EEE2F85C135F50B43F +3725DC1EDE43BDC851AEA1AAE8520CF9DD760A42C5D0B3754C7B5C44CDC502E4 +E74830EC45840E287ED7DA2E98260742740D9B904E975F3F8E80D7AB57085C76 +5EB2AC9DEAF38B2E1BB7D50CA137D582B954FDC797845B3CF623E1F243E9B65C +87077E67C43FB6258770D604E0DF9FD9710B6FD6AD8985A07820C47F85DEA767 +F55210F70BD45DE7E0F3D335BC978E738F274593DFE14D6489366974AE4B9286 +EEB9A4C1A712D6C2DFEFDFF7921BC6E31631390B8132B6E62D6EBABD4FE38AFD +DE7E0A7B6F783786976EA8402DED90B067E1D85CDBF13C991B4CA2A626A3C8EC +21B13B0902AD8389C71F14B810E40394EA7D41CCFD4D13FFAD46BF4EFCE250CF +B6CD0B203E3CB540390BA8DEEB217755C284C824DC9626F917D119934061656E +6836B119CC894064B51B9FF73B07C559C366CC952531FE858C3B77706BE21A40 +BF0AF668CC376F042E965BD12B020A06D44815327D9F24C8BFE5D4949EA85FFC +21FDA7C58126B3F5CFDAE27A926E2E45DE062650B615568736B10F7CD8EC20E5 +19773FD4B559D45A18B152315D45FBFB4B57A969F81F42FCCDC15AC1C6890F75 +A87877B75A14D38E37CEED9B5AC39D4CB8E0A5ED6BB09A94E32BD33AE9B894B2 +9757CB08A99818058EEE75EC2DBDDA97A2425754D9D31AB87A1D64700D28DE3E +3748BFC11DC5D134090B50864981DD72F2999191AA0111F9A23E62B37C67FB9F +704C3BA150E4227774487A3397141BFDF8F6DDB22AFF40F61E05BBEA998A2A7A +553071533382226D9ACD4748325C9A90663913F9BD84C40C83798985BFF131E7 +8B3F8DD7214DABC6F29D83E336C337F936CC5092B8064031C5C67AF2563C19A1 +99E220085C7675F59AB67800B82C287908180C25229B856AC5B8A63BD0F0342E +E72FEA35B9EE85DF933DD7FF42E7FEA8580ECFF435B8AE058DBDA697D1FDAB45 +50F396FAA4AD315A892691D39ECCE620EFBDAC6FDC6FD387F3F20038680DF50D +9C1B28E5CCAE7CA4F11797B03A39192197F1F89E080270EA3FA549ACC696102E +3D1B1E762A061D6C772E72EF6BF67293A80A290575990CD2A04A2277E23A29B6 +B0936111C343C67998A3D25E726444CC87E187C602074699801FC24ECBDBFD1B +E9DD025C51EB2B93387A27659569A2E0C4DA2A7C3BB16EF63FCE6BC8DE27D058 +A323AC3A394005F31D8900CDECE02D3DADB7C5514A6AB69AA7041D75927C0FA5 +A9D40AF9433D103DE31E080F65D1D3D2AAA482EE9432F3CA84903CC621E1DD58 +72CEC6ECF9C4C4B3F854777B65215D7909A15260D3A39CAE9DCFF36B6B341FE7 +1E4A75C5F8702378CD5926103A2192FED1F469C2794C0B6C0918F2A85F512C69 +4B2388B7F553BBC5606C4CD3A23C34F60C4BA40904CEA9D7A82DED088E2127B7 +5151C37145DFBE0FBAF3EDE7828EB3553DCC7CAC41B4B4FB522E3EF6153B9275 +F71917D930792C63680E93C025775367346E04C4B34FF74022A327AF9349B223 +DEBD0AA515BC86E247AA4D797EC20564D1CF0FFA853C60B0AFF544BBF6E82EF1 +6AEF5CE96D05F66D650B4722569C2E05DD039F91CAAE1473E811005434D8D95D +C6A2071D47EB515DDCC5D9AC58F36ACCF2BAE3D0907CA43FA58DB14AF6D5BA40 +020E8CFF4AF7C80851FC81EF583ABD9B9ECB4D7E8981EB6D4FF6272C7AF2940D +53C6B3FCF4953344C70616BBBE917A295B491CBCBA2CC73992BBB1C037ED48D6 +CF3B80F5E08EC3447D297A8214872A48FE10A4FAB74EC700B71F2F6EFED27FBE +243544882B39F3808092361C9F7050943AA4F6D569B67E3436C004987FEF870D +1CDD98CB5F2ABF72B6E78719A6A6D95E6C918D5BECAA0C23FC99B526C7C8D0C5 +B9E17494C0995785EFAF555907AF23ECB761F47AE1B27ED80E988640D8854294 +5296708C4E9D46B90231DDBA9A15D5F8F2CD7D0E1DAEBB91CD3A6AB60D16024E +A61A84032B1259BB68A3E8CDB78B5C67ABA884FC908F0E0D0B46F297402737F4 +B8B40A13C9E2B987BFA3C1AFDEE7B962BBF7118E8063F83CFD19107A5B28E0E5 +FB38E0E26BE4E46A68BF0CB2515435A3C9D3A9FD61ED73B3CCD70BDEA56768FC +7E90410470B0087F9B123D986006E729CDC571DB1EA3D713AB3CAC52C42472F8 +A7325408C9416DA581B49C709E1E35C3980E9F9D86E292D29C24C169A4035836 +749A9D5475AAB3DEE92D6A0666D176D9D0C2D28183459001348453241F632A9F +E4F5886355B548B13CA7E9766263E70514F495EFAC23DB6F5970325D079F63F9 +852EFB7B135172F5943B51294BC44CF215D7DE2BDAA35FA62F2358A8307D9C1C +7ECEFC0B93842A762AD1F8E6488140331A7DCF8F85A1364390E213FCDECDF652 +803860AF5FF323B7D0314EC85BA7CA22D6E83AFF66C961C21793601F3D030BB8 +16EB9A3E7C97041C6BF0D15CEBFDEE1C2B48AFB25F7F588681F9B3EE2D5C010A +52020C0899CC36A1C032840171BB439D30A9D6B0F739910D8A90E43EA370CC16 +AA8814F65A26CF0F7492D076115E91DAF6A118133AC18779FF3595A42A12BD3E +B61611A23E8631E780B420EA0944BFE9E4E97F5649BD953E8E2981F3D043889D +F06A4C62B5B90F544BD3E98BA2639AE0AA2190693F4247A91FF8B227FE3FA527 +F11EAC34057C446210043E19E2BFA0C695F33B2F6BBF4CDBC07917E433B4F5F9 +CE078FF709CB1A57851D117954315C893AB0A2FBAFE2290E8AA09ECE87887717 +549876185C50621598452F23CF40207BF4B4171B13E7413379748716BC624AFA +BC6C195173052D303AF74F95499180AD2D76360521F090C99C675AD863E46B4E +E7F7E6F0B09B4DDD286C3F9A742C8B909A8545957D3EC324D04E66AF9F8281E7 +6FDE2A7A9E1710B452FF4537C19778A9BB296F4AB176C617A6F1B1F9076E5648 +9AA802B68AF5A81208EC0F7B829039C5C6773EC3B80479FC482F9050079173FD +9AC1F6A89862DD56EDA4A054E7146975EF106222B6267415CDA5EA2E8DCBD1E0 +ABE3A94DA67BB6F11C66FC5AA8EB61E55792C18CCC945D16BE530ABFCB14DE75 +8DE8D5154E6AF9763FCC5ADFFA0D25DBA667BB614A05E3BBF945B294D64D1266 +9579A4BFADAD351F343B529943CE554FD40D52A44A7180CF894B0781E63B8E44 +62117D0F6EE4D4700D903A72676F0E876939DD77B217279327D372BD4E69B367 +68E654E9F1A2D11EEE90AA49B462D517F76AF2660BF7282F4C78E1536AC5C130 +0C7A4C6E0D698D372574EAEAD8F979312D648177DD0C724CA7400B8729B0003B +CA47E02E1CE0B32F3A80AC9399517175C47F26E5FBF6AC5E73D178E7DF67EE79 +5EA60CE56EDBB227694AC21A0E8771B516768CBE2836A00A14D608D9D32A27EE +E2ACC8CBB9D5DE7BE40B680A7FC804F7B9A39AF6E829D112BBF57DCA2D408240 +9D2B89107BDEBE8F4EC1EE8CC6B1F89E78677B8FF2FD7384EBDE659875462F99 +2D4E62D18C0A8ABD3B87D806FC514B0E5700E83D16CAD6EFD00C79D624FE841C +7F98DB4ACC86ACE1776DF5439E425CBC1C85D489E4D542F504D384B09209BFE4 +D3A008E069B0FA3A71CF68D097FDE55712C7E6A5BEF6CE8BE02A4E92EF5231E7 +0D8905EF4FE0D5198E32511F945E1172182CF690D7A769F8C4F76754E5654BD2 +A9F9F23B6C230B10E3AF6CDC745538D174A75B97A3CD3697814180BB1373B296 +203E523EE5B64F1EFA979AEB8ADB60CAC313F117EF8CC53FCACB4883E26B0927 +7897790E4AABF9667F9A91AD32AB1C5CD27C26C5BBA5DB8AAA7E7514A239227C +D798DD6AF110481A99753FB9B3D570366DE14F6C0AB4C31FE068B1876934398C +EC2298CA0A9EA5BA245907DA786D901579C497C3739BCB6A4DCB2E34E21A53F7 +6F673C1131F114C05FD1D3B37BB435B726AC2389DF866200A75A151725788CF5 +69C1BE79FD6FC36625BF73CE46A4FE5F12E5692B47F7C26376DFDEAF5EA847F9 +367997E05255C7EC67832533922B997028AB8018F404ADDBDA81BB0698AD69A2 +B4C217C392BB250B58BC4FB901F2912EE8EB6703DB24AD7C2CBFAC12F8D081D0 +A700C39130316DCECC18E64F3994E2C6F5E0E1ECF2EA4B18FCB424D9B8DDE8E7 +ACE87FA17D11158E96FD6EAD04B12B8917F420BB29F4471326F54C896BF1A475 +3EAD86C7968818F95E632A852601C07CE9AA698FBA3043D86168FA27FF43DECC +C71581DE33FAEF3CEACC93F5D626FE05894F8FC2B8719A92261A215929127FBA +BD9157BCD9D4C5D62D08E7E690F1DEBBED0A839475B1427A7C91E7F42C3CF6E7 +80E8B55B90566E21214A4AB708383F0A3E0406058E26A1C34786B860EC597A56 +2E33F58DE6C6850B71E88A2BAAAA6CCE519055463B468E49B2FB70CD32D84B8A +8EA3077E49E848149B2A46AFF247D80A42CEB44278A9341B4ADA55162F67933A +3BE72A237DEE6B9CB4826D4584623FC93882C543D173B22CA22E6D8D5CCB02D1 +25EDCD56559CDCB126185BF4128C71F228D7CDD7C617EFF12DF100F64925BADF +39E7DD693362ABDD7E17C3B21A74B31D05C9F4F067BCC1D0AECC6C5DF33D4C77 +04DF0394656DF7F564BD7849A6EC8A2A0007E6D32FDA98F7903CD8DB16D85DBA +47416DCB4806AF61E901490C8DF6A42D050C5C07502E7AEC9C15DB70BC015E02 +9696950D94CD0A7E8D46557DF9226B1369975F6276182B92056065B2548F9717 +05D488542B6ED9CBE2898A37C41F3093C8441502585D607CF07E8D1473C48D29 +68D4217BF4B16F8BB279A9E7F4F4CA461A9E9FA912C1BA9355A4261438E9CDD9 +20B0F7E2C324A89BBF23E8973783C2367AB9C59693E1C90D3466130C0154AF7C +008E052A63DD8EE001FDEC48EFEAF1AA7A7FAE4B10D79C74E0586CB3E9809DA8 +E1946A3E2EBF15DCBC950914B860ABE6DCD273FF45D57246F81DEE176B7DDC9D +C5359E1291B5671AE9FCDB06DDC08FF46607E784084547AA7848AC30A32B08B1 +3FBFCF2829821733FB2CDC11AFEA7DFD97B8D278DA3A8258C69532DD625F204C +81ED8DED59753060C83C4FD0B9B4D09E1C6483637F7C8EED13DC01C2F477DE4F +5AB6D45C17BA5B2C6E8219B46960E39695077D2770AE34FC50510067B89736E9 +D172161F0F1E2A7FA79A400F54AE4F20E673A3D91D892C7F88BE4237F1A3CD55 +BE5D1F91FFBA4A88397329E4B62F9170AA553B0E7BF2ADA42C4AAA6920F8AC9B +0EF3425BA25C2EAB8DE2940857712C68A12B5D56B9EBCFB4F19F63075CFA8E03 +4255EC777F9FE32E47905F950BA371B539D7F9F55C21A04F1AC6D9280E8C5780 +014794256AD7B05A69B84AE84337B5C678E43BEE8445C0F79E621DB4AEBA9188 +2410D0E6720380755B4AC748301CEE5A235FD0C1E2D675C147F3C62037708EC8 +0DDB1C349FC6ED24879F0202ACD4C881DFF4BA4116060E65F17F07BCF2CEE0DB +9E8FB76D0F8BBDBEA799071F08AA753BB3129FDDE4D12B32F5D566D8C9D6A35B +4A69C077A6BD909F1BAAC2A2C62A6AC64E722D1985CE4E8771F53170A20D8543 +29D11CB175BBD9B632C89E4A12663C0941091A1532DBD59A65CF6D44AA4B08E9 +7B5BD346182AD70A34A2527E352FAB0C109AD72EF443A5AC713C005564373733 +DAE20E3198295D8DC532ECB3F98551F84AB2BAB805F2EC2669B01F1F5F9538CF +F6D20E05081178581990783705E24E9C25E2E82D45541E5C16A30A72E2E2A168 +129A688F199DBB9575345ABDA993DBCE8CF4DF1128B0E74B6C01666CFF1A17E3 +DFF06C8D3FB42097BEFB1B33A25F4BCC9024C29B4650B43D1CC0B79665D05D1C +751F94FA99175C257EA991E6B704B75714FC7FC9D5A34A1A3019AC5D9EA8AD7F +6A75CE3ED13ACE632532BCC589F8E94B8E08805C56E3D91A6C7CFA23CDDC4767 +BD735DC2A7FEE4AF8FB251174C1015127CB8F7C8BBA872BE416FEA0D359CBE84 +D915D1E8396E1267018CFFE5447CDDEF6726F47E499613589B40A72EEAAE768C +9FBA53FE832BE227F605E4D9E67FDE078120869E5F71E3F05A31CD37A8E48458 +6BF4BF69736DE755C90D6B88D5FEE096ACF50F5FE5523138DBBC095DB9ADF46D +BE0384A02C4ACE11DDFC5FEECD1E0C4F2554BD6F1F235C8F980D87059DEFB98E +411320060518A16DF3DA0DD8313C305E5355FA2131E16FF6A19EBE17619F5773 +8C626D6BD2B7A95CF9FC6996DC514FF0915A585AD3C6746B694CDD7CFAEAD58B +2F842D764F3D0B6AA582D3CB96632C6A1AB14BF49BB4F3CF59612FC40CF63A5E +E1CC3E2FDB2122FB8822F3A85A4AC58683CDDEB72C34E6E346DDC00FBEB75FA1 +3E88EC10B348E8D8DF2053EF2921E8BE24A1CC861268AC66CC4647FED7EF6ADC +287821A9B3AD7191E9733FD34629DE60C47417167ADB5C3B2ED7BAFD2278E698 +6240EE28358460975D3FCEED4C2065CD0FF3AAD547E1C63D37EF2A94BABF9B0C +9525F03D5385CABC6AB58077F2AF1F9FBB419BE35A8980178C27E4A19F30AF35 +A48B18A129B900CE280C100EE5A40C4E6E393542472014F905C266CBFC75ABC4 +FDAC0228A9E73BF3B268D9736A3F8560E78B48A0D7DD43050A0D7757A4BC7C92 +6C066B399F71CFA5BF090EA459CDBBB674E03757179C43CC5B0FDC950D6C801A +F3D07AD30F08A6D299D1E784152103B54ED264156A97D64AE4FBDAF8D5EE20DE +1B80A4E6AFB427A0C18DA8A43ADBDE1BCE9DD46A75C1A1D15995370F792BF843 +02D4672D4493773F5907A814ACB139498953B52390D84EB4474934713976B9F3 +BF26CF310A682FCB955682E4699ED265B520D5D7800F9311C6AAAFCCE8E92435 +E7681D56C537A1C1BBB1C2CFB94AC92D816983C97614E26B062646E2C8808D07 +5E18B87ECCE3A0213EDC73919F7C9D80536F98DE0B9995D8EA4A2633D2E05417 +AF3DB26F9268647AA646C4AD12C3146745A411ADB2502D1ED58E46B7FEEC303D +87065F9B881907F127E02DCD321CCC580C89FA6B3095F607090B2786E5848D7D +273B36207D75A008365C5F1DC4F748E78A6F791ED81631D7EE1E6D79049B8F2F +B7F38FA45B8809B4BC05CE91FA3C2F6F6AC323B3D304E8EFEC54E20045B6AC57 +D08055CB193CAAA5C53454E279BE8F7F38F949EEBF62795AE7B5DD0FCAD1C3D6 +4AE4FBC6186C750F3F2DEA0BF8B65491EACE7DE5635470EF6F42C3395D7BA0F4 +A0DA6BB1A99FEDBD90A551FB217644CEF9973BB90A7FFF3318499582A93468F2 +9E766C2906BC6C4BD7E300E48C997C474C03E2A34D9B969ADA9AEF04843367D9 +AC4A08FD88BB672F2DFAA2CD0B871DF62A43A61AEF77AD88ACFD112850940CB1 +D74CD733FC4DEA77C454A52ABF2BDFEB9EBE3FEEED53CE6D4B1968F0B2BE90C1 +12F96E7AE2CF62F7C2601B589A92D8B024E00D4E8B1F636884803554E9B82005 +8329EDA334D1DF5EC7384418609A8D89909245737689B1D108186F4C53237559 +EF42502050EFD6E7F822F835517FF93411F08B5FDF163CA1A19945FE51C31F9C +9B1EF8AC79EB037F1E704243CA1F33FA130F8DCC3F56219CF6987AD73627FFF6 +1CBE6C8911831A43827D5505C1289A62C7AF94DC668300057993FCC20F752A75 +5E79244AAC3D790CCBA8222CAB05A953BC9BDDCCC59E1AB9F2CFD3480B836B79 +5C74D384C53723CEDC5E42212CE487EEE190F6B067C322610A6C17E0D84A7DD4 +C3171856FFA19470F84E207DC9BEC7B44C3EF2BB5B043929A5E900750D117A20 +EC2297E4E6AECA011F3D08B06593518515B495DF8D64D3312AFB918985A3C4AF +173ABE8C26318ADDCE1C262B03000CAC5B5B4505B26B26A028496703493D3AC7 +E24AEB4F741A6E4A68EEFA0D156E58CEF880E0C41CF6291D0AD20D299026B9B9 +D09BC425FD7D7EE59595CE14CDBB36CB4763AD7AA8841DF5C17FF3A4099BEE95 +CDF6DCB8F9ED7E118BE4F2D2F5B4D67A2781F1E2C1DE8CA03022C964B1337830 +1E20572FEA296D9FBA4FA416056378BAA8A86C165A39EB148B255DE0E7EB6351 +EB53F4AEDD8D411703A3F01159BD148796A1FF52666D962126FA863C9811B3B5 +ED20ADAF32EA3BB018EDE34276FF46A7153235B2E9D778402952F2C73CDB0290 +3C24E2BD7C74A77BC339F7B421983E6146F64718605DAAEA2914F3C4AFF5E078 +63B7DE54810BEE9F140B9F4B0B84521AF90C462914CECAFC07EC0617A189158F +B4EFE2DD47221780D87302E00B139F47239EB174102E7304F6B83B71DB890422 +CFFB05C39ECC0EA883849178EC773C3F0C6413FDFD1E1DEACCAA89FD71FDDA42 +B206A827F434160AF34813CB02BFB13B08ADFD7A0522ECAE1C57F0B35292DD55 +213A2E2D4E7BA5971F46C438332D85976B7D2F15425CF626FADD7F0193C88B8E +365C3724440FE3A2A3C8CCE159F7508D23AEFC92EE92B0F824BD9A5C44FC96D0 +8126FA6E5F23A6207D079E24E4426D0BE4798B9DA83763734EC13292B5FD113D +D5F83379F86FEB25C1ACB394747D34F0913B7BD34FCFF65AEA28FD21BEDAE94F +CA631856987B7413A7F7C5CF8DBE3C900B7ED998A3141702EC5B86BC12FBB132 +24608C6FCCC626F19871A87B5AB45283BBCA5FF6F1A19277D7DEB93EC5EC9977 +4F23995267034A21F92766D7CD17F573E1017AAA96A61DD36C211DD20AF3D34A +340900F1188A9547FB19761E2AD2E0FD506F17F389CF9EE7D8BFC1106195199F +59FE361A39CCB0EE0D9E3C5782AAB7B6E5473B50E81EAC6A46047F110B155079 +9EF8C17A6BC2575A28D2447E3F08742F4BA6205B5C198BD5B9FF54FA07000468 +19A6A54448108F6F80CE1A07F2A6890AAFAD3CC15E8505EA2E2B3A3B35663B5B +FB6F6FB1492DB5DFD395F8703159A8D5EC1E73F859722755453931FFE63B8D1C +7377F5B64B3BA3B854C245569A731BB6C13A7AC4C6A2EF2374CFFAA99CDD3984 +7BC0A101F49D0837B84BBCC374B5FEADBC644FD8A5E66450AC95E28BC68EBBCF +0E594CCB0BE38C6B50D4958B0333E568BEE976DB2E19A8E62EDFB683B7331EED +3D67E0C0015948B07F6529D2620FA14FAA23A898A32360B5BA9E21BC24DF15E8 +669014A32F848EC36E63348B0FCE5C5035DB8C2234E3164DEA3243633046903F +94EB81AABBAE58A1D2A6EBFCD301BD54F49A47670CEA8E13013DCD9026201231 +CE0687971DEBA09310443ADBDA9E637C2FEA83D73048BFADA322E72F3C577C16 +0C751FBB90641C66042E4487DE1954A2448ABBEB51D1C11B312A3D5A7E1C3D71 +521CA8F0996C2143A0685CFE49C8BCDDC0E5403823122076A1A9EE3CFFDFCA31 +BF6A4BC12E03022A8D423A71FE46E17FC03B333A7F09E879F533D9BF149D1CD8 +B7A8265D47F2D63F6C961C003250AE33321BDF8488CBA52E2AE5924CB1A96482 +C5BADBD45C8E2F6794E265FDC9E5D4BECA1748BBAB6A6E1D37A5902238B5676E +32409C3053B8C8F6E6FE3C4CB1F3DBFE8A920AB0D4D5903D877ACCD0B367E912 +C9C00CBA8EF9A3D9F7E042CFC3ADDDF9508895A9B4C61D6BF0B76507013EE065 +82241B0AA5B0EF9E30A2120E154FD9E844FA1ABCFA468D7B3D58A4C97E433B3E +81CBB8C498B11D75A2E818EBC52EFAF545654E2B60207B986EA905F4E16C148B +CBED6CAE4C7DAF3EA41B1FCD32BEE448325DC5DFED2585676CEE3B057004EE9A +1028F7D0488443BFF30384C88FF25886DDC80A155DBFE1DD0A9161F5E9AD8DDB +9C81A53981E6338E822372062488ADE96CF40007E4AFC7F6602BDEFF3B5DB602 +50D1418A90EF6AC7A630EFF91835EF925CAF67C2DA09A1929301938C5DDA0EB5 +4DF4FA31BDB196091A0B171113FB3E293255F76A78195643CF930776D2CFD22A +8E991888FC446ADBD613AC37999EB3E14B860BD70CF6B77538A8512F1EA8876C +F68BA5C67BDE3249C2C46B91D1C86E153D774B9BDE31FE310F24C69857D7ECFF +AAB9BC4A73FD94851CE77417ED982BE376A21AEF2C167D5858534EDA58F06509 +1C21F5D13F23C76B599873E237A9D0F13F4E93342F601331C93FD12EBB6A3A96 +2B6EC380695D00C55DA40F6952F557450E914519BF6441279EF39D7EDBA95112 +F28213BA6CA883E68B59C546484F76BE53CB0B6732DD19DE6065CABC0F9F9627 +75DD538AFDEBCD2363D39D89D0A3778F7FA728CF375CE8029EDFD0A068FB5CFC +A13E5F2732700EC4060B28B7D7C1252A7B9C421AA6CFD0970C4C29596EEAFE13 +E8A8DCB6749EC08D9B25CA464B7A7F94E518B269AF5E5E532A215DA9640B6E04 +0DD104E93D58236D0A2C481EC119FF16FA1E0F8F3349EB6B0D347AB5A8723D45 +348F41971756CCD0BF3FE5F03EEBBF78B974D1D6CA364C5CE160C8FE154B3176 +3ADA41D6A7D2D1F0003489A7DC354ED43CEE9F121BFF9A85F65225CA38C7DE79 +EB9DBFE2471AFF0F8407E5B8C64565BC219C22AB0F1480908E1B5550EC510FFB +62433B1B36B30861E183E5C2EA573B54F35F2512CBBA49B7BE5BA2A7F290ACCE +FC7DF2AA1E5882A8831F9F105776E9DB60DC0DEBBD1D1E8403704E246EAD6286 +454822A957EAECBF31AC200EBAC45E0D340FD8587DB953D3F9086F082487D2DE +771D52AE8CA7416FEC9E91AA0DA73F969498A9A1610DF691AD908917EA3BDAF3 +78D5A705B156A95002AF6FA3BF3360B5DFC67F1BEB4EFE9933562BD01DE2529B +E044F351F50D51EA139828EDDAB0CF0194BB070ED70B68008258150F5CCB185D +92DA71065C20C2807B3CE00CC0FB725440B7BF52D0F9F6FD58AB3B0FD89CEDF0 +1414D83D25F9D2C91A5FB0EAB5DCF3C51902588EACB5ABF77736EF39DBFE403C +D0B13CFDC488D079A86079978DACD3E4E5CF112623DF2AB161E9A8387A523081 +51A836C2240D7FF33E113BB6F72843B7EDADBEB595D3C0EF5C55C5246139EB79 +28E4FEB7C216B4AC7C8189CFAEFCFA919284893684890F17910242704CABB4CC +D805F4C67DED52E59830BD569B19890B527BD916847C951BEE9652E602AB3DC2 +69B1E2972ED868219023805692F80D83DCD99B5B454FF9C52C46AED905140F10 +AB71305333855E1E8DED599F4824BCD118E789BEE6C260C99CEF1EB36A10B13D +7AEF20B6FC8EE0436D3C4344AE5DDC7018237B440867AC459C5A31F9171337AC +5E8807FD64462C64C63A434B82D3C0BD1EBEA855399DC50E7CCFD487097A1561 +62F5F651E527FB70C0E47FE6680E52015FE2399E25F00FD38AEA37B13EB42435 +C4A6084C618A12651AB94A09793B7B5633C350CA69EA9B1CBEB45FD240FA6D24 +58A6AAB28D6F6C97AB6854A0B04230DEB18303C2D77B3B7492D28E632AB60EA4 +DAE6441B7DD6804C47314951870CC30E662E9FD669CF37E4554474A6CC593801 +E8085F0AF185FE7D8CAB69969DA62A37171FB6EA39487D2BD5F689E6C67D1EC9 +4532C8DDACF164CFC7AF6850F19E199FC0EA6AF11078F873719A5A10DF16CD1B +F6968D78666E0A12B0E8AEEBFC7E523C37595A47279F1AACD6D7C832DF6CE944 +2896FF8F09714D92031E48652BED4AAFA55A84F5F06CF37095B37C6EE05CCCA2 +08F3D27C885B89F62B68768BE01AEC18326634C4EAA7BBABC3C9C4DB5CAC46D8 +85A79A180EAC7B74B3DE2F1FAC1C8BCE424886FB22F1F45DABAF374C7EFB8573 +A9E9BBC6F6ED8A720E174CB8FDC75B81663F4B85E472568E5D5B19FC25976FEA +8A26B417EA52D4A79169FD8B9E0DF0AC600642FB694621007248589923F2DCA2 +2265ECF240D063D6A682B7400AEC39B965CF6522EC807897097DEA226DCA64D7 +36C85D0DDB18E290CCE3F7E1301D04E91DD624D2F864CDDCC77CB34ECCF4AB87 +D641AB6901FCA513685515B023100D735733CDB77046B69C08AC0A0F65B65634 +437E9689D09878191F6BD79C0487EA25CB34724EF394FB1053BA4E6201162CF0 +AEAD889FC81C60601F9B53F161DB6C9A8BA9ACAA7BC29E489122667C9A239466 +59CF8981E1CC278C158D7AC2B25B4CAB265EC46477E7E3E69A98B3EAF47E48A8 +DD27803797671AC9F0290BC23AC56649B34EE46C97533DE11E459115149757F7 +C8050300EEB391D6367C048B5B48078265B5F70C57A9B8EDA8D242FD220EB33D +73FCBEB3E29E36C37D59A536945B1F47FF6B9EFA81F230A29403A2932E1D3CBE +DF6EDDCCB02F4C5243B3C43A079F32329BF852C894F7FC9B4786A16CA9583D4D +5ACC28C6441029FEA945FCC358999F6D7CA5418356A4129B98AF5B2066D141F8 +07F7036B51FF49CBF6878E89DF3B9F226A9C019DECE2FC8B7CD2F7491077AA59 +8A30A25BA74134B01F43F282B121498438AFD69D7618C77F6CED9F0A3CE2ED9A +64FAB7C69498548C51B96FD7F3DF274E399577491300D4AF7956C851A8E058A1 +F49AC57A5869A46BD5B51523361AD82CD3252323899058CCA42EC1DEDEDCB53E +24E289D0095E37B4067FD051414E4B06215350F9FEAE5FCE1479E77BFA287857 +9A9AF5F7BD93FC5A96908208949EAD6482366F796A88E9AC15B6F24558C58F14 +565C9CA8EC72373BBF2C54C97C8FFF8442ABC8E25DDB4FFB20EB229A4031C14F +FE32FF67BE4A28EE0BC60A6118EC3A8D0AFAF472323B0065C670CE41FBE92F54 +CFECE8751123AD3D51198E5EF050D8C751345E5AA0E578F4703340A3EC431557 +51FE351A355FAA778F3EAF00223A0BB03A7DAC11F58EC64F89B2A1C249A9F720 +7C373942CE60666CB9A988E8971E31CC706A9516694F1F968FD0D902BD69B6FD +5E04755A10C8DC057E60C71DCF9D6666FFBA80ECA59CE185AE97F8CD64CC7949 +76FF8D9C9A0FD74835A67F2A34A1229A7D9FB0B9252089BE32C320D28F22C93A +358073FF58864EB4E9BA5C83BDB879C67DC64F591F1480445AF304F6CF657265 +06E758177CE96259B3B2AC1429D549E249A8FC90444E6CE1E96D7D57A5272278 +076C2055BD26144686880FE76D0161DA226BE79D781DE33EFF4F9955C928BD6C +55F16E14A5A2B8306164D863C2537CFC05A7F1B9E9221321924D33E29C95321E +D5603A85A3F3F890204BF7745202DD217CEE21BF45514B8BD3D5018DB01FAB56 +E5B85AA57D26C115F349D826D21785FB2B14B16C3A1C3D764300C6AEBCBE66DE +4D8AAC6484D20857694BD65065BF4BFFFE35D86D6C4AE1A29E927861D180A339 +7476FB6DF1817BC6A077CA5BFB568F6CB759FAD1DDD86F07CF9F6D6B8B320E01 +D9DBD04D0315ADA0A2F8010DA572EE6AB906E55CE716AF7969A3F64097210C94 +7623AD3E0748DC9614F27C4E5F614F13770A7C5B49464AB0E6527CC6FBCE4794 +BA32DC1099FB73AFF3EF8DDC33132DAAA7546BC6359DE8A49254AE44963830EF +7A69566BCA08FD8DD4C0982A38625EE58E39BA2762CCF85A27B037D34BE5689B +880D9446476613BD98CD3DE649117FEABF6156BDBD39AD05F360488C3A80BA3F +C764F11DA922383787A8E93F945C8E9D1FD4CA16AD0958B21EB36B84B524A9BD +C8434B908D4CFAB46411E997E75D9F48E140C50ED2B56723BC43069B42554850 +2A73B211D61800ED608891BFF059E8C49C52BA719CBEA6681A9BF720E86FAE4E +04D5BA274046D9B103FF247068EF9B3F51C22F518AC1BE20B9A00CD21F341BC6 +FC8C1FB5072C69466CFD1F1085A92E517883C037F3A73658CA74686F07BF742B +98C121BF9888160E0DFEC324C208409D876B887E4447CFC4416C9A4358D7B1CB +769BE77537BC8E2771F2EA19EE1440468925D41C01ADBF2484D8B5321EE18DD2 +A0B1F570E0BD0F8B0931E1C6DA0E71F1E995487544B22AE91B8C2B9AF65224C4 +BD3E3BB227FA37121E31077601FC205EF5E5B69458333784B42D07CD58AA73DE +8FDCF30351D58B586C9A6116F0CED2298B7E6E088247EBADF24DD85DC2680BAD +D217DAB604987181047F426ED848CDF475A9D19D0F00AB7DCE4E3C73C8B666C5 +37C09106A440E2421E94D699BA881B53D98395F47808FAB1D594561D46E82175 +0FAFBAB8F8197119F14D789B7E798DE37D62D2043EFB8DB3F819B62238D62E8E +ECFCAA92C967CB2FB089A8AAE36AA54C43C8F9AA5A7E8D88B178BB878F4A7073 +1D6BF3309D05856F4AC65191EADBCDB22982431C86745C3E01B0F563B2405AEE +1E56370F1835559BA096C154626D36C090D3F32EC2EEC0B35FF492A08E61DB6E +C234642691A4B214E27FED0D420254C5502AB9797B273B8C6DC49DD29CF1C65C +CA61944460CC2ED03655E713B63DF538209FA69DAE84B4A3BD89F7834BE5AC7B +F3C6CD20E8762AC2E365548F396D32FDF7349DBCE34D93E68C626EEA8DEA1EA9 +A369A6435B000C4568BEE6FB00BFB2553D7AA6923E3A28B131A135920A43F5E3 +D692FE12C30A2FABFD2047DEBDB4D9037D87B7FCAF0DE6EA92596235FF5B16F5 +80D4B99B2F98B51A350D8609C9A65D0E6BB6CAA01AD47912D72A869122A20E76 +8FFC5353BFB61600DB1851169A8B0CA7461240A1EC10351AE38DD223262F5F1D +C00DED1F9AD9F805F8C13E34E878E64D2951DC05C2F95AFD57F8C1F0316FDF5F +61809B7AAAF7CECADFAF70C607B77005EEB7073BA88B7D6FB714C10C313EE3BF +82D1BD536D7271F012ADE21C41D2D4BD9301305BF3FC46323C0F9F58C3229897 +F691DD00E9C538DEB7532019339406CEB61DCA9509DA08B4E5ECB4966369BA10 +739E73F3A6C527D685900E6A592D25D01EE3803EF8A741232C8B48C2798474FF +03CB68F61FE1065A45C00E86E339580EEF6A90545B04EFAC45E57F0B5E9BABCB +E053AA4FA0C593C1704C58858CE462891FDCEA47411714BD9F42CC66714A1947 +5637755E85F7CEB3F85720CDCFC6594FAACE2E49864514B00860123130D91672 +549C4B4A46F3488F41822C30C927430207BCD5BDEDD48366A1336196EE37CB90 +EE3193289796DC165A51E6C01FA7F87E6028A8CA46E90A47154BD95412C803A6 +97F35D80F6FF9FF64053FC3F67E182A3AE7E72F12FE7D85778051CC8BC847FCA +CE8477994CB78628DE7F366A6337AC42372E54F5809693F631910800B854C832 +090D71B89E09D49256B84F5B0A2BC26AEE76CDFCD9D58F4D739B73530AC7FACD +B66DDD8F3E601336999AE1D93AB261E1A101DBE76C7C9C988D4FF999BB480853 +9D366BC1F0CDBAB25214BC5D38D3383C85345662A65E98851321D776D34BB6C0 +F7E3367D7329714A5B8524213DB65B36229AA4794ED1B8B9B735B59CFD4136FA +ED923B234EFC0F1B10E99B4778F1616764E3FF5EA5ED64D7488DBCDBD8D0327D +79E703E5FBB73192658B48A6E3A50D43ED6F9CB14A0E1767C1624258378BAF01 +B4374C36BCCB1EAFBA373538844F5D1F36E25046722DFEA0398FCBB80B1509AD +F76C2C452C2A3668231F46B8A953C722FFA795A9B25F34FA0484CB72DF2A9E3E +AEF724E2A120B9C9D3BDB7BA2F1688C85BC8B4F3AF3137C3B5AD07BDE5E6DBEE +AB93BA821562CEC2F498A406932E1571A1AC323C894256D19B1256FA855DB4E3 +E2B7B1F286B3A376ACB8EE51BC3036838D9C5C6D275E92D92FB3A04EE15DCEA7 +83E772D8F2EABFE039652049758504CF3BB46846C071E1C834578ADF50ED6BEA +4BE184F0DC7D792825F61FB26B06E8133A0FE6A5A50D804FE19E3C58CF1FEF52 +3A44C7DDAC8C9FDE076125A5E69C61D7ECE569901764FB72C9FFAA7AC49358ED +B49A2F27361196F608636480F5F59E7C501D77BBFF424DC90FFB76A98B10676D +5569395477FACA2071053F0C8E233F6D63B5690F30ABEABCFAA4BB42701332CE +B2E3AA23501DD5164738E9C7649E1B3FEC004775BA90902219C5418411CF3E6A +964C79F23EFF5867E97CD07ECE28E017105A493D1DE4A4352FC0E82966F1323A +06719F6C7982E802385193DC4644C80E0F849A9A9435236C9FD97E7E444A8B86 +531F89DAE02563F58C45B8360F38101B5F27536C91D04277C39CCEE90E7D3889 +80AD6E6377672F8C3D9157BC6883CB6CA46F48E2A2C9332647B8C6BAAA0C64B7 +89D2BD9E096B0AADAE3067BD9789A7340C46B398F4CA1944AF01A383875F6365 +63D143B3944E283A23D54AB91459EF2334FADC4D4B967A8B415841DBA74E7437 +0A7E38218C574189FF14954F1CD8B2CB642F017AE7F226A9B5D6B1887864BE11 +B36AA442F8493AB43CCF30CCF818C93FFB2148EC95F4E53FD2B203C9DE6C1335 +08D0CA053B70CD72CDEAA8C808B71B14BEE9B0646CE22C37B1866715238B2E77 +0ADC53682451FDF6D89ECF1C0626E41AAC7E279AE8335140BDA6FB0F617A8E33 +9D480F774DFB91528FAC553BB0948B94DCDC3EC4082EF3549E669A7A49C83FED +98C6C7DD43634C8321CA5A3BAD048442CC9FAF839D7647B744E11FC9DC7ED2B7 +1E2BB9E82308703FF7C7C8C123D8CDA3631FEA47EEA9045D6DE5BDFE87E92B58 +E5404906E06B417F088F9F9F5BBC78FF369CA8D78F3AF16C21C8FC2F38E559F9 +11FA7F88FCA559E319D63A6EF43CAB1C7E2C50736627674ED172BDC507D7770E +706DA40D79895E339D3DE90C2B95AD62E9882D9C306D58F80666A419EDB2A0D6 +0841DC59C6D652343F31BD5FC75CCA2E69C9B8495C9518AB83E95ABCCF6C5475 +94CC30358A8533ABF1D9A550076A6652C0ED47B6B77FCE29B8CBF2A7A9329089 +9F310FFF1F64AD75CD3ECDFE4507AC92C3448EABBF9ED97FE3D9E10B1EF3A0A7 +D692D0698047F685E6401FD72330B7B5736D285A923360C4B6B271B74544F855 +158BC5FA3F971DA2492E6A75F7A2F0C3871FBE4D4B4B326131FA1FFD6360F34B +9853376D4E9AE399DECDDC2BD6D790B59A0090BB748EE0EC0D459F203604741A +3FF6D964B3BF1B72881924F6FCA5C778CE8CC8513B99DBCEA1A8BA6E46DAD45E +9A6EB90AA1B02FE6D857CC50699424F559E976FCC174BD5459884F8A723FBFA9 +9C7DBCE6D0D6E426742F6AFDD4BC603254FC4A4A53E54352A79E74EB198DA28E +72ACAC529BA702956D1ECC0DDA91F64C822F3B1D564BD0EE11D26642E12DDD66 +9B2FE63051C59415F42D597690C369CB8CB64A8E3EB300C5DAF80E6F9DECBD78 +07AAEA84633498558B623AF42FAEACCD8D4FB005180CC5F55CC4DAC3955E222E +AA4CD5BAA529080F195AF80FDFFA970CB01B9AA321274A8DA701C9A381B0F21A +977E59520496E965447F88873026BBDAC1BE01EB7060674A656918AE89D6875A +83A4A71A8E583F09CB7C7146AC9B1CB5866DDFBA9F6E428A2D315F73F9C4049C +32B630F243AA9F62FAF057BA3D8C042E93414867D6DD3DFBBE9FCC4AFF865449 +B3A7AE8B3665B519CDB7E2372BA6DBC0EA2DE31B04C2A16353A29A760D409CC9 +F5DD03E2C11D29E0D545053A6AB7EB57D556E25401306FAF915968EDDB542D62 +E2F2D772CB09B4723DC936C0E08189539972622D8A2007A3DE1972083A902D7F +E50C882272691FA11D0013D6CF4DD34C6D2062C2F7E62FE3467E665D77A40757 +B16C6136E7240CF39704F49E8DDED8A5D60011C24177467763373E93730D04E2 +235768F2FAA0615532EAE537755434F130B1F83CAD5FDF4092FD20A324B3FB30 +80C9F16C617E2F13F315ABC8B2094F8C768277D629E10A6D0A9ECCFA0821ADB3 +D76C8206BD399FB5AC93AF557E2E982777B6C1FB0C4D74993E6084C1D4F50F1D +F0F50BF8B5658FFD4AE0C6C1275C06100D2DEC016F809CD8D9FD3FE7A7EF988F +8F0427880335F024598EFB33405D55C44DCB1DD147C398D0335E22AF9A195D53 +4AF6189CAA57CBDC5F08272D7CF1B5BF92BF3AF8036EF848E437B50688F49D49 +46F11D87415FD9ECDE418F452EE6FE7A3DEED95A0996BA0862DE216DA08858B7 +524A78820B2A5BAB4ADBC1BE71D69B02B149DB5CCE6C859A38A810C901CB845A +F9873F64E986CBFE0B2D2146DAF2366757C8FA62F7DF8959CCFC78EB605EB6CE +4E5B4BCA9C64258570EA229276FB5D417CF1B1B315148693C5EB6996CFD1508E +67DC8BE993EF72542255F7E323CC182EC88B844AADBADD4888A8C6DFC1C39843 +0C19767F9883749D6EC9D065C88DBAC9D87AE9BDE61B8950A51FEE9E531CA3EE +CB14C95B7301CC5A7A1B22FAA9E1E956EFFC9BDC1DA96A8910E733E10CF2EB61 +B7E324653C797D1DA73C2C081D70A14310D0588AA6915B0F05FA2CDEA0FAAC6A +FDDE41FBB23B5CA3D0CBA1CCA54C6C685F12C1DB1B4E8943AD873691186C7A13 +C29C42C86F1E46E1307CE630DBE4332188CAEBFBD604252EEC001BD89FD79563 +D79B17FC27A5506496576A62D3EC8DA2EF2BC0CDCAEF707B3A18978DC99BA0CB +3D6E611BC0E27CF54D8478853EAA6F80B3A698D179E8660CFBBA117EC0694457 +44D6DECED3C1DC219D63D1EAA09BF546A16E28EC76B7EEC8B01C4EA1DD332503 +8FB779A7243A90B4A98201B51D27E02083FA278BEDB9FBFAFFF82C4772F2BD17 +53AC2A75D9101249F2B0C52F0C565E6D084C1C6C50C084EFEEB5E3AABD25FCC1 +339773BEBCD4671779FEC8A1DDEAA73D2FFA456076F4D3EDCF0267A48E72D2FC +F658FEA7563E4B10908358E5FAE253C5A1A1F19631F1821C3C80BD048CE166EE +F77ACBBBE8F2DD4FB7AB2692E8C25BF18EECD4F0FECF677860CE50B10F3E67C0 +39F23CD146E0ACB5B6D2866594E6AD5A482D864B1A94E0CE45D4322AF6F3EDD4 +015504E7AEE530A5283FD5A934524AAC4AE9A2FA647CB578FA7E85016F97C906 +77436277D984277A329961807060D928D2065449D14FB75B6EE088C7496A0718 +0796B05E1C228EE7E1C7C50106CD49AAB88FF7C5B94658E3D2D8713C061B5105 +44DA4C04D051ADB47161510B9BCB4D18542A0EC5EB66611BC9DB1B4EA90995DE +19F86A76565445D112DB35479C7E70EFF4C6BB3E45307CE48BE52A9BFB818387 +9A0D04EFBDBF9EE973CB2808D9E75694E9C77BCB72EE07943096FEC011FE7435 +BA43B5AFD8D0811342DF88D3C50B9D001CAA23DB7F88894D58AB56B74E9D6E45 +9220790C088D3C2FB8304C4032FDD3129C0B52283AC284F36DE8F89E9E4505E8 +0AF4B25B6342B8DDCA18497D1C741BDD00ABCA6161682D75CB20B3D4C6CA560F +BFB97A5268A8912F873AACB40C9D7E6131BD2C2FB99DDC95A104AA4DD69E531E +1F7BEE6A10F0887F6DF15EE64F3B65061146BCF0F46B5EB53A294960E291A552 +0400BEDF61D30D4E937691414B8C14DADF3D4DEF27EC9CDE862922A8F80A0DD8 +2C4CCFDCFCD568EB78EC96FB946CD704BC73C9C07A239DFD8824F52E22C1184A +CD4BBDDB3E2301C142A6C21483E57A9BE8D060D01F5EA23C22178F3EFEACB76B +45C46C034A27953B14D9A2F624C47668B8700B5363F5C86944A8DEC84D382D56 +0C6ABBB75031683E20755612736DF206D313301FC39FAAEAF05D483C1E93E6EE +E1DAB686D64D959EAA5DB319812177546027092595A5002B151F433289AE5B87 +43767F545F3FDC397C02DEDF76AE6462D4A2AB55867241C8A7EC2293B61AE39B +92B8A82B3AFD65A6AF2B4C7928B4022B9B944151FF0936AACF2269FBCDDB31DF +29358B779C7FE59CE4FA452F0987A6026E0710C4DE0DCE081FA2602D01EDE3F1 +6C29CCD38E9D8207504BDA0CFC49517FB02E78BE3C70E4763B58C1CDD2DF9F2F +BACD21EFA95A59D67ED2DF67366B64369B696D1FB2717089B7E7073A6C778127 +2A2C3250B8FC0B5D8575997D6B8AFAA761E8CDBC9473B29C10BCF3E16CD9B555 +18124E11ABFAF29196579325B3F6C1DFC9AFB4B1CF54A40605D7B1A39A337C6F +4B3E724C02BF2C1DE1B5B327AA0F65B9581533015A7834293AE558277F7E78BB +0EB225997B0CF2AC95698AF7CB0F2AE6E297A7176EE56DE77CE18E6DCC988011 +C51C80DCA3A6D6613D517DCDFBDAC2936139030AE78D70A579048E27CC418600 +99CF1DB94EDC280EA97768ED37D5ADDF09F26FA9CD7C71FF71EEF05BB8F7AD59 +EA1600BB67F8D32408617FE38D3F03D23E3A9FC3921EC9C880F0A08E051A337B +72ED695E9B00DC820E7EF062596B651EFCE085DB5023D14713710BC6E2E98C7F +3F674351BC3200F448459590558A0F7D1FC99B33E69F920FEAD378ADC6F2FEEC +542C45A265AA21A7C5408102E0618B0653CF275D78D13DA3866048521F937A45 +8AF2EBEE59DE62B5AA226BFDEDB8C7FA92DA2A277141C1DE3301618DB5DF7EB6 +AC5BD2226122C26E0AF1A02C253D60052BC8768DE3DAF4BF58FDF5E707347558 +9431C7998D3FC3E63482BF8F31AC6E0630B4127E8161FCAA5AFBEA9649390F18 +4C8E16117FB1AD2F5A125A9C24BBC404A2491B8C44062FCF8A6609338052D3FB +840A905FD9E94E54E6D1EAE195C3C635596D9D284CF7776B2BBD7D786A9E77C7 +F868643441E41CBB50E2294A007668954A0B33F47D470D72654FA58D4622B8DD +90C3CDE66C691A4584FF2D93A6360B274E0E3739A12773F497A6FD980DEBDB57 +1B88A8792964708072AC880AB3331E8625C6010FBF9EA04F3572C737AA1E47A0 +8C5A40B1A3CDFDDF7314D1F06978B3FCCF751E0DFB25F830FD684539AEB02DE0 +856D6FBBC4372D76D109B1A52C8AAABBE455CC37982BD728EA964AC19D6D6C87 +6875A653799A383ADE551C3C55C08840D1C4479F1B97CCD8E07201B4E66726AB +B5FC0504C4253CA50C538EE93D952D148C6D7A1F99EFFCE9C9E066BC77F2C85B +5BA9474A49850FDBAC35F97EF5783D647E2F6B238F7D77B8F494D6D04687B8DA +9179A7AF10A1BFBC50141AFD6FAD87BB58FD1510FB6167E2955AC7336F2038B9 +7AA2683A32BE3DB233F3DBA776AF699305686785053DC25682B734C93F2725AE +5C82CD88B68A7C788D774581085BE2E4B467DD5C5C7FA83D3B159CEC68FF0F91 +5ADD33BA8CCDF3D93E96B0F9CFC1F7A2F98585AEF0DD14481CFD1DB73963BBFF +83BA8D9490FA120F6E4E141EEB1D14F29DB08AE5FB636AA1BC7F46EEEA33E8AF +334F22650CFC2F3CF73BFDB769BD34C3A80694278440C8C7B6DE03C101701365 +06ABF17546953891D8EA0F75E8756DDC267027145042C2817910064AD0D2868B +622937ACFE34406BCA089A50BD5D40CAD02F22BBD892189D94D41FFF3AA8F3A7 +DDE098C2A5C23ED877B7D8016709D6D578CAFA069A3A50AA3FC11AAACA58940D +D88505D217BD6F562C8E435F4247AE9AE65BEA57AFB21F13E546040A1A51BE21 +1D2706F228150F97BDAD799A4823C7FCCD8DFFF66DE7AD2AA661B6C1BDE91D8A +2625DDA0C9C2DEB214C9C41DCE148A5A805ECE8229A9F33AE5BA7A99DB32F225 +24E4C3D639EFB9EEAEEFC61E8B36C2092F3BA757882F94FF7DEB36127E272527 +AE79F0F55F9323C046708C4428389058F9C67CBABAA779F84A3EB8540179513C +75BF10AAE036CEFAB476729A8C5BD83B4C212656163F91FBE16384611069E2B1 +AA843715DFB594523904C3135690350EE485893F3A51CF2A72366EB840EF3CD0 +918D839BB55635BF7EF6E9D3CCD2158918CAB7C9FF74AB701C17E07F2F04A19A +F6BC970D90380809A987150EC0C8AE2FA190759B3D669DE4894CF4EF7F32E3A9 +50BDA5A1B083A21A9B0E1BA8A536302EE71A14E8778CF1ECFE0ACB592563EF92 +D2E727BEC93B5198FFE8C0AB9FA44AA3842B6E070CB4BE0F327196A6CF1F2D47 +A7CBAFD8FFACDECAA76F87C26E561DA20B49D2FDB81C42BC36D52A95BFE3F2C8 +4E4644D6560E0B5815DC0751A92610BEB4512A4614D0406AC8B5E5FE05610143 +DE3A38D11BF9A3E8B0E5A76FA18E99B559DB6C216938AE9DB50591E78FF9FB13 +67E89709CA7AAA17D20D820CD1BBD18B904436581FEEB2D9E5C2BC992AEFBBFC +7129948DB03119F6DAD5339CB950EC410B1064F2E8D471972D60514B9037DF21 +6F42C03932DA11BCF6B8896755D2115220E265469B3601EC1079843E0D27C207 +0D0624E118EB64924154EF01FA65BD93331754D469E61BB34DA3401A8AEA17FE +92165E1BCFCD153617DF82582CF27B8E64BBF919E183BD0CB78753813A01CD5E +D3ED931E4670B05C39B66CB35DD93E934B1239899566EAF7D7524E8105DC2BAB +6C43CB4BD23DF98F3CA2E88F0E40A3BB65C1D0A7CE7735F95AE5A86495C3EB27 +8AC9F070FED1E50936B0CE6E9D3DD56FF394F45646F02AD19885072FF5DF07E2 +2E7B8709D23473FE3E62E0150DB7233D69E31E4AC822FC58DB253EE9737B9237 +3000784F4883FD2BC7C7646F48BE10DCED395D7BB6DB8B1AE3ADCBE3FCC23EB0 +E7BC01AE7960B6B18B65A2820E788A4B47177012F5AFA3E5FBB8F593EAD2229B +0CB1474FCC2039FE2DFA57D3DE16C6612658F7B7C27B5F3AD36739DE073DFF2D +17A9351BF25DD24B4434C5D1B6277EB9BBAD895DCC727756DD588B65875304ED +983C5F664FB658E0DF6D79DB3AC1806EF4D5F73FAF9651E738564CDCDA5BEF19 +53AF4498634A841D370BA07863C8B579466D5A329C8160B8695BEF1DF28527A9 +6DF41EA5016705F903D0A0D2268A27965CC888A8BAAABB5D4FE7EC8CC7816732 +2AAB7557AA7AF336BFB6B298299BB7B5CC89797B7A71F4D61F0609822CED2EC4 +85EB4E6FBA0199D538054B212F095A49B77F664E749D0AA899A877151669E89C +EBEAB8A71BBFE65242FD53244194B5763260B87B0857072B0155000E5EBA5DB1 +68C21BED2AA9B60506E6873997A34909F6C8D5F9AC3B241A1496A2CC9B6FBB2A +1D4084500426B3931F25B42B1422DB5444C4CCE842B6FCB545CD0357DFA6B867 +1CF9C7FDEFD67867D748267BFF9AEFAE4BBFEAF3E0F253570F84D5214B24C335 +947CB1E1C56F58B74F48103F1F690C543791BD85B5DF6344EB45EAAD771A4EB3 +1F0C7765F6BCCBF583371F56120579729F58322314C5C5746C2944099D7D38C8 +A03C7D64532B0FE23060EA277C1D71321D257FE0E07592FCC8B23334A92C4646 +E5900FC9EFDFDA95B9E183C582457B032F0878503E61CF24899569B85B194466 +412E10123D6725395A7BA8EA5CC88C8CF69F5386C0E615B7A33ADDE091348CB0 +966F9EC34A7ED43CAB8E50E6C454A36B96DEBBA1F7AF42A21572BDA70407A985 +6A1F582EA78A05DCB2E80D58B526E6473E3688143E8BCEF811D1D02F7565C564 +E8CF7801E98451A7FC541542F9490B5A3AFCAFE0C0C3989B7899045CDF262D24 +7579ACB8348FD249234092028397C92B3CB69AA206A94D70C2B78ED45534A65C +07C396847EF4A6D9FE1590515C29B2A8FAD4E831BD2E4AE07F1E315CF8DCE669 +DE3FCAAA0DB0A2A518753D04F8DDB7129027BB94A0A1EA990F64FFA543F90FFB +63944FDF5F6E29E821EA00A71912C9B1AA9426939A2FD08CCDDC1DE545B5B695 +09DA575BE8A9BA6D51584309687FCDE29128D7BC355CD03A09D1091C156392EC +85393381BA2C006949DD93CC39B7A58BF101E0117E88B3CB4D954B79A86C632F +38F5475C8559229155CD210AADB479F7FA83797FE211E342DBB6CF3060986C92 +9F946E65ADC67950903B99EEDE3E2EFACFF68C4BD90907ACA26C96E4E5A28101 +3517DA551C963D6DBA3B2A0B4432A6D364CB2BB2FD1B3DDFC1F514D4E7771D1B +C4B406372269021E87B66B81D4AFCEA1316B755D65F7DEA5AE2FD2264CAF1B28 +1DD4764FFA33B22D2CCBB7208D7EEFAF36B86C0225535264733E237E055B58C8 +6FE717E4A6613D049D39E64A7F517C14CFDE8CACD53D96908B9DDE9DD88E5BBD +FEA1DD01A0CB0E8C417EF1473183F39EA6FA2B47BB27D37381433050DF7C5F0F +3FF6F2DE3C7BF989F617AB16AFEA89058C5E325FADF9B37E0F8565B433E82EB4 +F949AAFA60BD424FF49115CA76543F9757741A3C10440B4E5F0CD73AAE7F22A1 +13C4DCA7D6A55FDB020D14BAE8DB2600AE6CE26144CA0F83C82DF67C4E89914F +4C4A89DEA5326DACE14766616AFF2E89FD7B25148819141D464E47D178514814 +E14C9A8A796739DC99C1220CA086326231E9136F61962303686CF360E9E5D058 +915AC25E7B8F56CD1C6092252091E4E25406C5F4B60C4AD01482F41B8DD29C91 +015E19D94A0B39836722CC3F19CB46D73930D06BE314583F6DDEA56A2B6A8B5D +1C59BBBF8EF768F9B49B1BBB38B4F828BE4A73EB9315636DDE3AC610D7E0B65E +32A8EEA63B1C734CFD0B52D09B418F6B33F03EE08A886FB6E52405C0403177AB +A63EB20DA2865AA6441957F98CD7D64857ED614D59436450F33DD43EC7AFF4A2 +D3549DD174338FBCB4BE975E8CE41B34BE93C770940575AA1288F87FA400C650 +A4DDD573BF1F45EB97781044691B78BD64C3305FBCA02D9931EE3B8B7667777C +1C0EFDA7E4E247DBD6C5D92737170BB9A86D862C0534A8436B1295861A7A2BD0 +CEE445EBC7F8251E4DEDD7173A82A39B8C3055FBB90FC42B550CB5CACC2D2972 +886E7AD2AE11626F4389AA07995055AED5AAD317FEBD47B498EB52AE15DB8440 +EAB1D16A826CA1ED54F20A990EB564FE9FBB2784EC4920FA479244CD24C7A635 +574DF33C73FCB1D2B6DF0CE6D214B464761B8B9B2EC88387F6E99A64A0B52271 +2E57D454E5B233F41FCE51D65BDC26C6BC18CE1B901048833533CC08AD60FA32 +FF65C5E06A710C206B78D6B9EBA4A81031BBAA88BD3EBCF1E795170EDD69C61E +26AA502B47B8BCB9D9CE8A95D81BE25116B0B84A92BED585B4248CEC62676FB1 +2C6CEE3B2BCB5F7D6EA35A5E5725958DC772DB3E108F3AFA1CDD4586014A1296 +F92D49A8F9E0D19C80824733CDCADD36E8D6BF728A7EB38EC991B3E4F70BEF0B +5F76DEFB25670F3E9F8833C015B2C68AB4C6D5B490C2A295F038E2A8706D243A +1D4B2228CD1A2545EEDE67A85FEA536C9C32747B45CD81D01767FFE9A8F70958 +409C07CFCFA3D102707D1D6AA5EF7A8B25DDB8A7E416610F2D558BD3C9F1D3FC +A3CCAB935FD1F57D42E2D32610A3069A15A31CB0F5357C00419F152AE3EB3CFC +4B3FEA9ACB01F180495297B4A8A60A4D2EFFD3473C1C3AFA2221C67D90DC0DB9 +43EFDC47484D08335438CCE06EE75C7571007AD9E39E31BA5E2CE8DE96405063 +13BF3FEBB2AA0C997F303E056ABAE3F3C14DE8F472D60B6BF7B37A3488717BCB +C6A20858B52045A7CBF4564806C1D71E6422839222C63598B7EE67A4359869FD +C56BCA71E147E87F9F9D241F06EFD688A268CF0189BB9054231AF7764317C10C +B625E4633DCBFA5114EDD89E44AFC560CF0DD1F8ECB356174BFDE7322A3C257F +F6B9089DB9726AA7313D145A249AFE7EA43C3F1CEB9113C568D2162A515BC112 +7AD80BE6EB2ACD39260B65094039B95E1819FACB18A92E98F84E741409AAE641 +AF35BD026EF7140A7563505567E974A43554883949123C29AD3FDF20602B35AD +3100F85FE00E091803D9D14037635C964A1A92390886B6CB72A915CAEAF847B9 +1ED0F1499BBF1BB8A906538E7F709F962DF50143B649BFB2C5A3719F95362BD4 +A892BD6984CBD362BB1261C5F0C1262B57C441B9349AAEA2995C87FFA20CA0F8 +E7C98D842026CFF8DB2258D7DA536B3609028340A0AB13D4371BBBEABDA877B6 +1551058522BAF2F47F34509275D422FBD83F51BEDF0D94EF10E95FD1A8B488A0 +0A81C7998BD9AF86C1A8E2175ED1AB40C96243687BBCDB793A08A5336F911834 +247462D693993386ECB467479997E7995AA90AC96AA68B78F21AC59BA618D886 +ABC7F0EE019F4146755A55BC38BF5461B1422E62E320937D056A62D7AF6D3F0D +B2A2D09BAD44F46E97316A685CA21CC455AA8A061B88E3E64C64DDF93950E236 +B49749CEE474F8C38CA8468E6167C94B3678AA2E5262B69D4C04E5F36CBEC4A5 +029807DF9AB3E4A1B5360406EC39D519504E165D129B978225D2DD7BC4ED5982 +D67B4F1C134DF53B19CA76B00EC04967E7D057B246BB248F4ADCF9D4648E98F4 +4AA48C9112808A0F21F816E481543E5873AE2331E1B5256D027C48602EF09590 +18602EC3843E98554D304B92E5F1A531E61EF00E5809784C16D44E6783230C58 +4487C0B9DAFBEE1362F65E4555987D8810B49CAB8D53DE39DD0D49FC5C3BCE39 +6D4A8461C9F0B0B9B320365C7425D8503690204D0898EC34BFE37FBB5B6C86C7 +60AD9436D9331FE53A444F78DBCE00AF3CE5C80EDCE9A65CA837F948EF672280 +94FFFD6B176B98D66DE818E27E80327866936389AC4845FF059F996B83FBD151 +BADAF79C95CDC5375FFF1211A6C1C490344AD56BF6D9665B2388FD4BABF6EC3F +3F1459DC589A99A7615D64D34FFF122770812E0E1C5FBAAE90B72F8845A996F3 +3E3276D41462DCF43C02D046EB6AF4A9101EF81D357FB21FC15D075F7BD67DE1 +26DF7DE2E6E21D578051967794B28592F27271AD34C9B81034D62FFC442DEF67 +77D174EC4335CA3552D85B0AF9D4A4011808FF1EB140D12491217C9C6D991395 +6581C91545A69417114B70FC4E021FABF564AB6D1DC37E456AFED772A1441E66 +63AB194A8D94A8FAD64CDA23AC28ABD8630D3B19CA93AE46B6D7F229E36254BB +822529D754ECDB3989F803451F30793F0A8C4CD03F8A82185F484CE910334DDF +F3376FC4AB870851E6B7C1C10337DF7865CBBF77B28A1189494313CD8D112C6E +ADA1ECFDA1441E2F107DDE6BDFE74C50B89D6238492005C7B6AB5B77563F3209 +B6D5978E09ADCE0DACE3990764127584879AC061ED974925252983280A596AC8 +A0E581D4FF1446D3E25DEB2602680C4382605AA1CEF04A5231220F54449620D6 +E6705DB2D554A34B4A51B0243DBF506577753611F28C968AE743A7204ADE14B3 +6028881DC1AC19923B6ADE9DC01706ED6E635AD5049DFE52103F4411829E5F25 +B8DBE813719DC80195FE3707181931D1DA3D58F101E34205A9871C9DCE6D486C +FD8A3764D1BDAA95C2788192C956F3514D28F001DEBF20A7802AFC168C1D3F83 +B5CB66DA709C80CB62E5BDD5094AFBC09AC43A6993CB587D79C1CD2ACA5D3904 +683F7AAEE380181F625CBAC1000028727EDD6D1C96A180539B4DB46A11D55FD1 +9BD5A991EEEB3125C8B022A4CBD34D6AEC5F4582731651D4A1C593EE4DC547C1 +9FCA888C406D3C6FEA0C398D91C8D6B56AB56737158C47A90D5B8311178D3170 +4C00D98282FB34C636633DED7A3D8566D647F2B3EE3C095CB0239B48C4A1C1F3 +BBE15C21A63A9E779738FFF6AE49081703B5716939C90AB9EB4E1696444CD60A +4EFB17AD7FCB2610A9E3F903CCF938CEBBAD41DC25590B35F50A2CBEBA8FBEFC +109DA0559B474A79A5DB4209D63D727EDCA5EA257143F90212E7D57BC1CF6EF1 +D1A1954A4F919209447477DA90F87FC1DFB199C117A434BCEC1BA10653A2C9B5 +9599AC25838540B3BBBEDFB597206DBC2A894D077F095C073733C805E045AAAD +9442ACC465300DB1BF50C14F31F80769EEEB8EF1AC8FA42E123B7F98BE4D721F +21AD4A9DAD63D515AF0EE749497EC58E45683BBBA63D7D06B717D9AD0A593B45 +6948F70A99A42B8A6F2B5CC578389A7D971B21C48571BCFFB16061A43215491A +66BE45983EBE2E37BCDC7DCCC507470FB01711105EBF9578664D855434DBE98E +0BAD017F64684E21FC3209CA6A02EA74E6FD7B3710CC09AC0C213E3226C0ADA2 +8EC7F6A960D7D75235A3B6CE240AD4101855F00748363F98A6DEC3D785F99377 +827EC9B43B5B7FDADDDED1C469812A5291F00705AC26BE98C5E9EF813C6E1438 +FEECAAD277718900E4F5A4B8CDE0BFBA1E0AF5E324CA9B4D9C06A2900B7E3029 +9A19D23E58BDEE72438CD10AACF155FFD0BA3A91E18B9FB23585B76A6D4D9873 +3CA358901612B5D7670B1B2B8911BE871853588247A647FB91C3E86A6F642EC4 +528A7A3C63D6C9C59B46A22340A887E9EA8754F3771797BED0A2D2ABC7E87886 +FD5D1850FC4C525A5CB4354C5F600F3DA2015A35A77841A8009796C88197D9C6 +7F4BC939FE15D1F91DD6A62720E90B7153C4D77A13061F9F6D732E05CAEE7E7E +2EAC05082F0756507E7B6CEF9B559A5CC7EF7AD02C54E5DE6418EBED07FEADDE +F28A240D66F004ADBF2B4C9E158F0FCD9950683ED6210ACFA65F2071E6B72AF8 +92E19D97ABACC701B24E7CDC9D4D8C0D17EB4C64A9DF75B765B1058B485A48B5 +3A92C9B0A1D13800EF704824E61C8D13E64ECEFC2321CC2343A9B59E6C8A0244 +E3C1AB84080AE28A51C7034F3EBF2BF8267E293F61AA10128510CD26C0E54C1E +6C2C7BC8FF2F52AB1A603BE177A6EE39A5D5F77E9CB3F37B46DF0A134F0D47C8 +0B67F71B5AD0B206D3E78AC8146BA70ABC216F4F5CFAF55FE1803E4947297D7A +8949E54FDB2A7246349952A2B585AF440FB9BA30C4A85083E5EA80E134A611E9 +E0275460E58C4680CDACD85D38938AD52D1CCD190D2D87241C91C75802ACE899 +2844DF49F6C532D4BE4C5CA2386BFC77A5C3D49A2D691EFD56C5EB2AA830CB8C +03AF9B30D698BD58C43B20BAC134A895FDC42A0FE5C8CDD1110166A36CDA9874 +4FFA0D573A1414F05CA1EB5551FC456486A72A1B7853496B6F162E6A881368C1 +7C968BDA6B9DAE96801E87FB9D987057E4837E7450ED0C41E1AF1A14109C8F9B +F20152D9E0924BD9723F73E23EE66FB01E2013CC83A25AAF37FF923C089E0F46 +EBAD3B42FE036F94EE078C9CD251A150E28578B2DF64720E7BA84F643CF8E500 +2AEF59F860E7EAD664E614E489E9E1DFD76CCE33702F25F5E6D7BD2734B0EF97 +4B13A1B666CDEEC6B1058D8951D00FFDD44D910D5308135B088E5E2B0B44F684 +82AFB0E87F64251CB664A130D6685DA57DFBAD8EE271002476AA8E0895E283ED +970B130C0ACF264D8314E920BF308A44797572AF9B150352EB261DC86A8BEE7C +92E4C5BE76E66476FBD2BB1B6079D4291F03932E92CE53DC37EC79D946DF12EC +19D5E914C67F883C42BC5FC28FF200DE5A10A3B7308983880A5E5E37C457D515 +58921D0ABB91307DEBFC1C157D834C5F8FDD85589F17E28F99CC42E8AB3A7D2F +0965E88C78AFAD9DBC56B76E85B707321D760580252D175DE28F46E2130EED6F +3101D569B0C2745813D1D8F3C6A30AB77610CD50F5C8574DB097FFBEB2EC53D2 +D4887560B23710BC4BE049749C98CE066079D31AC800091119DE5C45673497AC +1E7BB1DF4867C5098454A98863F196A20C74B8CD778F24AE06E92C08BE0A6A58 +EB7CD34A06CBFE6268A01E8360725534A8DF5F3F1074FC4BAA6BFF579DFD1E5A +3C914F718EF07F4A1EDEF0E9B4B0188CDB3BC478C9202632212542C5CA144F71 +E76BC68F3C110742B61D20307AD2A4A0527A3FD8FCD7819B207B9037FCF53E3F +C81BC00D428CD5A5EEC788BA2C974B550533A30A646FCFAAAAEAAA443B09510E +A9D5FBF1E5DCF14BB0A116C91B4E760DCAD201020F63718AC3A8BE519232CF57 +1D2A077A95A5568D12FE61C78D6C1198D523AB1D604D92D0530434E4A5059F6D +DEBB5AB57D473DBBFB3B1D08E4C1795658DE4D6106A746ABC371D90A6D31B36C +6F950EB16996CA13104C356A77B7652471C811893A359E824BEBF8869EA13989 +3133DBEA5CD1A7447093A4B6500EBD5F434B7736D3BC909E6B51489A79F2D8B4 +6F8863EA0560F02557175460037899DFAF5A93871468F56D341680C0B8D2BD21 +709F35B66B57DE6B1446910F4EF5DDA5DDA3A4EF486354F087449F231326E4CE +6E1019BA41FEB775ACFAB6CFB841FD1EBC0BFAA6BAAC3B72605CD8ED100643D6 +6FBAE3DA56F5B6CE1F66A572B71958FCCFA3D1A312FD8199CF30BF0383EB0802 +2824A093336EED72111148C8F94113DA68C6A267153171B00335B0D7927715D0 +7F372D2F946AB65E1B19CA318F04686891B6E09F0536CF77C24A8C8EF7A5FC05 +61127667715E4CD2A547CD92BBCC219C40F4E6537036BB416783D54CB182380E +87F7E8D7DBD023ABF937085F12C81D92D65F97F70C017FD25E7A218D484D6A1C +B490BE23B603F763C260BF5EE4F9D11879421C14801948F4EB0B613219FFB121 +A477496AA5F5C70025E15B198A54C38E32A3E65B5678944138F4D0FF07970A81 +B23DE2CF7B248E8960EA358A3ECD637F779EC73B614B5AAB0B72ED62B1FD5B7E +45B9C587F327D28B042B31045D641D5B258702019FE50AC6A08A8FA828829CAE +573F6084ADCD362C55D539C5ED40AB1468D037F6756E7C004514A07C4A4205F0 +62324119A96F357702B338446F1E338AFFF143B8CCA5ADBF7BE0A2A66C40FEDA +15DA022E7575D9073E10B9F7A5B1A494FDE2826071EC40BA22AF17275874BE93 +7EEA3FEC5253C04B6060189C710FC7C5E2829F53B1746590B30BEB6C8C81CF15 +688A72C2A05B4D68FFA010A74E23B5B0B28C622B1C8D266100ABD3364AE21CCE +1B3701120B83EAE149792C87D4A074C7F8B4EC81156FB9ED3D0246E2A8A8D418 +24308FFFADDD9D20DA7CCDF56093644F425D8399E8A3A06B571D7C80753F840E +BCEA835E4094AFC6DFDE191E9045A115936F50B97DD73580D3B6FE91E48AF6AD +0F1B8708CFCFC76712BE2079AA6140C830523CE0E58148B36AA7827882AB0ADF +F5734E2AD66088AFFA6ED6A8582BDA670D979F8C23042E07502EB4A8506307E7 +B62510C729590B73804DBD2129D7EB17E2164FED0389E458BA053F5B24983019 +20D09AE5948A159990D9B47FBA323F2DFB7B782FC963AFB083EEF4C01F614ABB +5F588236986323FAF367303458401379CD8AC7F7CAF65816FA4B45F98A875F10 +86581706C369911B1AAFC70B1B1E7D30F71C55C030E5FFF4FA5FFCE97E16A269 +7982CF88E407BCFE450DFB0D0D8270C2B5C91B4523899C637CC86D1542F2DC37 +342D6366195297B4A529F853B5F910902BC907BAE83CD5522F5A0F2E4666EB9A +40083B1AB66C9BFB1DCAB26AF910B174AF933326AB131BC080BAE7B4FA30AB1F +422B0C17648AB95E8188B76977DCB7B2D041847C82347BF6D2F729C9174F1230 +E8612F98D9EE77EF7898A449A7DF889D137D1691AA315E9F6F08046BBBB5937C +529EE7FD23AEFB04603287FC991638FFF960D07BB5FB14F5B56ECD782EF84741 +7AED87F9E4D76F6CC4D01FD39D8AD05757C9B5B1C1775410F9A7BBE4D9438994 +BE02A1C81CE0BCAB1B080ADEA7DEC8EB2A9F5F1F2FCE0EDF006A54A6C1FC70A4 +51D3B2EF67FB6AFC68171CA31AFDB5B30C6D86E4B584B885EBE66344D499185C +7265595A54E3AC090BE89424FC6ED53FA7C30A417AE374E46476169C0EF5A04C +4D87EEADB08CEB3CF5C26B376461F8891BA72FB028B2088B81BA74CE27B2C455 +7DEC6A56DEF3406DD71AD214B9529BC80CD0AA95DEC7A074B785DC2192713A0D +85D6A3017133F5820912523878E2CE0614513137B1D6A0E1CA1B31870AE10F48 +3DFA4E6FBE782AE1E7557D157F4AB92226C4DA3F70AD4EF49D3A19FAF0169B7B +9464EAFFB3270787A6F02E86F8E3B56D00863A00C6C68C2AB375F08DC006FC97 +F060316F3385C66A7389B31DB5D3B7A5C5B73FD1C344ED9F40BEDFD82BAFD0F8 +87F6155F34FDD9BB4E928E5264B8AEF216C7D00EDEEA633E543954BE63A7A3D8 +34468AEF3C79DB66776E4C75A9C61C482B695F6384A7F8E8AC68913BCCA20221 +2A013A388798FD878DB9AB8802504236DC8147443D150D3C85F16E443B860C8C +1D9260BA341471BD866790B288D08A643C3A915AF31CB885B10EED89BE07731D +7936A1FF37B92CE6C953A9A6D2070CB9D1F8B4409E25F0D1289F445F2032D470 +A4DF4FDECA4AFE4656AB302CCE0DE4D9B9D665F56DF443DAC8E5A6F011C77811 +8D6075D72FFB6AD2E63FEFE1B8DF761DA09EF42D73EE725003628833E010CA9F +76D69C341933ABA225A1D448D1B02A24C8EF54917559900C31CF4CF96AA1976C +B75D49A191D647CB4062CD5D6591CF232B1FC7A1792787E97BE5F9F8BA3D4586 +5BB1D8ADFDEBA915CFE0D4585B4C7296B0E0B307DD245F8BC357D3700E187D75 +17C6440BCF624C8751D160BF9D351F49E1283AC4280DB84C36E593AEE0AEC473 +0DAA130274B8771D318283ED32165F26C31CA4602BD138DFA717957AB25423D8 +9D454DE676CC9A16C264CEF9B4038834762014B65AFA9841234FF8D6FB6CA9F2 +F719812D43D78077C82FE60B75CBA75B7C7E664BD116A68C1B92DDDD5ADF497C +0E7DB07E3FBF45298FE4B9C994E55803FB965BFAD4C2BD156D34D79B41A950FB +7DE8B2DEEA4440C93E94C9D3369C7DB4F297555AD10B1A8B003DCCCB94AA5232 +CFD2BBB5C223D8CA488EA15317D8284F97AC5E46144400797544EB86C2F7FB1F +B806596973F2C8FFFD6C26E14C13DCBE138C48DE544CBCDBD16ADCF2E28D5319 +0DC91310740BCC46E657C806A1E3DED637C488384E05615E78C96FD0DDE0F5F0 +170A04AD520E0B9BEC13A133DD976794FD9A63FB22F495BBA2DCC7BD11FC8D65 +8A1D80B2CF25666D444FD09DD1650B542D894DB7547A03BB60A9F1C673073A0D +789A66A3B41678579F42B2421878DDE27D4873D4FEC825685E90BBC6E9631A4B +A5F6149B7C16962139338DF54857B590E9A39926B11D0DCEA8388E7336AF455C +F5C39AB40504792DA3193B21BC793A63870CB7F6BAB8D0D51FF8125FD2BC72DE +A210AAD804AFB1D41B2E8ECF2936E74C53532775F21EDA729AA902B3C8B2ACDE +0578353AF3E9177C7906041C9360740841E64440F5815BD40FB1C41DFDF515CD +D47837C9654689CD118714FD6D8E4CF21A02B01AC9AEBDC75341741DC5ED3C73 +1DD0EAFF35BABBCE1CF9C207C1DC79F47EFDF0EC07D6E85D7ACE2FA8F5AAE916 +C80B1010086AC1E91B957A6A61D91113C98F95BCFCECB3255DC548A03C37612D +F9F47139A49B7236758A419D57E42694B0BDFDBB42EAF30E7F49421FB9563F72 +7036DB2C85AC91A83C37CD2EDE94B3EA82C45BFDC7E1696C76D15EF10141BBEB +363C098591B35024AC9D304B348D028F573ADB949327370A0F6EE2B8C9EA50A9 +9BDD725A81BB626CC124E522E9D164E10671A93BC36DFBE6025C34783106052F +142845026D6B18BEF2011E0BD47D03417EBD88F1D31FD36C61781735B5A1EAA5 +8C8E13BB206A6DE4584EDC53D0CEF8B91B59698106B9535D62BD88D80ECC85B6 +1F1CAC049843A88150359315F12D9940FC65DB61D8DBF588C707749E8823A53D +E19F6C060759BEE9A19A7536599754FB587751047B3723001349EE3A23851B68 +C8F5933E766D5CEFC618C0E551069A00BBEF52DFC94A3E5F0E5391FCB97A21AD +CF73E4EDDCF179730BFD8429DA97711A2A0B3853946026E6E8FD8F61C735946A +25E44B958697B722B52F4DD3BCA1358E2AC87A81840F05D76AD90DFF2756E7B8 +79DD5D43F0CBB873F11A9B753EA79F44F62BCBDEE84CFE171AFAE64C236CFA05 +521638B4F8CB880491BBC67B7C84268106D74DEB6A1BD035D9E4359C9417C14B +6EEE4AEBF574172122ECA13C800E178B7045C2D0B1BC92C07A5351C15C50BBDB +E7703FE1BE7E668BC059F62533786F36820D2EC57668C53B7DABFFF06BFCF199 +268B68430F3FF275EC74EF46F991B3EBF9FEF1B86659F81809DAD9F0C00718E3 +7DF1DA8521316FB2333305D58BF90854C5A9AAADF7BBACAF0CDB9B687CBCDDAF +30ED6E7778E4922B9766C461CF3D336B629980C3BD2CBCD246C0B21D0AFEAB5C +B44885D1F82796B6B064715FA3FC41BE38D338ABD15B7C627FC2D067F96151FC +8AF9EE0CFC15F16F4C8B6427926F17E612C2225274248B7B0809E1B08380FA9B +DCADCD2D1B26D1BF6FEDCB13C54489ED3558ABBC9ADC7A6610C411AAAFA94367 +7452F9260211EF5CF2DDCADB27DC0BA52C4EE8E6F5D98CD6B495755A4B52FB65 +67366EB69F16A3530371944BBFA0C82AB9459D718D08F50C60DDDF5DCFA64B1D +71DCCD8AA01FFB9387DD26DEFD30D97D5F9EE03F5DA165DBDB0D2052054DFD60 +DB8AD8A389940BA24F7F44C0307A9A446E3D53FB99A6E51A18B4700DF8F79D96 +1F3996630D3161EE5D119B6C0EBB57A1ED333DC8F18E35E5A715AC887257D37E +EC3BF6DFE165B62401C3BCF3752386166372061F6CDF94689070432C283C2277 +A5652AAFDC83461E0B5960997AB5B7E8F6CEB6BA0E2D9AAD4506ABE0E7CB5379 +77CBB9113727093B1160DA55CB2E6F2727414E53D8F7F66F45F1B7191AE7113F +FA7E11A2D144F27D3681258866A2B8F9C0BC12782CCC83AD847D5976FA7D4468 +78E55ED04B32B63B2324BEE7251FBC9C93223EFADB8946A267486F9863CAE636 +C602E5485628158238D5F6ED59D996E41A563B5641CBA250BAFADF44B4959C03 +838775AFB5CA6755A3C7DC78F1CB1154E63BA7370C4E0279CCED6D2E34695243 +6460A4F88C11842FF7B4BBD73711F2FD06888A02C0C5759C581DE1716C80DD56 +5C2B0223A20C56196D67F7A6D7B5F711743AA31B3D8B1CAFC649E1A3E227E32F +8A7716BB8E919A4F14F2630FBB1662767A1348055E48050DA6547F2B45FCC664 +8771E58CBD281DD1070E045FA81DE783F831C50ADDC4FE239FE4FCB231BE3F4E +2B6B75C719C88E69F8B3B38D25EA42F2B6A71B03FFB204076DEE53EB22812C36 +62A077A6097FF9687732C4B69F686406283AB883A2FDF4C5FE70A5472359E372 +DF28BB7DB8DA88E2399EB61FFEB037E484264561BB7A905DFDD110C5B110FE4A +2FD2FF3A1E3E1FF6CDA888F2B27522FC367999D7DAD58A29DF8EB796F15487B5 +11FBF4A8F7F6C9905C1F4E5E18C9729EF6C6028D5AE027CA67C1DCAA4CCDBE44 +A7D74CA0F6ABEE0BAA08C4A5A3C35FB3CE59EAD3480307132D25522518FC2331 +A46F67B236C4F51C9852562BBABE2705AB619C4D4F52675459F184FDD59AFE95 +30B97EEE211D690643BE8126130F3FF6EAD41FD9B760139FAD1BFB429C8BCD66 +0D504B64A7C502E476FD6237A1BD7CBC187AC7A30CB39614573B795F1EC2AB5B +47953B145DA8FB5990A80B515B4F9BFD32349F8F882E9BFEC8A321E3830A6379 +7595631C3E2E9B6711374532A8708CB0B554648DE5128FDB4D85445661AC950B +ACE8D7EC9CC3D5C756EF7890041957B2F625075DCD762A04442C0C5EB983B820 +22E64D66C3974D031D6789096E7A7A0D2D2A43FD1ADD8BDC80F9D1B381D67E3B +28B421336DD8812030E13FE79CEA71A9195BBC10EA5BCF2A446099ADF23C4310 +A7C0E296A311ABABE65AB2AF49BCAEABFA09CFDFC6C7B001B9CCAF252D6F76D8 +08DE4E08DD78DEA1FC92A5039BED5FEC5C276A1130EA569341765CC3EA94A4B0 +442244D7DFAA37B2DAEB640A4F014015CF54EA13CFD931517E3CBE786A6C4559 +182EA384C2113DE85A3EBF2B9B4E8356AEFB12FC9CDC11615CBAC7258A3D21C9 +F26CC170C3A3E774273032848D24267D0E7699445061B05BD5BBA4EBE4FC22F1 +9F0279CF940C39ABB756CEE674528B1E78D514C6D319F88B02152A425D4D2062 +7E798DDEA2149EB6D4F35D435C3777F9C6257D2A82930F540B119C7C3D0807AB +E383C37AA4E09F708DF1FDFE2CC8A3BCCE624A0E0DFE6F7A8D76CE50CDEBBB1C +6B61F75DBD9E52B8209495D00B7C01568F13AF0B5D812DEF37FF9896F83D7643 +A6A84920820A22BDCDBD9D5CB31A57C2BB67222ED05E71F061D79BF09A2651D8 +FA6ABE2FBB465F4310F1BF1BC5856984F5857398B636D1144F75202A4F9C4022 +0DFE3F18FD6043C381EA81B70DAFE2B776E88FAC1D482775AA6B452B81F5B396 +21A97D7214B5C1A766B62988330ED4CDFCDCAD8CC165CAD046278163046BF696 +BE49C3AFD83A0D6850CBC9FF1751D90433C03F373B89C31A0137EC9428A9C744 +72CE4653AB8B1CD3EC345C90879BCBB7C89B25AFE08A9FD880B78C9F6FD42186 +6103F6FCCC9E0FEFF506D56B5A98AC79F69DD7D60BDE46D29956E47396C7A15A +76887359539D654B899B6C0FC8ED736C5DE7199AC10FDD15B4FECE94E4CFB473 +0422A29427D252C11ADD2778C3777254F58EC33BB24C82F559287F92083CF708 +38A9CCED1E5EAACADA0B4CF23D83F1B257DFBA2F83883496BC1D8766A4FEFD11 +A320AD84F04C029DA40E51DB8E0F82EE343EF7383B29786B90680FA8A108A94F +E1CA201327F0E17C392C706CFB7515873582A090F93C9BA2BE6774B810FECD10 +01CDBFABEA808363A1374672AEDECAE03C783F7E2C85299E40F4B76AB7BF41CD +B01EC583140F30817B5C9B4D22EA6D4233E7EA1AD32629BBC513F79E85A0EBB2 +1AC59E7BAF8EC2FCA88318C1DD72B1E1D899354DBD8AF5C39EF980CAB38141EC +56C01860B90DCED2175947096C6D5AD7B56F4A5D0CF8569CCC1E0EAA454D696F +1652453ADDD38ADC336F2BA06523BF8DE4BC77969135CFC485313118989B90BF +B00E6A34AB57C871767EB52A9B970CD5D70D26164B6617F4D19C5C3DF977989C +687CA9F67509CB0E261E9A8D18FD6F0D7C061212B8BD3CD876CFEFC50BC6569D +5ED1FB4C56B4E0D3B2CC1117A90DB01802D36929E28F84C19ED6C83E65A0782B +F5EB4A9F9AB020A1FAA6B7BA6CBBE0C071BB1FB61B2F9113042C5A8E2E131FA2 +5677554EC8EA45604BF7464C5137EE17634E8434020D90CB88B94A76A100077A +21E031DFF68439EAB3381D1436E31452CD4D2E69914FD2E82E6D9AF2FBEF031B +53AF448C21559598865550488FF2EE2F88E3027F6D1840D52497EBF96AFA6691 +64F0671E2E29C6EFB745ACDBE97709FD452FA6B2BA43E1B21320862B5019F8A9 +52B68BDCD53B35BDA09F1FC4C480CFA3B92719E360BF124D9A9E728BB8D4AD56 +3D1CBF8EA793F509CF59585D2443DD46F15B8C86BA6438272ACA57274895771D +637365F5FB3361631F68CDE33A8E8B5E7FF3CAFAD3344FE57FB79115E2E67678 +B1ABFF4CCFB3540B6F7AD4189088EE0471DE1207E97945B4B74350A71852C0C8 +2EE1BA9E58C467B3234985794B04C91F6A857D5DE23F7B71CAFC182C7153EF1F +E353F897E22851A621E1D60FB5BA7FB0FCFFD4032F714F30B69609C9FB9B1032 +CE7F88EA8C488D55F9ABD713B603273830D45026A5A4D6E8E235E6772B43DC75 +59BA22ADC7382A89D5EC83D516B6B067DC0321FE435AD294787DC7A736CAE106 +FE2DB1162B182B1C9AEBA01BDF7A13934F796F7D5962D53C90084E5C5B0F54B1 +C50BEC8A2B11841E08B0B3E4F57ED0227298F2FC5F7553B0F3D522A1FD5DB5AD +261D7E37FA8AF178BB9F57531D728D266335807E68D6D7BA036804F0CF9D6EF7 +E024A3E3E2CA30911E6F37352A381EBDE15276CC52A168FE21AC6F8078CD9E80 +0E4212AC2AB968B339C7C55BD52AB03A3D0A65A10652149B4B56687105F6B51B +886A944C181310A86C7B824508A4614DA7EED2E942AFCA91C8685D9EFE369883 +021C308CE882836A5CD0A87C8F255ACC770B815F79EEF626A12618EA3AB0BF52 +AA35B2EF24789BDE3C8EF3E282882F3B7256CC2366A131AA8578FD14B369E5AF +B6C94E61BCB7FEEE9AFB30FCFCC9BF85B0444056614F18F99E4D456E50B977BE +E3D9996B9E817010678D3B6F733C4B3C48DB1E6475FA6E0E5C8D6A37517A1F56 +93819C842B090BE09DE6BC7E5D8BD3351DAB8469A27D9F5DFC4227EB534E8750 +695FBBFE39024507D5B7CFF063435E3EBEA0702CFEB563B3130AC0810A3BA1AB +4597EC9A2487D8EF0FC7827474ED4ACCDE5F680CFD17651A21E3EDC15E9FB31A +F9DC51FEB169A884F15732C1BF3948E8B96CC55563AADA8B3606B17218D86349 +470CC300E618135C404A8EEB551A10571A922B920945CCCF0F315D1A75F8C4EE +1A0641A8915BFBCA53162BB40F6AD8E8FFE411E2FBE104EE488385551FB16217 +D7784722697D0891B966CB4019037D0F96A1F57EC50C4B27437BB8763A79A7B8 +F1F01F5F4BCC48F7F642C6EF1CA4AFF92EB674CF99222EA58FE888B737ABF9F9 +2D87CDB282F6A5E8C02DCA4D76A2913CE31272387E21EBDEF0D9E2F24C79A7E3 +EED0A7FBA3A8BBD9B525ADE096B4903D120144B333F0D702E0B166D433E30EE3 +D3B0659FB70A2538DF137545C312665AC28FC49DCE75DF71FA1FCA37C6D0E879 +264C6B9D2B218859507A648A9FE83A8785079FD581CCE122B918DCC74A3A33DD +24589EE13017DC330385064B09E2C9B6E4A0E9D76A2ED29B68A547ED185D23E6 +730A46A85F80674E1F804216C1EFB747B7E9B8703CEB50C0206E0145969EF2CA +22F2604DC3FA86B795FDBEC57D4772AE030923BBDFCEFAC1A516E5CB058DB83A +BF6919BEBBB9B309E5E6263D6837FF36FAADD560BD7F2429CB4A5726923A683C +DECA1F3583E08C77AA81FB8D8623187596489A8894E0A7D562911DD7AB819260 +CDE2C4EA96901F92B2BE7ED14947B9D2A949C547B8A5CF52D9D15C930DDB4E3C +5E3B274198C2C80DD92CF75C28C74CEC39EE946A6047F6C056AB6E029A6E9654 +4A3E162AA204BCAD3B221288ED33DE3DA6095E85675A8105F5CC88CCEF4C85D8 +45F829A7EAF58B6B5D3DFA9FD708B82101C19895ADCD390B6C3723E8B3C42196 +F4AA43A125A1FCAFF10621AD0056B096C21C53D5C9B29D359A568F66C1F65A42 +7B76218410C0D4D47F64B3F625519D5443CAF0ACBCF6E45B59E9D7C4C6DF3545 +6D01216FFC11EACCA0FB29DC997CBA1E6B4408AB95CC3340C7BCAB683B7E62A8 +80D5FEC00070DB68043F8B95CFE064F09E62A2BC0C99138A5069E27C70F7FEF0 +DF3B98DE67070E05C0E3680DC1BFA10025DAF449B5E2FEE824B277DEB9489E63 +C27D82358933C1B103EB95AC38EA9F52F3D437C59DB47AA465DAC7EC07F731E0 +7F72C3868CD58DB46FB7839DE77F8B00B5ED53322DD03CFB2303C2CC1B26C78B +B6F7624596B92939E8D6717F6C75139FCE87D549D311B8EE9A63EEB766D68A26 +689DD5EDBF8A9B8695EA4226437620AF7ABC90A5E19A1BCF9CE1B38F99CC6626 +651ED6388A1CAACD4CF505131B97B27F32F68E2F83882108598140218BE26381 +8C32D7FD29852913C5BFE5C65C0EAD586D801B0E5BBC6310FC50A92E18151EEC +FDDC28F39FD1A323A3B5EB5DC12D263DD1D7D8B9A69B5CC156B041CA460D4055 +6B2F44057BECED5CF64C9DD3E5AF2B13053841C9FF55E28E21EE767EED5E16E9 +A033C6442737BD02C0BFC4E2137951ECD3C21F6CFFE5394D37DB260D5EA02F0F +FE200F25E652110134711CB66547C6E3DEA4684233B3369CB975761CB81F91BF +F6F1E4808276641AEF2F9D0577E8A6D4DE2AA8BD547A0EEF761E2C62DE6EE39D +76CB24479232B1DCD7219BA499225B533791BF358610ED296656A3F95A44D564 +DAE42762CA32419A67501BCAAEB2360BE431E835A00CB7BF1B6E58CE1F6FE01D +191A9117CFDD9AC1ABA5B616FA4CFF94EEBE9F84BC4338F66F86FC04EFC73548 +1F6D884F7A8837011A13127F58AB3F47F7C301F872550F558B462205726683AA +B9AC359D635C6B7733DDB204D23AF4279CE7F5DC8BBB352B4B2F50E9721DC89C +EE6CE994935C74AB296589C3C47F624972B7D92E0D1FFB7F5A30FD52E1B15126 +86D1595E064FACF2BCD55A5391F9AB38C3913B008491D7003782F95668735AB7 +56EFA837275E42856380E3F5B9F29C1F3C2EA94440A8C5399771065EB26DD940 +12C34F5DFE5AA595249CD08EC2B9C2E387DAECDF0E7878B9888D7630DCED1C9F +D341C61C57B47C12CC7DFBC5AD8F2FE583A2378B0E111CFAB1891794FE65E2E2 +3CD1F5DC0A2D57F2B6E4F88B9298234756748DEB13AC2163147EDBFB9D44C614 +9606533420CC766AE517630E0B7BCF01F2B5A092CE86F3B0E69614C2E3867B9A +99E05A128EF55B171C869616A1B4AA03D7EC61BF69D36ECE84BE11D888FEE73E +C91C03CE9A752EE81E21E73E849931FE57D0AC6180D9884E5BBA81EA20B9C879 +31AC7E8B3B26A27D510E69512B9CCCAB31F41ABFA92CBC9972AA3B8612CD5440 +AD0C1FDAB86391E2358F209D7D6EB419D18BBF8EBBF13C7838B40625FB5461B6 +4AC315A975E6687D68504B1CEB3C507CD015A25689614B379F7EECCCB5EA7978 +DA58CE5562A85E0E5FF07FDA3E08088A8A0C8285E8B30A95FE7ED9C5C80B23C0 +F696683A43ADA8F6D1AE93AD9E95E05AA639EA487E19D2BC1377F611FCF62647 +E21F511B70CB659A0B120F64F98CB091B751A55376A60E34041011E5DE6C8ECE +D124DCB9FA45029064DE7CA36F8CCE8FB149A220A29083CE2F7F56A665940958 +1B1384039664D4B1E3EC177CFC6DB6A98E162D89FEA3CE1C35803C4CB7593756 +CCAFFC04F2F41743D684EEFD4DB4B9B2E9C8DA8BD3EE4539405F2B1B2BC5AEEC +F6B303C32892CDAD9E9F7B2B00175F9B45133D3317D87922D268C3CED1CD1C51 +FF4604002D6AEBC8E4784BD4E87979C9C5964962D6AF054DBE2B00FD08419C16 +9F3D7B2C70723BC7B0B5273AAFE83C2D0B1B96D7F0617FEACC78A584DFA8D253 +D71029C6884E70033922D3E2B2DD27231A0B9A9FC83A0D75349FDE08D60B9F6B +76F0BE5614C22C5A3810DD19A8AF131DF61C98D739220243D6136A56B6ED09E1 +49C0CD780134E118D88C5AE22CD15128E00E5E47C27CFCD1E8201AE916F4881D +EA3D220AC1798A571B4BE179A5BBB474508A1BF6C7415C6465602FF73FA78214 +D20E6F79BDB768C2F0AADB39088359DE6A5412885C21837E7B97A20BFCA2364A +1FFCBBFD3FF10936C80448A2E8343247E552A5F082A5B2E44F72DCB3D0074D48 +BAE6C21FF654953B9E0A33AB9B33259044BDE76643833BE8588F50130087356B +19EACBA029A1ACD80CD0DAB61094A8BDCE989D7B6BE57A58698079245DB6857C +ABFFDE2F20116A134E2BFBFCD1A4790FA4B723142BB0745C755CFA493C33EF54 +60EACDC2AA25704B648E7A4D03127D49C68F79A3A6E74294CD7BF78C4003209C +CED18AA524478D46D6286061E69975212175230477A59A6342A684A5955EA108 +98C38DB86533C293B419E2D7E5C4E15DC47BA14478ADF01D466DB7CF41E34196 +4A64 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049033t.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049033t.pfa new file mode 100644 index 0000000000..1c7e20513a --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049033t.pfa @@ -0,0 +1,1735 @@ +%!PS-AdobeFont-1.0: LuxiSerif-Oblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Oblique) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Regular) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -30 def +/UnderlineThickness 60 def +end readonly def +/FontName /LuxiSerif-Oblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-207 -211 1088 993} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078993 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E5A3EA27312D552EF3BA +D64EAC97A2E691AD6D6E5E444CB2AB74100E0BBCD168621F404A2C17DAE2055C +D93986BA853006BC4334F74072DB02FF011FB0F56FA0837770F4DCE07D798EDE +1F4B52091BA76C81A45FBE15DB5A0D68D7A79A8DEA9E4CDC55A047442208C135 +341BDA8FC13603A79D99D9727F1E4DE02E48C52B5CE6F5562616B4BC9B244567 +46D53ED8EFAFD8C44F4FA1999EFB90044F1C32BC1F17875428F1B9282238D5E5 +F13485FC0BB836C0B07591955B070B64DE596BDBA674A31380AAD2387FDA4077 +F0C99DB67BC7E0D2F4A214F0297085D898A0B1B8F87EA37A22039BAA041A168F +9A09FBDEF76C808DAB506A14BE209ECEDD52561A881096E9005665CD1F34B5A8 +CAA535FC82F7C2643B07D7A4DDA492AF2B82FF073FC79FCE68FE8BCA2C899AE9 +FD64352D010C7CEC4853C29EE8E9E1CFA01A58A75D91F09D51BE3D56BA37E8EB +161BB620977C99673D3CD1D0B268F9CE2D8E5B0F95A8091634DE5B63E112F25A +2D794D375AD81A716DFDDAAC5B40E5E127191A098317223EEE90186101A453B8 +4D60C9C1E5FEA43CBCCFA33DBD3AF962D9E9B6963667C49BD729B73F333BE4BB +5009B89754383FAFEFBD007839B81AFCAE0661A3237B01B83ED6DF684272E95B +A01B989947AFEFDD0DCD5E6A67D331EC60BE9B77C6C0586B6C57113D304AF5A5 +07C5766D0B19C4061E59A3EF4041F8E9CA4EFFDE2F48653B5EDBA25DC74FBAC4 +D6736D66890497C37B4DFB51CB2D7B6CDCD1D691548209BF599E149BCA092B1D +2E8D1203CB0851C714FCD6777BCEBB26318D5C5E2E439C5CB17A93EDC9E48E10 +92166DCA43650ACBA389D3A55D38ED21951504CBD551FC7EAF5D3A8BFD48FFAF +DB31CA6E7D0E1DDBA18569A6900A20A11A9B4B8B3383900B369A4A1C9859F828 +DC8BBC1BB653F92C1C78D24EB7D3CB97D6F1D5B63E099E68D065A9ABB7228B1D +B6D17A5C3FC4255972A26B54AF5E9973BAC93A9F5E84220CA34E3C531D23DB43 +50001FC2BF3F62049435BBF3AC2FF0EA43B63EEC52D3AE060018CB3331882A9F +6B05A69332C5DA24457DF7F2AFBA0FC7E512A28BF6C638FACBFFD54B90CF0768 +E5F2180D31C651B7F58EB26B484955D1156CD7F37BF812224950615DA203E923 +E07250619C784672066E8B36423A83E2BD4970F894AF6F52B2F0A6AA1A85137E +056051067F2979EDA3EABF13255A3CE018FB7EDC0D3C7458FA67E63AB44F0E7A +770E2D2A8309285D6B04701A53F44503AE64B9D572560E12B102ABFD762F3988 +AC2B39737A18F9A52A0BD10BE37CF64F5198600DB70B31F6A9DA9FD6B2AE82F0 +C745B5AFD6C2F650D5273516C4130052964AF5349D562BE851E4B604F60789A9 +C673EB95E8873A695BD37549F0C6F1CD390F5DBCD938320A0CBBC22A3CDE08A4 +F8D15B484B34DF6971A54B8F7FB1CF485EE80B16412EEAA55632C6148404D293 +2B574F96BC9405DA846B02C1EF69797A0ACC13E42BAA953827E28F17D57CE611 +683565E3627DC24E3B67D80E2C740E5941431F816F60249DBDE5755BC004157F +7ADBBA7F7ACF01B405A87382189BF6540E6B53E52F772A05B23462D1E6B11F1D +8462B8474CE66638DFA39DDC6BB35E06463312D4858418A49C71EDD693348F23 +E3B6C4BAAE2D228D1B45290A316721673C256B03378E998594847503606EE7C1 +5276590ABC466729F36F907A0B37B5F1BC381A115A65DC2B2C5B8439F85901B1 +BBD6EF263820E813F9E4BD65E9A29FFDD9178D22EA74552E22DE6362E465D698 +3795D8FD2487B2A624D5C535063F1B2BB3DEE07E7BA4A5936BB0DFA4377BA2F1 +FE555D347799403EFE551EFF30BE7468A471E902433EFBF02E4784B583B1C255 +BA90095E37CAEA6CBD0BAD59E3B9A14120190846B8AC02B9A6442B78E68BBC0B +94F8E33387523D672BD366106A4BB62B1CF022364D011CF340BF08021FC70AE1 +D2B4714002FAD60CB843898B731FD401D41C25AC996A864B4848C0DAFFFC7383 +95EA07BCC6A7BD093D1ADB6E3D220AFF5669883F5C01B2820C82E07411488E7F +66CB3CC2F58D0F867D9370FC82B6D231B37E5E6FF413669ADADF2264586D9E25 +AF180F49B79416618FECFA641018806471B0145DA023FFB1FC61A51D03B86C5E +4EBEB9F7F5D5182C3075474B9CCE399CA11C9FA17EE469FE0481C253253FC03F +A4562033ADBC19505B863A444C23F07B048A3DD044E8CD9F0BD77C9459D61FA8 +1AFD906843077AC6F878B099F776C0A4BB5460B3D1F81DC3871F3BD4C8379B08 +8309F47A42D923C153F7581EEC85AB756075CB465CC8F8301AC6D00764992DE9 +E0BF8A4D9C6B4B0EA012216797543DED1CC8AD8D89B277E586B1763F9004583D +CF1EE2BBA82FF768EFD891834C0CED284F56580A4BBE440839A53F8636B1C99D +89D65CEA7FCFFB44F9CAC913A52C81728800031F240A502B588F487AAE219D97 +CED1BCD34096FA682B335FF362F87FA6D8A307CB9D796F1700CDFA3D21C5BB66 +FA221D737EAAD02208240E4B882CE67D19AE089380B0FEDAC4F97E7ED7629A20 +C7F8688BE4D5C0AF3326A66C1403E968E8963F4DDE599143D8C57CCF85B7887E +980D75A2DD2B7AA28202635645D768C7121AC6D6FA7A6DDB06BE3AB1624D36C6 +C0F31E3B9BFED8691709D747DC2550915DE2A2486B7E74DD1665F350D2FFAA8E +81E8671F67776964ED20C46E2FCD2CF7B3E0B559FD8C9A24C39611E930D0EB7F +B28FAA043903F3E4A0E3C1856CF7EDFDA670FA030C2A78A99F4FC80207E17A20 +63C316F77D88676C3FB96B680B1A27180087FAA1FB5CBED05EC3BA0CC5566CBF +496545871367621CC713131BD73F6C37064EF652DB3CF175AE9636ADFFF84259 +25A185AD1F4582845C8D4B095B4F7628F1D44C79FDD16E20638698C2D3AE2797 +04723053FD9ED7D54F2A64C09CA1FC60D3410E42196E42BB914E4C4A04C39599 +51BB33559A9EDDE6FD37E9876659831E92E1FC5FB389E5C89A0D59F792AC9D51 +2A27FD50F713B97D32D83A216241DA10B43928565CFA592C54A4288118B6989C +8BC97A4A1E3C8EF78B1E17C18B4D36F48067C9746CE3109914324B9FFAB62B27 +603ECA751FE7AABFC5E38DE09BDE9E575EA00E8726C3918DB505D2264A510EFD +117D3F834DCD09796193CC5D6911FC7BA69DBC8350468534353B20E8EBC077F0 +9CA9090C11E7FB960DF3596125E52411C38A7E5C36F88313F84FEA1916C5FCC9 +BD772A1B9DDD67BD21B117F9F2F00FB7B1EBA1B5DF9CD89CD46E0BFA65199E62 +FB5C7F1557C60A36D87898E8C2BCDEEF99040B45585C0ACAD8E573901AAD634D +D2F69B4CB22412EDA3C74D5D6098E8BAA1D25A1B78D07FB93A58F84EAB79ADDE +E84D39DAA5C0E94FE8951AD145AF05E9A2A4432B7BB6E853FE441EAD4DECD57D +D8E96957622DBF00DF38825C428ADEE495F1CCB5B25F08CCA276DCB042A63CC8 +D610CF464BB435CF4716ABB81A7166EA48CD9855BAD9046C898390441B7435D2 +FFC98669E81324854E750F49F64FD19D69A10A92328F2A4B11DBC02EB1F7CC46 +54FD66F66A32B02C57488F8BB468D73DAB1B3982DF8405BA4F1CEA9C76D10F54 +F5481A0C3DECCF250DF79F6B614B3E7CDC0571E95FC4478A20CDB3E4D4B83ECD +3C747CE9D175AF8F8E0E435A7D5C498BBD387D9041DBBA0EB62A5035838D7E45 +4B0717C5CC75BEF851558280983D72DEE80A0EC3F685A2467C6D22F4E33C4D6A +494589594DB320011E40993D0942E3D26B507E61BFA17A3FE55157225468E2BC +6C63EF000588FF08D4E0F8D244152FC03B35FA6C5F6BAEC28D34F3FDFDBDFB8F +90DAE0DFD3D284A3E859AA4F79091E373D27C04A82819A2E91AF7736AA070F56 +2429F1077B9F32E7F1700AF99146863A82481D0E78729E9EAEA3C2FFDED364BA +D88A837491D5A6428294F60C608A3483A2BFA25FE5E0FEA30E984C46E25D98B0 +28B708C01494CF33D00C0174E18E52F9B2EA7F921827505A980BCCDD191E1B8C +D6BEDFA50F653B88CB0144871B2AE58835B15F7CE53F731CCBDD056672574ED0 +7BEF33FAC905EBCD9D47B82F749B30D14CED4D0907DCF3DFCF0185BA1CBE722C +49D7186BF7981DFCE6B2679E177569941FCD563FC3B9B75610847279C1A01341 +AD3C35B4752799789DFC7D2A1F5F0DFAF89C498DE1A771DFCBE9816971C5313B +5AA89B10C8C4094049570C394A837B031BE0A8AED0A74123CCBBCE2DE1671841 +397237C7827A5BC42574E2AD0605F84B77261DD7DEF10EDE93BA9D61FF8174BD +3BA0A966728BBBAA807DABFC3108209752FCEAD24BEBC8B22603C9E7B158E86E +8873BB01E6D25A09F5FDFBB6EDD3FAF6C672461644BF76ADFDE82DE718BF11F9 +A75433926E4B37556EF4BE8110D82A385C324DAEC3F37D89434C5EC8CA3286F3 +A0819C04DA7E4E48CEFBA97BCFB6005D3B3DF4A8880D3349FB15EB7A614FCAB6 +806ED53B9BA76C02E89D161E8A880ACE8E4201029C62DF57099634EEFE3FC7C5 +A755374ACCBCA10435F24D5F649EC05D4CBF39150A893984A177ECB0D3956D88 +798954C873DFCE8F57D13D6652CC928E9F80B4B6D47C5CF9B17BF89456C7B91F +4717C990911E19C595B52D19C4E5DD70AB3183C4165A4217ABCE21EBF6115E53 +8A1774E1A998893F0668FDF637A05178F5F1CC675CFE42E67D56C3365A762FE6 +DB7B670A60C81104B9237F5BE835B38184D56DEFCA72130240A2C543035B4418 +384ECD8189CD5B7966663EC5B42A83406D06210A37C65D02F7C6CDC3C499C574 +4A4E719EB0F14EAF5786A385D9BA4A04D3B7EDCF1BB35D3243264DE8AEA06AA7 +28DEBC7B95023FE76C18E9CE32FBF3AB800F3F8C9FB5211BDCF93469DF59BDD0 +662345D4D57D9A56BAB5A145DCBCE29521E30DE7C6637A812E64253584D66BD3 +83BBDB9B8A1AC464FB53009D543B74F07B234B4E1D523DAB41EEFCD319465AE1 +BEFF3DC939164B65A06C6F60AFC0126E093166A842B40F8C39693AEAE9BCDAC9 +758B1163F4AEB042E8AE1385672B62B161D83CEDD0889080CE8F76900B82F82D +B84192D470A0C3C80C5E15C1E3ED8FD582825FC18A055C40FAE681E1EC4B16B6 +53A1723815E7D7E8C65553F97D7577859E4E63FD7EA4508825B75FD8FF0F49D8 +03047786DD59110FB7F422C6C625992E86C719F6932ADBA81CBE1C43C63DD43C +50D79466C8AA5166B8C664D8F6E90F1A807E8EF26A1B69DC6314B72F20A390A2 +98599D640CC42ECD583F6405828CA8408EAEBE5997D15BA79060AD9C8E5FFF57 +8B64D12E6AD37373570EDCD19FFD63951EA8BA780A2D01F1B9670BB636088C3C +4B1A8706556D8EB05F15B34A549905C330004A66083B88D6D6D3B538B93F7090 +4719658F96F98FA64F2D8773ED8BA488CDA55ED6D75AD2B8E9AF47AC86FC2FB8 +29CF1A792379143993D9E20240DCA56D3E7EFEA9466B0138175CDF149DBB6872 +565A8D48C7233A6AE4780373014CC5CD045CA08EB63631A50B8C05AA893A6128 +FAAFFAE38FC5C81D9320B116864DAEA14ECBF347953510B494993E459483D0E7 +7699A329D0EF527230463543C583EDD4D5C05CE0E81D1A51723300EA987314B2 +3352F4D19439CB60D500EBDDE5B3A293D4771A4AA137E76DF5688C50A65258EC +DD90D1060DB86A881F858ED21DE81E407FE74E9904E98BF659282B89D9ED0240 +535995B68AEA47B05601AC9BEF4735CF94BD905324CE61374AA17FC0AB3CE14D +23D28C1DDB70E9EB283ECBF96BC601C7B16810C46D996DEE582A41C995208793 +F88378EA764446F9AF8939AF830CC14D62345B40264362CAC8DA7D59953FC1EA +6DDCF2142D534C0D3C3EA587503BDF46F76C459772A60C5CC4716235B0EE1576 +690C4F6E9D1C6825253BDB9CE0C710D1F0BAD5193878AF0D3EE7D51D54C7E0FA +AFC54104158E7D0B6B9F7F83E7371AF8D278D861B91974135818DB29D89F1501 +A00CE9CCCA2662A93B447E9A5EBA74A719C811598CB09AA94CEE7D9EE8880967 +443D806099915D25D63021B4E57F359AC43911D42E07F6E8E3CBEC19B6C0496A +24C383E14E8CC8B664EDA0248B047951DFAF98D8D8F2FB531FC408FC123606ED +86788DBD7D42DA61B976B263685297224FEE5BBD981C5A45194046016A8B26E6 +F54EE7FD496AC4DEFA514BDA54EABDF41F1619C4E533363C5CF5914B25890331 +9A7F821F784004AEE9D10D4B47F75D0531F80AE71097B4DDE3B8BBD360EE2727 +3892959E0C7480895DDFE0A8999E18302F60979F5B2FC794F5AAEE205BE8FDB8 +84684F7B35DD6F88CF8C5AD2B982E6EFACCBBB7A4700A67CE00998252AD0B287 +E20D5AFA935A49B1ED106E71FA16355F1A54D64E0F8D2545D98FD99690C40B96 +1A9162AD79EBB7B613A015EF486FC56F2EEA41FA772EDA87137606EEBDB64E04 +E24856C6E819063B2CE246F7223C6330A36D624A597707D2385F43CC17D529AE +4997634BA6BC9090AB520E2C45EB729612B12F9D3FD91DC4C9EE74CFC552E56C +4D672D1306407D690974E5B3DE86C7EFE946DC7ACA248718FE3B2F699E01CEF2 +B70DCFB81F24AA2A2C220E14006B8D6E09C5101F6724E9D75BA1F465E211B1D5 +177E9F83AAC3F0DF18EB7454E61F76CB700DD59D8ABB42B1AEE8FD5565F85D70 +240B724E6D3C5935D8F42638DC82D9773CA3B78954ED6533F1D0BBAF1BCACBF8 +E0CDF3032CE880780EE8F56AC2182A46A319798C9C60D398BE16E654490428B5 +A480805FD3E59D75A2E154C1016D210D4DD3E11639E9F2AE510694FE5F7D9733 +F594EBB8A17B5A2A2471C571D481E8C04D072511753927376F97F1E3009D3B31 +ABCD1C6DE64D19D471E39E7FABFD7978ECFA08E611A9932EAB8AFC7A4A1AB516 +6315B8363C62D112A9FCE8489156E6164BE073C1FA98E9D55E975B86ACD9CC87 +03542B3B79EACDDC0F525ADF9922868CF31F3D83D1E392ADF522E46D9E71EDF5 +25C3FF53ACCB292A8604CC32E8B3051AC8BBACD05948612D337DED7C027E4EB8 +F5ED77D4966D1A6B32722613F9BE146E5D7A61ACEEC0B8472E95B4E8266DB146 +8B1991DFEC19482C9E1D4058016E0EE9B2545B07CB4810F564B10D0EA86BD066 +41F027E003DEC79F80D11E9452035B4093FDB920B535C18EF20305534855287F +DCECDAD9A1CBCD79CCADBAB8F3B55B0E59001E587A81B5D02EE45FC1672C411E +FBEB21598F9FFCD05C55AAAA281AACA5193DA116B1F46ACB96F728D40476BD89 +542BD47C984849AB998D6DA2AF989EC1BB9A26F4361C610919969F7DA2771B7B +055F44BF8DED74CDD91CA5609918ED52354ABEFF2DA73C1DE643FA90FE4FF2B3 +830743AB648D2A108FF8CBBEEC1DCB62A71490A6D574AB2C36792CC00CE631D1 +984014A7B9508C3FC71CEEDD417F6E31F5BBC6F1FC0AE55155F9D56A1AA196C3 +A696F91CDEA58317BE9E8B37F112E6076C765B1C25F0CC6F671428C91A57C63A +1A69F5931B1875664D489A65698A2BCD637965FA5001F2AAE617BD5AE2DF9B9D +0E230D097AEBEA7551245B5F6B4D98EBB1DD23C6ACBE887FAB49E9F271051F15 +E6EE147FA3B91FCBB5F0D571D69E1C942BAD057F13E4D44B4C3BCDA1A34B4A1B +FC1B3938C1A20FF5F3C2F479FA651F015C4BB08BC019A692462F15CF9DA72D1B +04DB4C99E145218840246E4337700D009123F528AB89469B888C9DFA38E032B2 +7E2256BFB68648EB06197B1DA3F73AE3DBF313A8C661499CC0693C8D3557F0EE +B9479448E1A85B014F1D178C6BE2B625EE25EB51CDC71B9510793AA5D823CF6D +7328E54584076DF26B858C9836077C4A2381F4A6EE19F4E801772C0DBA42508A +3D92EA34CD0921CDD2C56A1D9ACEC3CEB200626FE3CAF033E24800DBD51E6C82 +FA0F7E37F3DA97A83227358C5B20549859645E819C193B303A957229F66896EB +225922A128B1333C3AC8C616D348C1FE225DE03782E6E5719F13DB747D0846E9 +C3C66728C9099069DEF69A4F254188C46177757DEACB597E8CEDE41658FA405D +921E8F71F91F455C0A11B8B517BEE363690C14FBB31232239F5A095CBFC7941A +95815705868B3BE129F81BEE586F90983A28C04543E049BE4A6CB0EDC3EF4929 +D2499DD08DF2A3BCC55CAF2AEB42695A8016A4A1A52D4688AE0C4867363AFA12 +3EED7AF3200320C1EA166FBE2A42BE3157AB633610FAF827666C239F5E6310EF +BBC01419156AB3022DC29B5C64E8F676150AB1A5CB91AE6E9453A60A5A24607D +AC7F2B5790429364E4E6BC6F3731610769EA645101C3329C77CC30D7E7742FA9 +6E47A1F4A95E5B9A9DF448B03C764390C74B6CE38FD8A43E0FD49B19E5508491 +4A47FDA43F186BDECD6D9FD0F1D592FE384F09D4415EA6FB9AAD57F11465E56B +CC7CF0F78A498F3B63985EE28F4E18557DB38101282E3FF5827569B33DE8510D +9ACB69C2D3F13D791A4E095B77A92081D8943E3027F6A8AE7DF75A8946CBCC5D +D397485BF27B974A5708AB8C06AF9B9C695725B49D670891EB0C87A4B650F117 +381EDC200C8172A35F37542F207FEFE29ED8337427230C2B16536FAC2C89B550 +6F714AC7D8870775AB79A072355DE4A5B4D1B4520FF18D626A8BD3F6BEA2A17A +8EA40E7A82494F7C063830B6B81779212BE325569F482C0239E11CAD51B49207 +012F36787400AEED36BC61A6DA3B497E86D4BE1E849E577C89A72EF77A6E252E +153E83DBBBE61BD4AE74D470F8A729E385628C9B60D12A999C345C19348A0F95 +6EE4379A54C267466537316ED4BC409483351B747C91241C1CF777B72491D418 +8BD37616222529F07681FE0F43B3ADA4847A612C7C56B5B32D8011D13A9DC226 +116C53C017F2E54C5D2EAB0047BC9B01A9A414D2EF9F51D9E9861615CFD729B4 +FCADE9B5C9EEC3D84C9F97B2528CDE18C4B461FD56A5327771C977B13E967091 +B8B375C0E7A63D93681104AA2D00161D1A9FC91457DEAB8114A9EA93EF9AC7CD +B292CA7EB423DF2EA9183A267953D4B431A5C532B26B12A4D2D681804DB2A908 +4E15E30372E42740E3E04E044BB9E97252B95A7BEE944E3840A4E9A327ECD640 +38194D75C20F80497DB572929D7B1DE23C5150A242A5D042988C83F39BB55958 +E3BFAEC4582969F5690715B30A44B6CFBF33DF363400A52191EB2BBCC599F2B2 +F4FABAE2BADBA0731D59F1B2E43C97769BFD3B9CD210018080BB38A06DE7A42B +D717CFA65D48118E5FFB29C2DC85E1D3068261EA15CD6F851C4DE7FBE2D6B4C7 +A6EB8752F6B4BF9C5DFB7C3282D56FD0E1036F3D74C2A96B4D308D91C1D83F93 +E59BB92411EE3CFA1169E5C92A94A32CBAEC1B570CC34F14B1810C1144283402 +F6021537D75F7B98DA7459921CAF5DE5323C1C1400C79B1E9BAFE971F7F21268 +4AC50D4D0DEF6E15F2DCB9541C04FE993AF7982AE5F9C4C6CBCA302B76EA1A6F +DFC4D325A8CBF550FFA5D9298B4DC9D016A66FC44D3ACD5F26C980F61AC2A49E +B738EFA01CFA1ACC7F251E87195F70385CC3B19D3D7701CDF9E4CD52FAB6AC67 +C86FEAA4A793FBA499A7601F95F9F934495FE5AF5EC8CCB8F1C061E9733EC0C4 +845364B1F0A232EAF557C293EE11704617B82DB310FB50B152A711EDAA13182F +6AB5B07064C07CCEBCB7ED57669150C74A2E72E95CB979EB18E439D8C2C55C23 +3A66A30F43B2C40B939592405EACE804CF149A667DD795016439668BF538913D +A46FE03F8A45B348EFB1F5A454BD392390225351099E12068DBD8EFC37365FB2 +899734B4D85E0AD8D98F18EDB76389713CE43C0DD27D4E0AD99BD3CED8359325 +CDFFB957B75D05325AF1FE0532260F41AD9C37E5533019AD8ED57A1D7214A0B7 +FE158F9A5DB18CBDB2CEF1829C6DC6CDE3A14D2E7BE72648EE28C088EE03CD66 +EEE9C566F8380473199F069C73C621C8A8FA0A3E606730A2A6E3B0C72C09B0AF +46803CA2D1134E117D38C827AB65BE4F5F8B1E43F1294E07C38924243796B797 +4F27F3124FFEB4609518D629C0FCCDF235363A523C0F6AC3D37BCEB1DCD10231 +6ED57B4137242BBAD3F625CB0D79AF1A46DFD85232CC90F5EAB36E950CC5D7FC +345A443B7F1CCF0028A6759F37F7356EBEC1B1271FA22BB0A72DE74EED1F8E5C +C9A20D9D2115C7FEA8EC01F15FA28A2F4537A3C21EF9A168017327BC03FB37EE +FA1E0ED6BD673F79CC1DC21B88C26550A14AEEEBDDB1E61CCC504157E461E29C +7BDB3D919A2986B5EC8EB2D732B0B4BFF561DAA1E9618CD256E219C4DE36B69F +4B6DFCF81B78F00D14145F21FFE675850CDDB32D499BDFBC1EC0D35787225CD3 +DEDD89FDAEE89501C4E5850F06BD948E95FAA06BFD2556BDB16259D19086598D +DA982F4D7593DC56130F818CB25DD92F2388520E730C8B3ACA4E03A3CF8CF205 +FFCF113E4278F0B5869E37AF3460C9BD1DE520D277AE1A09F85E276D6F16D7DE +C04E12DA6EB6FEE8F9285E888ECA6B408A8EE929ED51F5A7CAF5FF5F87579604 +889BFC328A4E43D308DF7B6F89C059DBDD4458D521A4FFD66E8339D883E1B7D5 +951E32532F60D1B75845DAE58332BDDE7A72A8FAD548E31202130EE23E730ABE +C9007226F3C24AD929158D6A266A045C715B293A3D7E8447CBE6062BFEBD7956 +9088865031AD88B5329D104969A1FAD918F828208B743B650ABA1F345D9D6227 +5E4AF25448CCBB425DAE77E2CB9B73C73E0247C3DBE67F7BC3401433DBE53E08 +561295690C9F93A07D10093DC2AE953174ACA5358B40F3BA9DCF0710C49976A3 +C482B698FA107B25B246789B91473B63B4C9396997BBE4C8A5821E9F6C48598F +41FBEBA01C031E5B3107A5D20839907D62D51F721ABD116A40692084A06818D6 +19470FE3BF24062BA7E62A27841DDC319496790E027DBCD4EB1B87810F936D5A +D33212E5CD654BDF7E245D04A555640DBD89A6A998A6A2377CA8AC615734035E +44ACD5BCBDAF14DD345D8D6B8A34AE91A6AFA2A7FE4B09761A732DB70692691C +774659E2768D84943091417976A6ABE11095605C8269813BB4811F0F47A8F669 +34E3168FA6A02E4DA5335ECFFC0077F7D3D4573BFDE1D22E5FC066AB27579763 +422F27362794478CA59D87E9B4049F7CCBF47854774BE273A6B6F0638F897E92 +741F3144F7BDAC4010929BD605D3C52234F5EAA239A68FA7C52CE2B184538C06 +E0A90BE79DD5FDAD372D95213E30F9C2A999E21F598BDEAF6315F5C3BCDD6044 +92733C0B012F610C25E146CB6F17AA6CBDCA88116E7B551B3B882179441E0568 +852F3E714BAFDE7ABDB93BBA3F1C04E4FFE87D786B38CDE07FC9797AE301F3BC +70013745A652EA5A8DB0265E846BE240D4A456E3B1953553D1D36781FBF11C50 +90C2236FC2CAECBC91C0FC04FC9F3B86BA31684BE56309027044EDAC9997EC57 +247D28A677AEE4B0844EEC683A2227969EF18F52D1E9C926569AFB482CC0C475 +E0217037378CFF3B701A798074AE248751A7DDA18EC1138BEB5E57FFED63B920 +D9BE59FE503DD1EE2909A7FDE826B40A419CB0089C91D6A134EAC709CAC514CD +DA21620C37994A81709C97314C1A09BA6AF7206122BC143310CF7D9CDE96AFFD +ABF6B7400862212ED910F90C9E9B90BA2F7AE0364472576AE09C193D7F327016 +D9C68AF2F55C13FE4AB71C2B4C7D9A9A58AA097B69447DFCD98219A2998BDA74 +00807ADFFF265B30D1A9A2D967856C911A15D89A147016F70099D7AA84E661A3 +64EE3A3E379ACF29DDE519099453FF94441B19405D7C873F6DDCAB0EA55E8271 +ABF2B29FE36B9D3B2461D01DEDDEA93EE39BA85B6424D70A72AA4B05B19B6D42 +D46298C7D23E94A88FACA6D476DC37E379F537B80454A61678262B39B84E0530 +F21082CD5EA2D11623EBB27340297A0311BC422690758E11E6A2D14668C3FED6 +FF932118DCFBB0E4E8B723A2EB58367A96B16B9E3E466F9ABBD458C866CEB4EB +D326D8BBAC28163105F537220F240FFCDB3CC8D35F60AEF379B3679ACF3F86A3 +C0E32746EA9F67C084B2A80866DC1564CD4118E13D0E3842B623191E849EBD64 +8E89ED9377F700D60B0FB5A4248156A1D5E8400C21A2EF623730FE9530382652 +705E3C9228D9963BE6AA380A98574C52EB657B6F2E142AF3F0250FE04EA1E913 +BF95A78EC7A6A68FFFE15FE8128F3EAEFD692A17CA5F779C705FD1896B1C9BE2 +09E8D23F3BE13C3761DCAC7D89679EB558BFE8BF9A03B30D8790B7247E0C094A +A0E14581C633C41987F33D225F9ABE5E1547310A2F2C755CF580485D7328E451 +95D7C240A674262ADFE530034D164B066204358E87699216995BEDF3C437A77A +6D9DEAA3B088DBE3C510FAF44F92D11A9795B81682F992318675B181532BAD48 +7C30BFF33FFC7B0D756EB2FF171DD0FB853178FDB08A48418A8494C4538D8300 +50A48E926152E47B225932AA491D20754B115C867C40930F85ECF5D82F43FD4A +E1FB09A16485AA8DE8481E2344C8BD2EC4C3EE82BDBD4EF12B793B74454BEB72 +10DE166D7941C0AE41D9822B8B1A5BFF31A411A95321D4B3F81922E711C2C594 +7C8D17D535A289F32F573F5435EF81F7A6E15D2A27E6020CA9602DCE96520A5E +91043C649E41950750AC2B991524FE956D3A5AD964D1313C2EA55D4B5355F7D0 +49C8838BBF2C970A150F272805E66AAE44582A5840D7F0E206D82A411E7BFDCD +8C52A9BE758D312192DDC8FF3C4B3900879307282815E4BF9511AA1810509CF7 +14AA4025436A8E20702E2BBE02E0060C875D1B25FA984A3165B00F5CB82962C6 +6D2C2B594AC551828A416536FB02BCD49090FA6C7AB58AD771D02F6895374768 +4FCFE729D2827DF513E1C60E4716CC859E4D87B049ECC8986B68E7E5C0FD1C04 +AF1DA089D0FB03897D48E7D4F2277B8AEAD3A24147D0936C54D487B434C48B19 +E38A0109C9CB131359FB2FE6DBEBDF180CA8C12C2ABCCB46931C662DB2D3DB5C +0CCBDB6F00EC033C9F923DBBAAAC0BBBF4A35ABA8F2D4AE7F868213721F10D51 +42BABD11720505345566C5E2594867DE91E81DE20709BAC6888CF96B4728E2DA +9CB5032F3FA434B95F6E55F484E1570565C0424087D1FE65A7BA94459FDECB20 +02A522FE8ED23D6EBB943F185E966F7F027C183AB1127A0A7EE43A9EFB4A127B +43FCE7527CA6D3C753626DD9D35137B7BEFB4D0C7A0428D6E12512E63BA0B82A +D8E22C7D40477131568FD5B9E01F4C23022190578DF4B596FCAE21A6CAC7D573 +BAF887E02FD103350C0C6483732E94B507718B8A9A378DF180A41EC67BDA506E +4D8FB98046D97A626284261FF30F456D211D5C384A16887706B8C659B2281B9E +AD07F74DC327C12AD6B828AB0CB757A83BD9D135BD0799B5F8969F5E00DBADE8 +5A8D191228CB014330CF17720C5C2B8564BF78F396B9F518F96A92CE80D9D64A +4DE45FA6DB005EC8CAFC6C997E9F3B1688BAE40F0FA54A7F5E9B7AB6664F2E94 +1A653398F4B3E45854D3EF1789E8F769BA3816D5EF896A997FB64E0A8D06365A +ADF839A43899B0FD2411D851E273B4B0BFB5A1174AD6D0CEB05915F1A8229547 +F9220EF578AA6A561D949B48D1B6185F2058F800BBD758317E4D555869BDE73A +A5B130A31718C787A4302B76297F94C503A442412CD263F5510A39E6F9494664 +724329E58CF259950CD1579297B9956BB9435B6D44801C058E28DA4911C19CB5 +368397D382C4C6BED80E1AC6CB7716E9C83CBACB87173CAF0A7B56A657BBCEE2 +8D252EFC0FF59ADAFC582146D2074BC71A3BC55D2B6694842C0AC9DE6FC0BA58 +C67AA00F8BE31EF69343479C04F1E4718A99EDEF7C54EA07F6FDB1673B515CB7 +90BD510B6915016564A3C69C7DD10D2896C21E1893C441243AC3D3223F878DB3 +D98A58573D71008F7B5A574AE8AFF1D9BE4BDFA755459A0AFA87EB60BA40E9E3 +86ACE3DC9C8C83CB780B705390EF58C22AD86E3AF8AE9EC7B098E3A4CB7A20C2 +364844C91C9B092F3C80E5F0C0875C87CAB85005893837D2A84288F50F595A2A +C6F7524DA556249A48B1D6E407AAECEC725E46A22EB1B0CB8A03D1C853396D14 +8135A883BF18DF240F8B19CB176B064E685B60B93B16C74B6E988AA18E610FC0 +150AE778A8AC1043B75F43D477BD8B5EFF5BEBE679AE42571C7A8974CF07F55D +1FDBE94C2B83D8D50C6B1FB66178051BF1C42EB489C0EBC39DE09549DADFC50C +8140F04C4D065549800E1DCCFE65BF708B09D177C19D3AB5AEC42DD4CB645A7E +C52A360D67920A2F379DF0796DB1D31B2BB681E759279CB093F545262152EF1A +EBC19FAB38F4649CE126E4051AC6258C6C301A2285DEE5605FA2B337356E0B36 +2D927CB3361B895447EE897BADC86B875E28679DAA7A23C71590BA5F59BE94B1 +18670F3934CD9A3402A4C8A154EF6A8C9A0238F2F2BA7C4CC5C8CBB774923CC1 +2F12543FECCB1635680275A48309AA322D43CDA5109EE8E6E7E8472EF199785D +9E84A5D50E433A860494349B55CF38808CB51851F21281959CE4A43781AE9250 +54011F5849FD5B45940616AC942483A87C1165D191B856C9D8479501E9A59E8C +13B9FBF1083FA716AB4D7FC885186C551085354D17684BB7B0F0E9EB9C4A1205 +3383639CED121ED2BDB7A52356806A46954A06C00894DC228F22E704FA3E30B9 +204B85BADD5411B313F7FD01E02FC927682DF3E8EB3BD0EAF002448154C8DAA9 +8B2691D0AF9A6E6DB9DFEF0FAA136AE9A99EEF6F3A9B55EF49C85A083EC02514 +05C8B5D5FE8A273C8FD656ED257F11D49504F91CBA6933DA45AE47F7AA3013CD +23825CD92D445B052A383CCE81EFC50927C94D9C1C29D6EF54E5BE20D876A751 +32339988D4D440EB7561E5B90F4EA7586010566272E81FA73289981CB2166E79 +4FB33F7CA98FD016ED602C78529173B3B976F11A9CA86437F942ED0AA26B5EDD +D089AFCA5E3285B85D390031D1A942BE38B826BA08E36E6A275C87DC5477FC15 +1ACCA330651DD43750D3B0332C55197D91345D491DF96764DE969F55E6612354 +A540402879BE16BB2A08E45EA16DDF58645B86F3884E5A2669DA970E01156162 +D74A3AC0104DCF86C11C4F19236C586FE659844F0200868570BB4BCE1B529C2C +A216F27DD9EC638F671B049CBA7F96D0DC3402478CC833E3CE19D4B42C1FF119 +39268958A932BCAF36DC99B83061149B18C800E4196291DAA2E5D6983353EC41 +966F9303327A7DDA28D041555320E4B3B5DEBAD49CBC043DF4D92C2E5F82F3E8 +5C79AAA7C3B9CAFD96A39F58914D24E1B815EA03B238FF763763DBE885E8AD8A +C58A31E220ED192C61D9E1F3C5C13730744A2343B9BE703EDAEB42C9A53B0CA9 +BE6910779D1F94BB4789D3611A1D51F555448B8661249459CA515AFD0640D3CE +A564907F819B3752DFDD134FC5978398AF0C57B969D5B24A92CF99F2A0DFC447 +751F988B3AC1E5E55382673EDEB9CBCDB9825E7998F332A04EEA0BD207143EFD +BA2A4EDAFB487EACF8B4753A7343915C0EED8E9831BDD37BE699F32F0D09206B +FF1CE2BFEC49DEBD085733DAEB2720E03CC19A8B995FD2FFAE293C720A59DE13 +D7181515582AF67F9B51A1F8531A5B0A63BBCE4BB6146DAA1CD4281CD4166F38 +012F72EBD053D5DB3D2AF3D84EF7B38EC4E6845395395DC12F97526437F7B839 +F6633DC3CBAEC03D5391314E6C2B94B8392B1848527544E28F808A50CFE94745 +B6C2E7BEB710279420E2284F37657B59248DDE57C149E34BD2B9BF6F41207188 +22D28A609D2EFEC2F04B22DA370761E1C8FB04A7A132A157F25593FBF6A62F88 +4697C4E6C2E70B57443D08F5FAD9DB2AB398D2C47B039573C85546FCDBCBB5FB +453B9CC6D93DDA6D58B495099B5D204AC291074CDF0319957383AD958390FD8E +BF768029B92022E9E7CD009620AB491330B8270FB8B94202C94E41397357167F +5BD8BBEA013F3278EA0A1EA4A6CB25527C92F5BF9A2F67A38FF2488B09C89B8E +A5BBAF61E672FECFF5511AA05A3AE001463483D86B60C7E61939FDF6306093C5 +E621F084D993ED0D4ADD7F58F9D0FD05932E2E4DF4C2CEB1B0401F6254DD0899 +B87E41C1CAA87981E7E2E94BEF85F5FF3C260710408B536EDAF78189E816F2FF +2ABA6F132830117F95DFE7C0CFD740E20826E875DAE1F6E7AE8333B1C20ADF8B +B882B45CCEC42A6EA5F2A50F100987D50A1F8E5FA9C00AE132D77740F48B6D3B +E6E12B534A97663A3695491CF4E42E66DA66FB2EC1531AB292E3D8238BDEEBE9 +DBBBABA1498310DCE5B1B7B99464C463637218A766F1B731CCDB17AB17F4FBEF +47E7FF5962EAAF1320C667A645E25FBFEE4D882DDF31C9785628D32988F00F4D +87FF88DBCD2370661F85A16B82125D753CD02688FFF8FCC59D318EDEB5E56010 +16BFB2A8E8A151898F548C6C69BD17857F6427DB8102711103BDB2BD1C0A8F63 +31A1167EFF41E0E5B814AEBD022E941109E8BE0987FD33EDBBDDD203A18A3FAB +2A720481F15233739E1E882A191ACA4B051BF6549A0FE597041B33DFA55BC396 +A3D200D46DEB2071C756FC050132CF58BC768224387C4B53F646EF9972266FDC +210F24A85881F5EFCA127055FB69324B377802CC1CEF29C1A5D1C894337D0ADF +7B5EAB50B40D91D3B0A2C3698D1603FE27CAB713502ECC3BE3A543802BB18627 +1F3148A1F9F31C8905205B6348E39498BE0E24B558ED3D061CC47D7544FB10CA +EE4B5F5FC8161C9A341AC7CDC83F9D506AD6704554A31D20C26DBA17B6F011DD +71232C8BB6C1EC2993160ED28B5C15A330FC1EB37FDB83C2B7FF9857138A1F75 +3D91CEB5BFC8CE44159EC17B0462D274D75C4EA3C7A519067B8B817A9C6E63C0 +33989FAB825455369FA87EB7BBC8E80A9387E0772B22B2AE50A2EBCBD0E087A8 +18026C8BE1110F88E341751A56DE4D00B3EFC3207488097453DA8FCFA4A551E5 +5CC41FF1571C73BC0FD6ABC360E406713DA218331CA552B23B33F5C689DD2356 +17D4A4AB5E0983DBA0287557E477CBEA196CC9D04D7F101AF7D15EB52A3B8F9B +0BAB6EAFE12C85DC36A106DBA34997E9C669DBA7F2FADBE2DA80725736E5D681 +9E03E69A866ECDFB07FF17E0BA3F9270C633C1E8FA8C259DAA9407A9C8EA2208 +E0B22230BF8A84CA23386B55C5DD8E5DF685541A0BF372FB76C9F65835B339A3 +74E10EFDDF2E84872899B3C2ED02BBBD466EF25660E416575F8D01B6A191AFFA +51897804456707B70534647A4C09D849309102336B5D6F66CC544B2A37E1D8A2 +01F71DEDB222D2A42D74C99B14C8E834F831BC6BDD4348A514D35B666CA56ED2 +D93BABAEF353159474732E67F45199411CF000C7D4B1AB7BB569DC5F3F9EB893 +13FF595AD8F1A41B50CDDA27778C68BEFDE28CC79AB8B94377919B318E32F7B4 +7B3850320E1509452AA99F6F65E1C5C79CF67B4753528D07DD8BCAABC5BCCDA4 +76759D0343C3D4566270EC7F2665BB459A9FBB81A85F7343A5E14C7B7D262072 +FC37886F1CCC8F17DC5122F4978DB35E157310E6C355414DF6CC4532BEA621F2 +14426EEF4D7BCA2BD46419AF7E01B659F04F3C663FD10B4F09EF9F9ADB946319 +EF6C61A97667B2898256575DC116363B892DC5509652A1166C3D235A0CFF2135 +60675E209ACC3E057A38BD343EA5C01DAA61AFA53584C3E76C24212FD2DB65E9 +B2D99F97874228101DD2F38D85AB8E394B0C93076AE8310A6370BD12074EED63 +39C6160DFB49AE01E384825CABE01674B9AD61FB7EE61BBEF839C40E0B9E1081 +5F50BF8BDB6244230F2C06C421847031E5378874BC3CEED207DF0DA572FB92A9 +24C312CC4FEBE8AC67117837A6689B9A4C1CF677EE4B74BC60C12C3796FC5D3B +259907D399538B1E207BA2170472980AD2713092513D67D8A475410884883A96 +176D772793DD06855DEDADE128239C387D36CD8DB2E1D3174102BFD70BF8B2E1 +7F68744226293C8CD39C99D939EB6A4E635C19929FBA4D49B3F576B53FCF7257 +EADBA531A9316496118352BFEEAB3862370148E1A20E07D93C7958EA113DC037 +5A99A7C8658CE77F01C1B769618205E86D966F5D0F3A276732CBA6800576B5C5 +F31E739B709D75526F32B6E796E7F659AB80AB86A3986742441EB99B8EA3614D +880F9F37671E5BC3F8CE19B38EA6EE0693CECA57A6D7158EDCEBBECC70E1E429 +C1CBCD515EDC5AD996E877CA88B290E342D82F56ACAD5465790A46DDB20C5D81 +9C70A24BFEAA39A9155532380036451E1CB48ED7B7DBCCB686BF9A32041072F3 +3879D310C2E50A6646271800B2422E0C29974D6A02337B2BE484CA0D266F8F0D +5B5E13C2595509B03FC95C8E37A20BC8FCF0A4B6CB6AD6C1F9FAFA02BA37B969 +2E0E8036EAE531074039D62ADDCB67F7A28B1815C04EB22F8234EAE30E773A54 +5F04842B429034472097D2852282BD77A39101904B505825616B09A9F5BC1377 +678FCBBF4689E4A980A46C83AB17E2AE5C222BE8A967D448AA9492C106D259F4 +17B5AC04797F36B2BBFF569CB8F0E48CE727F7741A1B57A71655E77736CE6D26 +4A6B86E078016BAE886E069F6FD040315C89C3A441EE0A92EBFDB02D81AD44DF +F4F29AEFE0390448CE106B5A23143E9C34DC75C157C759CBCCF87E47CFEC0C03 +3148060FCDFFCD94B034DCB302FE796F06649C209DE276FC313D6A10189862B7 +D1C21075D80C30BA1F21AF907F0A9F38BD87F485F9DF469C8C9A9ADBB85F3679 +9839E5403BD31457AB9DB726DAC9CFF72EE7C3DFB0DA829DD28F50701FFD3B3D +7203F36E2E5142A210B695BFAEE814274CBA880DDEFDEE86FC499D203FD205E5 +6A11E5571369718AD1E56508C161A48A059098E7FF3D2BD0898A17F591635391 +B81544B0FF21B57B5D6507F57EFEB2DEC894970513304FADF02D78747E900164 +56C90030E3E8F2D728128C19410E0D2CC1A34257F371A856D0B5DED3C887DCB9 +76C65ACCEC3089352636F977026767AF681F829435E68124FDC3F4F22C1A18EE +9501478B1627E6E8C9E0F0737107EF242AC54676AB4F632DFB1FD1DE937EC35C +64A0E35DB72A5B524449F65AE9054EEB9315971A43A48A12B82B81258D355979 +F50E3F34B4BF541FB2FE7B31190705BF86D1B7DDE8B8CF9433A6474A0B82CA9F +03ECA76DDE98DCC703EC6ECAA8589374B9B58C648D0B644D652EE872CFA2B9F4 +767DBC4D8DDD8E69172D8FC9E12D4A30380EFDBAF3C0210B881F1069D17456F0 +B6F4A005A1E9F8B5C673A91F52FE95FB8BE9DCCF76465BDC26BC7C29FD2D13D9 +EE86AC85C3F1526FD495A120FBD5AAC5238AB1AD736206128ED0D1755A5F7098 +8B91636223E9666726FB36AAA4B02C3FC1E37CDA969175596B571B7D792EE705 +F72DBC6BB24E6D5E592AAF9B9D6CCC2469C389D25549A1E9FFC3B549C12BB96B +66299ECA3C0E9E2AE6DDD699E07A59593F8DD214897C22214C7300A517F7CD1E +D2144B07851F5E38E70886C9F06AD8CE90C35BBD91334EDE8A627735A4E8AFB4 +843D624A11113B8EBA95B1C55452D5A1D1E37532DFE8004F021A919AC07C5906 +090BB1AE3AD8B590686265C5E73FA528D9DCD44CABC78A392967031A08E12F7D +5E70778013B30559D74E4C6BA2B551500CF1071B722234DE8B4F6EBABA2988E9 +B67E527FFA26B606977B273B6555CD0B9DDDB4913B1D233933B1ACBD74EB59AB +BAD67D6047E712C4C144EC5EDC74F53D94A790806FACBAA02E7E2F3CFA6CDA93 +F337ADE914C9DC9937CE95F823931CCA1DFD7B2BB3B4E057EDEC6373F8B6E3A2 +2F547929D2083E6795A032AC0E892EA1E4DE0F5A97785B067CBF04C86BFB4B1A +911BD9E498A3C3E11BCF09EA0CB1AEB8B966C7504AC1FA2765D172E0A026F215 +4BB374CF5AF876BB152546EA55BAD5E3ED4504AB544200A703EAC71DCEA9F09F +B64AD56380576FE8F72C4147AF39BC522C9B13E8DBC11EEE1B216FA638604D49 +5A5417B6B9BB23A006983E01BF51884024AB44C8A0426FE01A1428E70478DD8F +EEA0EF6474E3F999F3F0BDA5B3C2368A618238706D1B4732E6E24368AEA068E9 +1345142CBD56044541347286877D92CDB2E42426F59D405791E7A17019260769 +0A0BF66417658C49261985D15092EA239DCDBFAB358B37FA22D6C91E34EFAFEF +824D6FECF0BDAA2C2FFB1ED169266318AFCA0509EDDC9F9F41C5ECB18A2C2BFC +824F82D4FECA753CD4A07A11BBF92A19525031F8A01AE2D2DA04611C4DB764B9 +39DF94E9FD03F0074840DD609F1058BC2FD065828FB587D38C8447EFF2FD999A +341E1F3201504B3123E7B19DA117BE5648B03E7964F6652148EBBCBDB3B5F167 +0187A61C00EDBA395538CD1C92D2C0AA9AD68A2BC0881E8F2A025E763B0C0EE2 +3E3E8A9E02DB95BCF2326CF8C9AEB14BDE8288D8992EF921A947970657F605C9 +E0B90DB7C5D16EC535F5830FAE43BE9488203705041635645A2A958A04FBE6AA +47CA6AE7952B5C944734178C9B86015C9D440C6D1A2D45834CDAAC19120EA2C9 +13C2790137B35075012779BE0249EEE679FFB95FBD04030845803CB299080F51 +BFA09748A6708C48964052C7D8502433AB1777EC4328140F7784DE3614C5024B +5351C63AE6DC3C064E126335F968067DE981706B3E907EFA1A73537F0B268E33 +521AF616B2B6EDCFA9B0FAB31B7AE7DC3A870D1968D0D4D1466AA7C923A923C4 +F86B6F4692B6B637322297221C69EEA47E9D7B46E726EE2FB8BD9866153BB505 +C1ADFB6545B6EC4E3ECE12EAD2B0CF05A0EC1CA8188991E90E3BD7151C234F11 +0EE146C0B9383B1FEA8C66D140EF9B4CECDD3B92C3E2633A0F6218D42A60CBB1 +01375E99A55510B06E4C307A91986A70AC40F11BAADABFEFF1E2D11AC9F791C4 +4AAB4546C037AC8200216F73E2626060D3817596C588D86D2E1105C0CF2845FD +8F1E084E431E651B5C90DC97FA78DF49F90AE9F923D889047FC7EFD70399FB5A +3FC6A2F5AC4C6BA217CAC25F0E01C65ED9A88A58429E396C9C0AF8D001EB1E1F +5E7E1CF6C5DCE293F84E96C6D004CB0D19827D5AEADBEB37E818B664381EE6D5 +270A60FFFD4857A695C480F6F2EA24E37A69B4A47B9D62A9E2831999C590E50D +7716AB8BA00DA97889DADDFE6D8AA93668C03CACFB051C8BB9226713D1E9BC75 +86CE9BB8059900D038CD0B31BD8230DEBF34FE8B6C9DEFC531B21D90FE4B6DCA +257C9410BA9CB32711BD79A11EC587921FE57B095DFD07F051F2892A1B6AA72C +34596217E819502427387BAA7E7C324C8C36E0E1EA3F3A3D16BD71486206FD5F +E881F999449812050164148E0776E1E84A1901C49BB4AB89845DC1082EB048C4 +1E8300F8474A3F5BF28C96AADA6A3AE3EDFBCFF9FF44254B41C9AAB0AF34E0B9 +6551C23F6371C135A2F6EC9239D949BFB5C27F3A46C5BF6E214CD9A24FCCE358 +E3DF152004AE936538E4E54B88F1A8D02646DF74CD50E205C68B3587CE090EEA +CB287AE009B551DF09FB77FCFB36973A68383E92575BF05387DEBA273ABD7579 +C772FA8F32B221EFA1A246EEFAE8B9354FE5C5B0583D37FB53B839BE68E80D91 +DA146A6DC4C8BB34D140EBDC678AC25B79B6BBFD37C9D73E57DB38ABF84C9A1B +BFD558468EBC5B96912E91FA3F4205F5ABFD7246D749900436B7C4D9D4C6F78B +7695E53781E9D7976937D21DA26F4A4C4EE02565AD55CC77798F86DC49D6136F +88182A88FD5CF4FC3D0B4ABD7C268C1B90BB850DC034C5B32B3605A07E9371A2 +B750C4F8B3B862221BB0F4AF1DB6AE3E77652F33FE9D95439F536B4EA4D4D226 +2A8E09AE1C980DB20855283DCA5410A62514842388A4127E93D304C350EBB09A +DC693B1D90AE851957DA25E06C795CE6C3090F5AA6AF587CB39405FA90316AAC +F980CE1041C8DCB55786D2A47C499B5CE0947546A588BBCF1149206967B15CDC +355EF3E9B9BF4ABE679EEE80187FBC57B317C194C9DF20BF344859567B8AA537 +B92E5196AD7B7F2C427EABED44C59FCAAEEAE18C3B518A39A1CAD14FEBDC311C +02EF80CCBBB3B023B5708920C91B2A835775D0E7AB0A0DF2E249F2AC0D2435EE +3BAA4A853E37F80C7EFFA56C6DA23BA618C5B259618460923EA12527D779BC05 +D3C20C410AD476F416D04489A2F4C82A4E583B3C5980A33BE766BC84CEEBC1E3 +FF77CBED10B8534A7540522E1D1D92A973700053D51DA6F89B10EB0EFADC289D +EC8B53E81B095B5599E77EB443CBAD4074FDCF7085D7645980894419447EF8E1 +945A692E3721B90B580518ABE6BEACE7BE71B920A6FB704E25321624A8D1A37C +9B01D6BFF2689A65B237ABAB3114112B7BEA16B66AFBC9E9D89F36CD4E638F18 +8926101C2B86A60EE12F6F432AAD3F5CCF22981DA0072DBDB1AB687F6E7ABED9 +84308AAA4662C8B9BC4A630E5FA5389EE050A9E4DF53B35D86C50150FAA3C0BA +465E05FD1CA77AA3E78B19A5DDD60E4CE308C0DD115CA303D7D105D33F9F252B +1D6C5764BDED6609EEF2400557658BD92C650DF037B7733FF5F5639E1B2973E3 +F673AA2E0319B4F0399D9784A25C08EED747CE2FC5AC3A8DCE5397BB03943E50 +866C1BB1FB0AFB847EE73DC3CC6B93BC7342DAC3D88727CFC0284A8FC2AD8B99 +DC7D6397043E8C5340B31E0568861EFADFC08212AF630E015E24C21AAF77F259 +089CF6C8D1E2D0136BA22707D9959981981CDEDEAC3375C1C9CFF0BF91785B8D +44EBCF873DDE5F6A4C590156BDC278B6910087262BC808A4409323E465FC7BE7 +847A33796D20B116B205C2B2888E02957520B5034EA2C4644F2E99CAB4330924 +71D1A7A65290E8D13D37C7A778116F16FD8A2B93F78601EE0E28CEE0B83FAFAD +B52146A221B9F011D167AE9644BE125FFF4F8A2228E21CF447DE42FEC6810352 +6C7DFF028D84DE6BB86C1B62A062A969B5BB1333D3E3BD95DE87E756D7098390 +2AE560996D9557A0C1D19F901A324656E3AFBFA1AB348FC923264E744954CF08 +B799CE46F1487B3188306BAAFB8D16B07B8B4AC37E11A6A5ACA1D5C7CB5FC3C6 +212AA74DF2EFD557BB3664366AF289F88FDBBADA3A6CD43756AB8DF2E30E7704 +DE96DCE521E0F9F23F2C5C299DC1345DBF1E9EB0A50231B02C53230131B67649 +B8422865DC9CE8CD2345FACFD59F8A0A13B4B4752DDA9258232C3BB537F44FFB +A39DE8755B381C88D94A07B561879B3AC97FD8AB89953516769C44CCB5EA2CC3 +68156538A8F8D46EE1DF6E42B31D283868E5716AE0A9DBC518A2D19826032C05 +34A8563294BF6B4A5657CA7440BFCEA23BA55F4DCE15A036B0B30A4CC283CEF9 +056E9F7DDFCFF1BFF0CEE33DDD1BE8640443D2E9A9193A55D17766E6803E6C00 +57646B20920BDA09F080FD41D11B73CA536CE6835BCEE1D7ADE4DD4FCC849CEB +3A4F4C808B2A1EDA914D469BA709AE3663CE715776A3C6893023FD59120FECAC +2BB5E1A0278B4804B8A5A08ADE396027120D4855DF5408B7CFF13FC94981D448 +4EA46332569AA8A6121DFA55FB6310E86C95AE03AF0656317CEE6D8ABE6DED51 +140070B89F8FDA351D7520AEF9331649BC4FD2B96433951290573014594AFF53 +E1D59C2257C38DB5F89C2D84D47F9463F6B79D4FB06F4D994D475EAC02B40590 +A2A6EEE9CE8FF2A05ACC51694AA14E9DE73E688099E5E4297322399284EB456A +0CC3EB28F470193CA13DCB82B8A72BF0DA06843DC95C17AB25512CF75E410B53 +01D4470B5910503400E1FB0088068CC4A753DFD5F725B0883E667185DC04DFA0 +22721F7C43F301155719E4AC651C0E9DC3106AB600C9F34408E6286E265B837F +E977906953BA864E3CEB19BE1E7472CD6C0FEBC2F552A1EC207C1DA42B88E271 +3C76D77C01705EF06D90918E9F02A8619AA10100D32636F4DB188EFE516A3CED +5BA74EC79C63824BC1BC0A8E7914AFD6BD14DE2F5A6FB7F3D0AB1B991D568760 +B056BD18C1967E6042D161C8F4A9E536B8EC49F1AA354437662332203A574906 +2698C5954EA3842D8CA8EA5018C64B49C0CEE3CE8157D1A54037831431073FBB +23BDB5A15B6936D772C5B9E21963BD6FE868BF7174DA2E24FAD983B3C106864D +E7E6540574F1FD6CD5C8442635637676D99986DC0A810709C3D3BF40458DDBFA +456DB2EB44FA75C83AA70566C9F4A95DC1DFD8F820F1161ADBE4FE65CE040E65 +864D5D56F4D93D796493042A5EBDA7BCD6283DAC18DA5A87342C165D69118843 +0E8470A2D7137E4899DF3DAFA8A27D2273BB401A7A5C24A6243D1CE9930B0D3B +4119F0588F822318FA154E5C882B677D8DA3359E0EF21BDAAC9262504C6D4714 +5426139CA31164F05FEDFE85368A8E087D65343C75EC07CEC25DE4F0F95A127C +29C930F7ADFE463D8B64DE535E77F36C4A84DC6C0B158C3B0E1CFA30BAF3D834 +525DD3D8F39D755B95FC306923A9771CC3161B72888FCAE7F62137B030F6DECD +1AE4FDF62A5C586204352359C639C9DF7D1A57482707EB0FDC5C687878329AD9 +1EDBB83D3E373D5812AC6B98DEB87EA382F10CE7E282360236EB97A006967B1F +1BA105A48DD051FEA8E9E9DFC221549E71216EF16A28469BB9A296E6061277E0 +DDA7500023F51C416ADC9AFDC0A45A94D568556E9E25AE3383BB89F311F316F3 +EF7272EF3BE368B0ABF145AE097FFA7BCBCCA46CCF460916FD0F7B4840D36CAB +B47BF1CC0D4E406ECA0C3E349C4D7443855BC48D56F5C7B53F69AC2602F02AA3 +A430E9215121108C6287012D3079969000DE04D0085B7BDC7B3EE1F16D659195 +7E695E20D5AC8F2D32CDD9D88E21B23B5E2E0A776E35F8EB759DD20B01D3DDDE +77B7273192442C270ECE3422DEA9E52EE99542D636AFB83AA225B35DDB5E6384 +8DC6B5FBF7EE518377B4B2A8E01468E568B20DC79F2AE5A178E37FE67719CBF2 +C0C1F12B06F646E97998A5D6A36447BE87C94533E04071DC4C818A46C98482D5 +5F557B92F3B5A592B675F0395CDC05349F49E0B2878A0AD4F2C1473AD30DF752 +1ACA29B9520EC066319191D8B14DAE7685B5DB3C85C10685EA0C5158E049EBDA +B204C1F73E78699268C9C336B8C0D54AB4B6D20E34F5F3CD6AEBB3CCA179689F +8DFC5B4973346B98689E6AB25D251EB83CA6DD6DBF8EEA0AE66D7957B15CC773 +4F9C26A5BD0BCF65D7303AD381963B584E7CDDC6DA9B572BE655B7601BF1482D +CAC527069E33038F77639810D403BAE1ACD1F9CEA544F8CE81F5D78582A24F54 +B1AF188BBE247053D3F09EAB56A65214432AD104E1E588A49DA1D26E5A31E7EF +68625B55F1B366292993E186142FF99862DE9AE40032AB70A053B003D3C19953 +0BEF3A5F6C16F8FDEEF0F2303F004EFE8E3DD7148D0B9D2C393D4226CD841E69 +4E131E7DCB3FE6D2979ED1DAB5BD7A91F97AC79FC4FB82C125B69AA9BABCA9BF +A04AAF364A4AD81E33626B682BEE85A84D882B9C0713FF7CFDACC4BFFB6B3BB0 +E9FC25F52747B88D33935FBAE5712461093EE2BD224FD7A85BC9704F960EF2A1 +60BAE279B5EA1076BEAC60905D07B921A8F001B9D287603B04EB7B02DBFC1E7D +132FA456CD85FE50509DB3549013A8F88949FDA83275150A58C9A6E480D5A8C0 +DC7C88445966C9DE70CE6A910628883102C1A56B386039EEF0549B7A78120649 +5421D166460E4B21BE9415E0AE0BD368BD0B9A90DF4EB85845F26F7A32E2C37F +570F67173339084B317A22FC9157DE2B384AD6363AE9420166D72E7313B10885 +75BA9EB86C588374434557D10D456E6FCE7F024721C4C2F8E4EF9CAAC22F06E5 +013AA1026802276A8F4E1724740943AECD35F6DE0B9B229541A3B56B08F30998 +D4C5AABC03B40DC85B1F5BA7C6F699B3E4891FF8FFF91B77EFE1241A21EDEB42 +408D18E39A3C39604BFD2C5124A79AE7546B176F22BFEC91542D2F83AD5981CB +B02B8C521B5E93236CF74B33F1262E1A504AD22EC8F0D2942121AA8C627DE60F +B8E290A73C446BA83A97BE7ECCAC79CC97F574DE7D15C7424F6D873B367F3C59 +754854D2F0B183A13F28C3EBEC1EF32EFF18930BC635783D011A26D4B3F1764B +05C97B9B681EEAC6B8F3922C700279E12E630497431706790100EA191C81B146 +0B412CFBADE7A563CF37E48DB5C7758CEDEEB96E25B9C7B28E8507361ECB3D08 +FB007AC448D980295DB91A8817557E4CB0E6B614C079FB93062C95470D0A32F6 +D281F0F9C45F0FDAC9539B375C2B9C9B0B5BF6CCB2D9AB8E80E4549C0F8E5A68 +2A0A246C81C9F147F9F21D98F75EDC6A3A293DBA61A8255B3E42999E281FA099 +12062B882543AA988E743EFE5311A7AEB8C51F5E3A13C935B4FD1A371F8FAED1 +7794722BFC34883350A3FB39BEE9C5FA8C6A59D8652BA6C34DD958A9352E7170 +711CDD510350D910B2BE3A9771C191818C3E81582A8F6DE8A01ED72462EBB883 +718E75731C2CEC9BAC03AF799A664D62DE91ABCBC8BDF2B39177D18B5DC26825 +F73562547130271B8C1AACCE769778738EE03B74276984BF67298021478D71E4 +590B9AA09E0C6D2B59468022F86CE4C6ADA15C3543F48F380FB260676B6E8488 +97E9884A3F3682D3E7086E8CD1484DF32C5D3DFCF0FF06B245F44A03BEDB568D +86893E393FCDB7DF54D0DC1F5E628DC9B6FDAC156FF3A8C7097D1F49666E4400 +FF3EF4CDB5BBDE55A39F0A67854518CABE1B1EBDAFAE5FC34D1D45FAEA59D992 +716B91F73AE51DFDB14E1032F68CF751AF805A41C99AB161EF7DB88DA4B01611 +4779DD94D5BE1D8F9554D21649F5E18A5664A5F4638F939FFDEC9D65BEEB097F +F31C13D001DDD0F94C33D2C7BAFF8681874CEF7C44D75A691F15E3D90EE7BF19 +3C9F447B2CE43B95C05D54B0755B676228F094045C56DFD70F70F0B1A04C1807 +3784289A1FDDE55B751AC021A410FB735AF90D1793F98D7EAE87D3330C63A85E +5DCBB8E087B11BE030023BB83AD994D6C54FDF104508235070E96271E643CA72 +25002205BDF49DE412FC2DCECF3D1364090484DDA5290CADE2BE843CE0C726FE +C54419F2DD1307E2742B115F4FA7FD8EA222CCB89B6808763D60EAADF8529B15 +C89061F75917B22B603EDB02AC709D6E705D2F3D84C31B09D08A4C188E1C8A92 +1062A38AC7F4CC83F55B974F1F394362B8D3E8777BE3D244C53856BF373727AC +618C224C5B7CF8D94C9674EAA106C3F30817AEBF0386D3F07D6A9296417867A5 +5B9B9CFEC845A461357685A95AD0630B2C0DC9EE8963128132B4874C861DBA02 +1E1D7BE9259713E343989E16859F5E4275DD3BFAE96F382B8F31247EEF86212F +0D577D0221B9B8965D0C2FC396FF5F38FF95B56D071E432931CD324FB790FBFC +C6CE521D85FF14E8815E9D4425909D6C312C7A2FE077E4B1FD5F8ADEFF72173E +9AEBA065002EEC149758F3016625256F37AD2055AAE3FDCEA074A8DD0311328F +5CBF4CA5D62CBF21C9A5883685B8F7265F10AF6F5D464CFD13C9B40A620FF21B +DA5F4801C8D5357C49D5B401F51DE0923D0D96ED6DBC57C6E77569FB69FA198A +2029DF8A5F3CFABCCE3A5FF87E5A4877D0F8887EF0F4F0FEB51091894A946A18 +84EFAC78A32C7EE6082A51BB01AEAF4FC9066367AE9B5A5B74EB4A4231F1FEAC +B7B76BEF33551AB4893958462B0CACEBBD48CEA3174BDB86322383CE32D8EF35 +BA9E1B7F4994220250359EE3C5AE78C1492833F71701D0C6B0B4B46B8641373F +5193B8FCCDE73F2F56333AD23422273ECB807AC49D9A79DBB88FA987F34B278D +39AE097E8D664414FEF8C2B0EA3F7BD43D38E964AD7709BE0923BA5DE504D56E +7F8256969F12A9149F1C9D7DB5FF20425C47D68C15F0F1F492F0FDB01C1EC138 +4F3DF82B0C1BC7A8FF3CEE5AEE3992586A2B53B425118546D9314170B3877D74 +BCDEB2790C9EB08C21FE6A3FB8D567F39429F2DD066754C18E026539EA88A94D +D643E27E8F8E071AB6EC8A30951504B93FC59CF0E801D3F920509AC2E6823635 +9ECB917546C50906C3A2F61D6BEB4E887C6C9272FAD0AED7ABDF73EE841FBE28 +FB5DE55F4ED965252883CC567C96DE4EDB781EC82E4AF9E04ACCC2160598C2BF +60140942123DAC1D457F947CAE5E0654D38117D261F4EC69ABA52543D215C011 +F72B148E55104DD3A872B9C01B47B02398C0848FB0FF5D4C9F557D51449CD16C +9D7AB623BC300CF38DEE6CDF4596F5B288C577814C19403220C343B11AC0770A +920B257185D738BB7CE4B535EA0EA8F9446D8D7A35F10ED1D98F1DB7771268F4 +4ABBC51CBB2CE7F48FEED3446467A9A04A826AB7688F8525671BB3A5DFED3954 +3BEA36C1301291EC0784D413A324237445E85FABE6565A058A89E19C25CC8359 +3623738C4292091CE48959C0ABC289CD0CA5316AF2756B31B5218091D094331D +CC294D876D57E3D5B36D96C0F444D9270B297149FC8C607DD5AACB8CFEB91704 +3930AE21ABF7C4E3C524BF33F4F4CE4EE4BC1566342BCB5B7C937902D6C4CAF7 +62539819195853646B73E749B06C59109B4EB288FDACC61CC962CD5AAFC24B15 +FEA2E8286298F767ADC5D1CE787B26E7C25B20765DD831363F228099E4125168 +7C3E64BCAB5A40D1D17150A8BC43E66D4D03712C370DA6128784F1E15BB3816C +F38C845066DAA046C038D54A3FCDF3939D0A39123854C93F1E635E0EF053B84B +012B3F64398194A21A5AA2A15CA473EF99F8C67DEBE79C747E5CDEEDB6AF41B9 +511ACAF55ABA8FD1495345148A34869A0F52D647C861D22E0F03EC217227E270 +8FBDA95B4F70519FFE4371F2187A70E9323E5671299F358C02D7CAC76B0C253D +269A43C27FC6F4132E8E8F2C0FCC103143E21A4EE3E5D3E6062FA1E0054E4E49 +3CAC42D8A9B3AF467F9AEB84E0C12AC9E0F529AC18C6EE1D02A29A0D86800884 +AEE0DAAC7890621BB42E531BC53BE80439093EE80A72CEBE746C4D0BEA66A685 +E56FD9378BB056BE0DD465A145A8148C3F5E54E5B9F11F4F9202EA28EF9396C8 +2958636AF404023AD5A9D4A19163A285CBA7D0FCFEE888268D4BF46C9DA49AE6 +DEEBFB4B4B2072CA7B0B8E62A85CE2ECF876610A161B76D43D67A73C67C70124 +6BCE8FFF02272DB067916FF0A5F157BD73BAEC3456CEA84AE21A4936B4983780 +4D7116570CFA46045B4E98E65931DCACE943C83B7BD30A60575C9D34F480A179 +CDAD619F8B084FDE54EBE09D95C0433109202CC0E32BB8AD1EC3CED55DF0E3D3 +4DB701AAFD59F6D4BC29F3A533E34E45E0613A6619BCC9300223380440FBB8B3 +3BD3FFD5C7F76407076E4A791528AFA58926DC581F5C3CB53ADA019813B1FF1C +01C14DF03B1F77458F1D33A59889DFEE4E1C99BA0CF4B04F7B11BA530B154E64 +F5E4C2BF964C12A5ADF102B4EA55D46AECC430C1162DACA9985BDD7910F446C2 +C41DBAC7C809E2058C2CEADEF4CC7BAD936B660A6E6AB17B5F52F2346171B63A +5D642852B7046CBCF7B2E9B8CCCDCBDAEAB267A48E3C8218CFC5129BA1404253 +1B01C19EDAE3092F99BF5864427CAEC6A3F7C00AFC4328D3732EC4CD4A051F2A +FC6E419DAC820B082C7CEDA6F19AB2CE97BDBC45708798DD2E38BC27D4CE044B +85323D6BD9141DE647AD8EFA76D21B899F28896E73AC9C2616F46DDA50B17387 +F5CC63F90FABD2716E5548BDC01BC6D798F7311169AC071B2326D156A66BC649 +7976BA04BF4743442CB5898BA927BDA218070A5D03E543EEFE4C93D1C9503655 +10591B89D07DE1A0A3B57F1651701C5479ECA1D8C9B7FDB02CD351AB975094F5 +D4544D0712690DEB7DDA59998E13B656B38F57816E8E4EF2CEE0D3506A1D8D3C +28AB4918BBC3079DC7436C20600EC9ECFE4A7424BB3299ED0E9E39B977023DFB +4E1FA6007CA8C1D86D7181E078DB2516CE3F18011E15E436940291808FF64806 +8AAEEA70E5FC56A02F87E38C7CF06FE80DF9930F63E633B67EF6093296CEAD28 +0B150EF111A6D20104AF1746CA1CD02BF2DE14546CECB44BF33E239FB7185A9C +738414D921AAF0CAD72B2425B19A0BE3063FAE017C404DB6CD8A2335B62CA1D8 +9A742A632035DB0132EB2463C9CFD4F806FFA93EC90AFFC4F6AD2852F52F0F6F +1FAE527B45679B55EF87934A396B331352920491B04F9FC364C0182E4C693885 +DD52CB9E6F7BBBF49066852F9850B1E071372B6B77D4912B8D0299C314E34638 +C079305798A0F654EE711F28A4917BE210CBD0614329FBA0B638E6CFDD0E10E8 +64EEE1C52F077F43ED14AE2E87FE3163C3DC62BBAFD7DCABABD75F0229858FE6 +29F198374EE6E28A4C729688D7D345D95DF513F85319F7ECC40F6477E8B73EC3 +5437C673F57AADBCC35B08A271288E1DA43287140AD1AFDBBD0F7C5A0A761178 +271F0E587F04C5A2F9D026E0B92F942FE7BB27A9605B6924545EE82090FEE9B7 +DBF60FD0870068A2082B5B22BEC698460E3D452A5F92F0CD727F75317A528635 +F883F3EA161BAD1CC81820A36978666899D28126C1BBCB4C08121E248CD1D0D5 +DDD043B58012277B03F1706E8313BBB4142A10F8F775871B340C83378431849B +E4E8F4A18BD703409EE58DD8618F94D70A57D1D13188A16BE8A5F6383C1EBED1 +6CCDF1B01EC33E4C57ECAAD2E292120F2CB157A3C6BF62EB41B9A8299728BE8A +E03A17183E7C2B3BAF9864C762A60C414F693450F952B48AD049527468A9A8F3 +731DB86A622A3C2E5BF3468B8A3115BBA8170FDA23A6A0F1C38DC1FE1004F7E8 +443EC7E4474E19259072E47AF8771288D76EDF91F8697595B8A8C08AA5C4BA35 +2E581250F1A3610EC9D5991EAFF6938C0EC16ECC43E4CFDBA8BA42A7BAC738A1 +B29563E2D7283D106F4AB176C617A6F1B1F9076E564F67819159F7D3AA4123D3 +B8A7E922AB52D0C63819D6A95ED6A3A63E82A6947098FEB9A2F1221F962DF9DB +5DE56A57214E4B84FA855475BAF474EC9A53501BD5542CECCFE81A4136A78ED7 +12B834881BFAFAE2A890E598EE2E11D1CBD44B6B66DD384DB7F21F30842673F4 +50619BA185CA3925AE1D922430FA6B3EFA985E50A3371A6B8C2D7B907C63FB81 +6FE0CA8233E4620050EA197E05A42930856FE8FC0257C1FF4B6706E4F9BC770B +987BFF7CEA0EADAEA356B750134819B4BD68FA0C36A65681686E5437E8F09282 +E89F8990B705E5A0C215CCED16CA5E663C46D5164AB439F73EE640D6DA70C155 +3F69C1BE1FFA5B6FD443F9336DE031A4C9607C706B7571FFFEEC8D8FCE91FD5A +C999821E81425432805A253C573F614895CE3570A39753B36A357F21759F1498 +A1236B1D1790B12D471D917699C19A963B866FFFFA37EFD74E0B811AB6832346 +ADCF181D963C812F18E141681EBD36482E7D29853D91683B9ACCC3B8055EFC55 +E4DB09030C38C5520E4562932C9E9AC675CEAAF41D8868F7A4E1D38193669EC8 +62E2B2AA3E597455D3FB186205210BCCD1E9B3A3564AF82997E238669AD833A0 +D53B951CB550EC7FF5FDE4A5E7C7499A889EDD8C453D99349FC4F65130849E4E +7D76D3C9A153B8522FCBF0E8C80F6C9BEB419E501A891D9E03A807E5D8C9EC9D +AAAD2A86F0D360DEA694784376800E32EF4DB045B32B78988CF798EA7CBD3351 +CB60C6C775B0E7B4D8C1CBDABF6841618296A94876573E9693A39DF47564C29D +27C0CCEAC55E0339F134B45B1403D2DD491C81BD3F1127164D6DC4DA058EB7C2 +50F8C910A005CFC6990D6C2911656677D26E557AEB420B8FD91DF224F01458C1 +0E8CD85189635A3E237F605F5C8A751AFB0E8FF920B1094166C152C9AD7F4D5E +D3074664ADDC3E807FDDDAC2393FCF48CC76AD84ABFEF4DA6465008499EF0F52 +37B408058365334FFDC0AB15C8988D58E62E7CF50A199481832968BE04CE1301 +75BD2CF84588645A9123982C8E20189D264E1FEBEB22605B20082B37502C7F2A +BFC371277B10FF89AD4A78405E76D1220E38F9F2FA8CBD9115C11B30BB9CA9C7 +4A996AFD108D2A3B860AA8C3E9FF6676597AD9B1F6F9AD92CDAEABBC510E7995 +6BC046674A9EEF946A294F4A1D4F0BF8CF73ECE930DEA3DF887EEEC94B5526B7 +12CF09476D5EE9D7E9F570D29D6D4CE9507F26E7EE794EB9AFEFE7E89EE1E32F +C48959A2FCCD7AC5C5C15C81198235E3C0A216CEEF1E6EC1267B74DC19498B25 +12C869A068D9E94598923D7E63E336BFF1C40025548AC0EA3DD2BCCE0B483631 +6ED3545427FF3E9E9460789BE0D6A9E39ED20F8BEC133EF4E5F4F577FE93FE35 +0BDEF6C35B34D3A3FD2815798BC64B9508A8B86DA0F0424352E872B943B6A8B7 +C0631B9083F57EE7D0D2BA76FD3AF87CD0C0F106180EB8E1C50840EBD968ABD1 +4728D49F9A4531B890E97F8BCA0589248B8E7F60F7B2CC612EF540244E0DBBEA +828F57E5E5BBFFE0E2AA7E46FA16A45484BA795D4862AADB29874C4EA6CA5EF6 +A61306112EB3023047F31E1C16DED2D5600A1A30F7370BC707672CA411F3347D +734D41CC60AB436577659B9C256C56019FBE476CBA18DEFE9DBED04334E9A6CF +AFE56EEC626AD03ED98E488E02ADB02BB677163255DF5D029636C4D077583725 +B60C7DC3F886913B8BC6738C662BE0A74AE9F94286114AEC6A82E824C468570E +C3D2514801ABA14EF94B9470FC684774543F95701FF7C6EEC3233DA5DEBBF56D +9349174E5D0BF48986D549FBD758B3D123E8D694FDFB95BD9B94417BD070CB8F +71992B2BE2AE0C9A36822E4E8D85DD3B337B0A9E13DE07679346C55145F38012 +AB566C38CAD0C63D0491EFAA2CE1CD8FD4938331CAD9C7E87149B8E90E6EC1F3 +55D5DBAF807BF2482A99B02BDC8BF10EFE5309D54FA108D379393BFF8AE59C70 +0409DB0D558A48892A20FC6418F2F9F56CA50878146F222A656B0E9B1C346577 +5E2B5F79094386CF535C145B5459158D74845BECB76E02D53EF9FEE8B23BD8BA +59969C7FAF44CB5E5D217DA9E19634DF2E2A653A50F7D4C564AA875454612BD8 +B01356EF6F620D202612E424A1B0FE9B0B740C344E96F6F9EC0199BF3B3FB4F3 +9330124AA725E21021B82B845B25707A56D25FBCC138EBF0FE757DD1DCA7D3F2 +5285256F32C2BF27FD47D283E44D8BFE63CE9E9E9DE2288E9A1BBFFFCE006201 +187335A534958F32C1999C8D75FFDDA244B5A530390897449A4AC5DC6D64F5F4 +9D32AB0A9376F819356705A799EE20D2196993BAB8A58AAEBD0CFB2D9477B162 +0BE6BC4A665B5AE6E1765CF427F0CEE173BD948D2BCEC5E63BA15DD808AC37E8 +27AFE857EE793FC34C1989560E809FD94A462B0E4A5EB5C655BF6D45BB65EA04 +67ABF18D255B6407510F1D65DE2F93F2349B218DAFABD923C937F1BC70B9DF64 +FDA4CED24854859D721D78E8A21BD565F05E8179E3BEAC804931EE7499BE55D6 +0EEE411DFB1705C1D0D7AA13FDD13235C649506E111045CABC12BD36A7409923 +CB2A2CE48FF0DB470A746348F2F8B5AD886298062D76ABC0365195E6926D123B +414699E9BA9783B6792C284146448D785FC8ABAEF70C59740ABDF18DB7B08203 +8C9684A23C234ED1C7C6315B7F9F517A2241534B1DDFC8B7EBAC878C3FE542A7 +013DA7DE6E70927D5B47F53F90BC5A580E3AC286D1062FD4653F070A070FD397 +7F88828313821C2B1FC062E544E42F0585115A6B19F32C2EADE89E31D279E54F +8544054CA49F7368C94A1939266C344B012EC9800955A89E832F9E59E50DAE60 +AC0364A43C400B8F62815FF6CA864E59327B89A8BFB5435B0F0F5BE4F9F544AE +332C19DC75CC3461F388472A5764ED36FE91F8710FAB141022883091894D45ED +294BEBB897D36694334F3E968FFC4EA6B073493C32827351FC6F323D0FF9380D +804B12F01BE6B926690A68F1F9ED129C390BC240DA061C341F0D09D9210409C4 +3C5E9696A5BDDFD5393AC9D7AB9F82E919F808317679DB70D674F46877F83C95 +52DC2EADDDA7DF9AD79B9BCB28C2BE897C9E9378657B39046A929D23E7ED0AE3 +7925F1B184573115299AE2E11D43FDA75E4A1DFE14F80F05EC57303DA964AA35 +9462759CA36DDFF3B43F3CEDDE73BCE859484AF34F6B1EF90FCBF49D34722571 +A2CC337ADD4F4EDBA0C20B673D68A3150E378BA0DFA81F6ECB97CD9BFBCC13BA +F89762B850DD34A51092D9E4D39D6EAF8E5B401F34F07D2CFEAB932A066F220E +869F2D19EE55663BBA117EE3E13463FFCAB2EE730F840DDDC82C5AC69C64B203 +675F11DBC40186A2E5CD1B346DA37E8D3B3C518D9480201A9C598DEBE0035A14 +355C3D66F06C4A7ED75A72DEC787ABD39FB77D3CC27FA505F8A4865117FEFEB9 +98D774B3268803E7D586FB8F5276B405680841C7EDBD1AB4D055FBA696139B75 +D1839E542902660144559D613D162E217283E112CD4B11C13A3AD04C161B154E +AD5E2EA101FC279B83B8F313F18FEE59B20876FB99AA1587AD45CF9E294CC653 +C0128353B6644F5D01339143F692EE2DA2C640EE0423E0E0C524407387262CA5 +728D9BF533A5DA8B4B24579476FE77B263A611DCCC6C893CDB7FA087820DE632 +A7E72EE945AE53FFB7FABF66C8D7A9E4FE5FC76FAA7B8474C6DFA527032EBD00 +11742B09CF9364FA679CFC5B7751BBEEE7CE5983C32AB245884170697841CA95 +9B781839232EFFC2C7CE51FAE5C3117B6C5A6EBFEB8CD5C17AE1F50F322325ED +2C42751E03BF9C602FFE7651F8EAC796F22AEB025024EA9D3C6839C5D78446E9 +8286E802ED412857CA42FB01A78B15B908F7CE8BE1C419254998C35C790368BD +8B8CC75818C190AA8B52B75F2532630CE54DF5D40C04EA7C764BA3F54657FC55 +390A118C2B74B34CDA77D2B4808F068FF11A3C3DCEBE799FA2CA3D9B7AA54E48 +2306EDDD3809DEE1CB37EBAC8AD6419A27738071492B3E89E32052CD2A3516A1 +E742FAD7E97F019C0A3E6066F6E065ED5152C0C078D314C3BE3F8DE49AEE7D71 +3A53A6D2F528499F10B2D0FEF019FD05C4F57F07C1241AE208DCCA9B74604871 +4C6C13C4CAB543F890259BE362AACDE5B69BDF373E7CFC60FB3DEBD243F2626C +793933011C0125630471B7AAF3839AED975EA581558B53BB330021054A7784EF +0EB98D56C807A4327FDB846E51725AF217563D6BFE0726A3FFDFA377A3635891 +F3A8FB69F1522676D6E01984ABB5C655964B00A05A499EAFED034513085755C3 +F54402B658E24D4A57913C4C4D1CA2335FE0A4F658BA773962F393FF5FEF8BF6 +8D6166014FBEDE0287BFCDD725639BFEDAECD06E57488F5BF30BCC2B3AE9E878 +F2AD3575FD043C6397A82F27D6E5A98B9BBAF8C78279D1A78809FBE9D56FE7D8 +306090DC00DA55AB9624FC4E4A279849AB4D5B7E7E125ED292B125C34FCE6C5B +66ADC813BEBDDC1E91CBA09751DD13ED696B5629234AAA990C467DE668CF1D29 +556A24B3D5EAD78CC38A3282E46C884C802C0C0B010840CA8D454034D3E479FA +F9B9394A89924F66E106AEBE1156337BA80303F111AACD622F9B0C79E463F1B6 +E7ADFCE41A9E7C962A96016418824569861A8B2A426AA86A3BA4AEB5CA11916D +2F6AE0C03BFB90E5B6081BCB7348C8B74A20EF87D04A91B5EAED48B7917240F4 +EF91A3A1F77DBDB81D8D95080E4EC1DC67AE3788ADA00E8CF885A13DA34F525F +9552BFA79FC0967C2AB66E42F9245CB380EB196C927E3279DE96FB8606FA9F13 +1DAC5442B25B461C586203D9ABE024569996131F178B1302624A4E78EF2F82BE +E9A0B83549FE5275E85C176B7D3F44AA19A0025032BBAE7B2BD928270028C866 +3358A8B2058383FF2FF7A41B4D90F4425F40557BBC907D8C8F835412EF0DC6BC +CE6FE967D55770C0EAC8EB190D7B8D355EAD9408050795BAEB5149114CF377E2 +9A6E11C422F51705EB921F95B548C79775525D0C4D6CB5F9101B99F4C712ED50 +ECB12BC53FE3C703B505A12C8824804ECC3F66F8BCFE740E36CACC94C7E76B50 +A8C037E81731F40AA1DEFAFE6673BAD83EED23B4D1829A6343C1FA7118CA9C31 +C08EECF55F2E5682A445561D7EF396239C25C013AB9B0E3CAC0CCA451846E611 +8D17C7ECFFAF85013BA136C056381F4CBFF31FA4A30A19FFA8BC4F29A8C4FEDB +670E4B65C5FC2AFD7B12DB24B6B26E9A2328AE47204D35E8D981B2D90C47F768 +53AF1FE5A271FB05C3258A280676594255E53410299DF24F4574BF72FFDE081B +A1D2DDB7E42C91C7CF3E7AF0A28630BA772057A39265A74CF07790257403623B +755C99198D679FFC403886A1216EF0DB21BC39BA11BA1910C4599641007227FB +07B7BED0F7B334C4409CA8E46414996E89C99A848AAAF1BD80510470BCB2E5F1 +8D2A32099AEB23EACCDB07ED46641500E3577C561F5834F90C353B03A1556DC1 +355AADAF4F16C5BABC1126699459018ABDEE8117A30F1FF0327DDE29E8F679E3 +F44188845CC71A694285A0061030DE452D5EB85B0286D1CB19077EA18FEAA2E2 +493910C0194C37E859CAC47FFCA73FEF03C42FAD09EEEC4E57647B8A1725406E +1686835E81E7F2D621D6B2FF972904B7BC529DB1912C6B788869E3C3578A0B6B +7A15160577F1545F50294D006AE862A89CEB65DB36E68013A3B71D99CD45EF05 +942296CCC7338ADFBE0C14E6E800DAE58873FEB18428B59298C6B6331AD79F1D +6E4B8F925E5497E4760EBC2AA946DEF442FE076F75D96497FEC6E539D7EC13E6 +368AFCCCDC03A73C1AD82B3BF06D294EEC6908FD9C1E2F8935ABE200B3D4EB33 +A76EF754D2359192B75970B235FC6F59CF2E1B99F35FDEC3309C0978F597EED4 +75655F2533DDF000A53E02630DB8CCF0CA83D305F1CA78428B09E181CFAB40DB +AB63E6796CBCDD7CDBCDFF14A6934BC5C02073F0A317DC0A6FB9C607B9B49FE9 +E102DCD3AEFB7ED4805E028AAB641D0E0EC6AE09D7FFF3A4F594098D03139D61 +AC6DBCCED93EA94E3142299CE717CA0D77597801CF5D01ADF5304D52750C4EE8 +66804AFE77229D54649931E1765BB9AAD54DE84E5E8A49A1CCC80E94D009EC63 +F5CB056A88A3E2D0E0C78CF31754EFA654746F33236478BF53B8A56FE0B51A19 +9D1E51E21B92C158069A59F8AE0F11ABAAF2AC3394DE03389F538958CD709639 +26086A53C600E8D4B2A1E9F65A9982D3FD0AEDEA1272126EB2FF08E06C5A14B8 +263561B5192332798EE1FAC70F4FA20E9257A186277D80E2325A8CC9C650F374 +9EE7200AA82D05D7CA5D4C6D7ED6D38462AF2EA35C1F6679B1767EBBA6F62769 +383C4C5D7A3C0924BF850BD0EC1FA16606A973BD45A0F2AF86018A4B57AB4334 +82FFCF17BFD39CA87D25E36D028E7E35B6FC3DD850184BED63C2E3843A6FB26C +65EC1A1F562591747AC1656BE602CAAF7D24E678A5834D33B4F25EE8EA40D88A +C87860F8F6CF38B3AC16E525C7CB7B19183FA62C6941CC8FC771A5C87BD45F2A +BEC03A4FC754608A6CB3AD74F88327B260914E0B325C246057B013E0E8018FD9 +55FC00A741CFFF655AF36098211D7756F1BA8776EB391E73B8AE402814F8824F +571C0255B878A0CEA097CC8732FBDF57F56A3C36A4C792D16875E88A03207B22 +49F60658A2519300C1887A8C3A64BA08603860DF48302E54261ADD2F23FDFFDC +DC8D44DD1D24B7D0C693263AC1CB7793192C5BB7619C3FA526E3D44832676038 +B2AA7E7F80B1F190E83534DDABC07D4A8C312C25080FEE4AA75F17616616E53D +500D0A9EE43DA70ACCB163A463BCF0255826DEF676C383C5137DA065FC1FDBE5 +AAEC7415E6C5309AD238C4B77A809BA02385B03378AD562D1C3227CD0D376CA1 +57818FA2A81DFA677865A17880B66BE988043AFC0B431B238508266BC074B742 +5C2118FEBC282096246631E897ADB907DFECD2C7569293A5EF0DEDA5B8B287E5 +53017E1CB1FF124EB57676EE5CE07467B8CCED2B63B70E303EE474596F3D8450 +C39893423406A654217C1439A7C4000946378A3504AD3F2C820DC818B48CB651 +6921E0A29A0BA2C332690BA7626451E234E4DDBD744DD801E335D9DB4EED3F87 +7C4347F874D7F15882960CEAC7039E1064E7C9A264A1C6D966260754736FFC04 +B3462E87FCB084E2FD1F53FED1E493C298926B26855280C154A17164C32F6079 +046A2CAC71FFF007E7B84DBD42DA2F4E15209CF8194383B5F0B47F47A6E95EDA +A161F214BB90B548F2C1458F1034AE071633A9105C09DD9EA1DB23CC13611B3C +D3B67EF45E4057C865C0A271F974D9615F0AEDE45A4AF7B1623F725A7A60EBF5 +82D0B59987C89D848F6195788ECDA22F9E39400615C8D287E75300A295431ADB +83D0F4ED026C188E6B57C9A90E5655DA0F56A65385A46DE73E7E1F7482BFDD88 +4F4570C318026366791AAED812B4BE31F3D130C46E45A699C843E09C24945C8F +806F3DBF476D3DC8D7261570C54EB79905AC4F4524C9B3100BC5470160BB0587 +BB04E4C7090B090B769E654DE50D771EE270825F28CA00D86B6814DE04D02304 +9742A33ACAD2D718843F882D06755E0FC71B5B92A1AAE92E1167F867E895BCCF +A5BA73AA8CFB9BE0BD2E4A16523198B21B664B1D41E4BC0E18BD709923EEAC97 +501C90138C493F8E1E229481B00A2A1E4940A8002A2401DBDA64C86B61C760EF +DEA4C7A8EF665E03D0FB63939DB9B6D8FC78B20D882FBEC7A9EEFA6A91E0322E +387252FF8770C9A2F5E2A3818EF6CCCCDCC5F5F21B855F489898A13080983705 +977416594B8B0428FEF03A554CF07FB3B59E5F3E027AD38799533C5960C826E9 +95C6F25B15B802D96D975D8621AD10E0DE65C3B8F09CCFD12CEC98F71EAD2E69 +2AB13A9F2183C9B035704EDCC8930860B48DBB68B8E3111E26A8FF216E80D082 +F6CF064967B1233D711C076D2F3680D9586A87694ED8FCD0BEE0A8C338A11728 +D658C224D94045D9528BD888275E17B50F9A72005130EE5149B8FE243B2F428E +81F8F5602D3E3EB89395E590A1253A9C28D4140DB9769A5F986325A29BCFBACC +9ADFBAC34FFA3DDB5859B9DE3311790882EE64EDD02B79E15406D945E6B454CC +9E658F0ACFF0D13B58C75E395E0BEBFF5317C0610DDF07D18900919DF6F7AF17 +7FBC6BDD3488C1E140DA40049190E4F718AAEB9B1990F1F8FEB61FF5EDDF3055 +4A747292CBDE3C33372450568D371D342F8371E7F9DA016B5039810D053F7871 +A211EAC5AE13E808F44711906806FF0284FA51F97934B41B4E320DB211E33E32 +64321927CBB5E97A82274EBDA4D88FB255791A70A0A2E651F141D3CD1DAE553C +94AEC8B6B2F4E337A7074B7E40BAFD0EB0202C9F77EAA4183208D539A15B94E8 +127C767800748416332A9FDFE6DEC86EE0273FEC43152C064B7C6C24A0389ACE +95DC88E06E1ED02B277A4CB3500B6822E969E36F0F0709ECB4A53949965FE907 +6B9E95142869B12750FE639B9B5AEC8C28F70722049617EF0BAA248D559AD505 +29C89B1B14E68E3E47427A636090A417A74B2FD20C209ECCC88C1F93E75568BF +D1D32921C4BF2B1B999C86E331DDF26BE549161C272235EF9A62E2F04BDEE6DA +123C84DAA783A4A9A179C344DE77CEBDE3291006D04DAFBAACE06FC66FED9259 +AC036F7554276923F8CA84952B8524F73786497344A8210D72777A3F0F402461 +DAA6FF1C3918B8690C409A718C3DDC9326D14D27FA35C25CC13FE4955AE7F19E +FA40A395917DC43A1BA33B7A21DB8971D5258BB07B14E587C3B8C0BF6D186719 +BA375629266754D560240F4C642A20DD6540283828B260F7BB04057D9773887F +30E3D0DC8F26CAE5BC74CF2599C55C7D53A866C9E56450A0C9E8F295C3956F04 +62944690147B5098D87C3315972ED1972EB3681E2141CA1AE9D54F1E37EC8EAF +3B7B27D54223C95CBCF3F200694343771860B4C59B2F74BD3EF3C20A3361824B +C178234D9B87F2831726735E054C48B57705C254DE978FD66B8FED99C179E3A6 +CFD55E11231275614024B0CA241EA4618430F62E93D5702AC09472BF682EB92B +F83B7B99EBD3736CD543F7C02E7F42AC083B75F5C28B4D0AF596BDC1BC90D7D2 +58DF44752BD362E7896C8A9C0320F226DFE7400946754A5F518596BF0CB2A307 +00C276C5A4A7DEDAC773F40FED1463FD62CC21CFF7CB7A850DDA434473866023 +0146E94958A21EF632671B71FE474F1915DBEBA6F6521A2A18382144E3B4CD87 +AC655DACF75CCC795C24241C851A05FB942FD8FD05E434EDDA3EF804B1363BE9 +504F346D6E23AF4193A93930B1E605FE73A96BF9C6778BDD25980D671C75FEA4 +700186F9F1F54814C73B69D66FB36B4DDCE39F3E5908B9E73E385EB116C21BCB +2322A225EC338C82C422ADEA0F8605A8F382D115B1243B0A2CA19EFB2ADE474B +6641F564C6003FE42639E7D862F8F3B691F566D454BB781B45EFC163969493D8 +857468480DA8967235BB2DF1E4B1070DFE9FEEF51F3BFD6B6909E0B19DB09F09 +921E9ADF59D3C3ED0B3383A3CF17A4633738A781B55E43C650A79CA2B2297867 +EC4A4C7012615840E816AFE169DE32DCD6C91159E97C0CD550DEFE597596CCC1 +9DC7CA2907DF60E74B7076ECD61345A90993D198B4442B42103C6A0F7BFF05A7 +D927C4452D15A983CFC306A3FB4D19A5A54D581409183CF749F58F64749AA350 +20BD27B2A702F72A98D584DF32984302EB1804B4EB5CD2BAFBB482E3DF8129E4 +8F4F44C221A1F2C862CAB51EA2DABF24AF42D64DB8829E30076385677719564E +B5658DB1086E0052BC1FC562F7F9894B46734DA15B142E7165F3519B36D4FBE9 +4220A60BE1E30FBFFB67FD2DE4286276CC9A341E21558A3BD8B729B667784C8D +97981ED0612FE2DB733F7E46CBADDCC6A3BA7AA53C6CB34B021FC4545C1EB139 +58EDBD8D2E98A9CBFA4B72F52F1C1B72AF8A99BF78CB6E2F19F5458CD4A538DF +17C18A80F62BBCDCD5B789A7DF3544F9C6DA2C22C580C41EEF179A9E9514BBE7 +4F15B7687C5ACEEBCF6D2229238EAAE66AC13027D20DEE7FB7652731200B1E21 +B2D72B3053C47132594A48501C9BFC7DB924B4810299B3581C1DAFF03B0658D5 +BDBC8E7F6C15B26FC872BBE0595D1A0E764C632B766C33D33F5A423AE987ACF7 +974B18F39F85F7A063D99B451B7DDA3C24B0FE4E7FE6FCED2A231B27EC109962 +EB7439AB63D48FD4813CCAE4D3F53B0C3471ACB52A5DB323FF4E1EE8373FABF2 +6D844FC2DD98598B9647BB4DBE12454CE24FE162C3B4583D593E67EEE093EFA3 +B8EA96E3D20B182F8C836B676B1CF4CDA0B5C283E2E2A7992453B9C09684C5D0 +9FF000F41DE580FD799E7663F918E7BCE5CEC8CE05473B660B343C5564BCB7E5 +9F4DA3B7991EC910F0DDE4002D54D459AB33770ECB111C25B0D327194D3DA61C +2CA2BDCC78DDA1F3A51F3D7EFF922D3C9A7D5E88D3F718D4224A0A34A4B91A12 +EC7AFA2472E8977F1C299380AF7D02E2423D880CAE31A610E0158C318DFF3802 +9BAEA372D8168F5D631B7CCA290C93314D3B96CA1EAAEB29D308499CB4AFDCDC +49429DA85225B0429998746B2B2D4A4D45BAA8575416631386AA7B620FB272F4 +69ACE1610BB6F651B154ADEF7F8EA3C51BC62A081F547181A3A18703D01E020A +5DC4C1C934D2AC4A0B67F545B521D9B40F3255E5E9DE9322FA51652337A405E4 +5F0CF9FFD3FDD10AE339AA2D91BB9D3637E72738620E8CB14CD87363AA04D4FB +79B0127EC187E8767D3C06404CCDABF583404809EEBE86DD8365E5A61BFEB1AE +492423B4E5F9CA962357444AFB75AC7AD2F387107AD76171F194606042072B9F +18B341BA7D01A6EDB28297DACDEA900F301D95D33A89248EF42C3264F8A1B47A +5CFA54118803E5B57CE7C0068C6732B60A741E20C981BD7C4BB1717F5774AC58 +92CB5C82DE1D1DF4A9E4B945D7ECF90E9086BBC455244C51E7F6A9AB801CDD0E +7E5BC63515FEAFA4238F4765AC04F3E09F1279FF3943D77A06C0EA2E52EE75FA +834963A8FD2929735CBA89073CF651DFAF18FA8D91BC1022FF345C3E6705899D +13A63FFE22DBF6AF2150887E12D9C7C55FE026F763D3D15D6F5DDE550E21ACD7 +91E9F7937D3F2FFC2438EAD533076BC5003E4CF3CC4A98777B0615A2D20CB825 +93C60EB16B5BBB653C91B8DA49BA774C81C3AE8F12D5E84D49C431055B9442FC +27BAF5F30D341BB3329CFBCCB09CF1A2FBAE92525E9D3CF5E099C0A72E1629F8 +D08CDF8A6B50CBD76FF67250631D13EBE30787D2B912AAC23C6973439C1980A4 +676D23FC0E90644BD0FB6176322D94EC8B2C32DD0A12065019F0E8926A14B7AE +C9D8905D9B79EF23446388D9005CBF63EE7A197BC4C5FD2E3470DA7D46DC2977 +B4C6FE57865E1C0448F393E0AE7D44FE616F129D7A0EB9ED1B78773EE54032ED +1DD3672B6923D188014A61F67ECE29D913F6CE37D014AD2FB1CF07CB8AB70530 +FC5D413407B6E01A3DDE44613B8A7AF8FBA104D0E03DDEE4684F73E97118F4CC +F74A503462C96F866366C2950BE3F19CE061EC7834C0E732FBE592DB5AC2E088 +683CEBB978E109F198E2D39FD2E690C390DF290F7709DEB6EE64F8B88D3993DF +03452F2C314C04807A63AB766F940667FA3B6BBF887EECB96B3E29424B3DA03E +80E7045A2578BD70F50E0F20BB6C3341560A2C9D5241936269C36A9C1D71500B +9C048AB6B9A5E0B50E4D3E0F63B4369B7A0AF6E1DF6C8CF5CA4111DBFFC325C9 +41F28237A7F731F99D5CC15F3AA14E5B4B4E6F7C617AF408275091BE72E98AF6 +456F9A83F05B21CA0429EAA3BA48CC5CD29A087D96B1279B9EF5551794BA809D +6927420E8DBC16CAB46450F1C0D5C8C8B3041C22390F9F6390067EACFC174AF3 +C9782CBEE35675872C4C68D3FBF78C8ADFC284E82C52C64477D228181C8697C9 +5E98D430816AB96DB01299654FB097DC281F0A60D9F03F84C973A6AB85EA5889 +AF3E8C64327D25D06B766F88973D5C75449D258D8F7A8F1976867644EC49D2B2 +AD765695B57D3EF8B8ACF005EC4A6083E30406C4887134314AF75BC66239B2C6 +44D663071AA7858CEA822B1F1DF09F4099D3B0F7A40809E08C0417BC05AC45BA +30776357774331D19C0937E7DA9B93E490CD9E58D68B227579A840563DD0B5FC +A6FF6D2B9DDE5A86AFB467395A2DE7F0F17494907B5658E29B518078C19D6E49 +E9FA0BDBCD3CE2579F20608BB5E9F6FBD30BA9A9A7BBEB411F348F69680DE209 +2D450CAD4AA515EF0744A9AF866BF129E92C57D523DC7FDECB9495F3CB72DA82 +5C3C50BBFA161BF93955972BDE0B44AD8483B519388A72717F6CF2D96F806F5A +204141542454453EA24A95A4B7BB7EC8530CFA497732F57CBC4F6A778EC05F81 +4D479F48F6CEE8E893DDF75B3C6429D1F593659E55267744E046627EF474337A +996F2FD56F2109879BD8A98B4C7EAE060F1770DABFA0973030CCCF297AA2B3A7 +5AE3C82E164304E43212390C4BBDE2606B124AEF5BF5DC9405F39F76C7448574 +589A6074EBC89C5FDE3542D723ADE4ACAF83C617D73BDC4CF4670E414A0F7C17 +7C0EDE2CCB0D5A10F0EED3CDF41CB790BB8EA61CF1AD9FF3EB39CEFA61CB13DB +378DD50F477C9A5FF24448A750699CC73739254AAE0E26886195B1CD7501DE9D +B60CAD2D5539BEABA6FA7BDFEB572CA0FB6A8FE46C6C219834BC23B3E4DE6BD0 +522028E9B7EBC83FF1E17E28A3C9C1BE0227536B3E917E6C2523121B7A6D32E6 +A007CCAFEEBE1633D1B8ED9C0F2C9D6E23141E75707FBA37897E4C0CAD0E1BEA +603DBCDD7747690BEFF6314A18186703C62FE2903C7D782C677AAFA105ADD4CE +C91EB6BCF2D327A3A6406C626A07A18473043F3E1B8038F873048F25B228187D +7226BBA7763E9DC0B43895C088EDA7A6A1E367D905E477F41ED43EF267B86CDA +481C8FBB1BAC6E6E0AA4FD2E979BEB703BC7366ABEDC18F71942D87928155C75 +1C8B4EC74C2CD9ECB7B19D9864271F8A4AA5F57D5B684471F273095A07892C91 +C946F615723E17E8025FBBFBAF16687DF65BDE23B92BA8FEDC894427C91AC4E2 +A3605B5D49E1C13AE8CC26902E92378104577A188B45EBF878875FF1B574F34B +9C2BA7781078F7A9CA7228E781D70A9FEFBAE5AE8319AACDA99A2E368706A2F8 +D068FBEF3A103ED7D71223DDA428F36A07DE9A9B6C26F3728296CFC3272A8E1E +7B372F5D9CA4FB010ADB189075DDEFB7488F481E6BF8490DA0C23DA26E2F582B +1E0433F5F019AEB91C663C7B4BA4FBDCD53CE9FEB02D5261CD78A1C17C30FE54 +EA8455AAC1204908C191698FF7E1CD58B6C766A6DD9E68AFCB0D2EEE7FA1338D +E0D8072E2838DC80FF6A028581CAB8E03A59B1BC7280EF55B97DD4365A28905A +5D0D198E6930333FA1013A152F5DBCD8A36DA7B52CC1BF296D768CDC7079588F +407DB466E7B70BFFBF82FC6751B65347A9523823E992354233DB98E838EC8933 +45C0C3181EA91C8CEFF04937B63D0DFE2B46A421820BA8CA5F5499D481868E51 +CDC4596D648F23F5AD603154996304A2C27EA1CA6E415C2F15BDFC6B01D2FDAB +638DAE9355FDF19780A42ED36A33E9D6A216D455253BC4EA831C1419F5DF7159 +9772F00CF17AC084B10C4F11860E31702C911EE925B93D994F67E2926B73213D +68AB7A0B7B42E150F3CA1E30BA0ACDF4DC74931E6009334B33035201C698F185 +57B132858F43B7A1DA50415E3D883342665118C3CB952B74BFC7BCE4E613A0C2 +E73A167648E282D8235FD84203EDFEB2A8899B4C9818D91483715F894657C032 +A5CBEEBBFC10B7C5AA59F8883FF4E799E0C4728E568F46CEBB4AB0929DA6D001 +A8FA70332C827535F8F05CBDDCCEE7178C007E60CA1AC783741307D5CD9C3199 +E673C480D0BEAE9DA98ECCEF3BC798AE5286FBCD3B9C0D4BCED845E41BE0AEF1 +763D293C78622EE9818DA386CB77A060B5296E06A44661F1B2289B7857C73425 +C28CA50441AEC8DE567D8504355E34ACBFECAD86A95E82F0D5A09C402EFDB239 +2A499DB371B08634CC07C592CF407738A667DF57D8417C4CFA790619309C5179 +82160A93C4841844CEEB8030B65CE23CFFDBBC0E9A48272A53A9DEB47C991A44 +5600168B35F73748C7EBB2460CB56FD313054E15F564254B074C68489BE6EC8A +A4C16F287CADFEC52FB61BDAD3E1AC87518DE6CDD7921A166B800C03E8F1243A +2B094B68EBE2691D726CAA51E554F96B8ADE6D019C24DD75C7A4F038686C45A7 +2268359BC73D4F0154DED87B863937AFC3EDE0C56507256C0230C43213650D07 +93BADABD4A9C066EB2B3D9BD43FA8169D87791C3A9287DAD03CDE950FBB3676F +D3605535B5D7C9BD0118308F5A94C4EB29E842D1FBE49670FD7AF78DC31610E2 +4EF86FF61693FAF103AA56DA7A920A25B394A461423EEE8231A1DD3FC34F927E +26A717BE37CAAD64E883E2E22C1718C1E9A4E69C977DB13411D427AA96569E9B +D7522FF889462400293E2FA2F4100340578D19519CD9ABF77EF8CAC1571FE000 +1080AA77E574DD6BACFEAC54A1FEE5CF9B6F7E1E7429C4E3B20C4F492D8B3B91 +9FFC3B6FAA8AC36FC882AD4BF6171C5147177DA06295A82E24C3AFB404C200E8 +6103733C515894B0FB2AEC498FFEB5A20A8E020D29A807CBB9C3F7FE0CBC7175 +89BBA2230D6013A3C42588DC018714BF4FAADADFA6E31397FBFBA428F91F79C6 +9A757C636CDFD43E3F6214CD4FC2B56F10C542D7C53FE0268D8D30AC95A2AE51 +3A6401231B8D18A9C57571086CD8F58FF109E7AE7BEDAF804A6263A439D4BE3F +94CFAFB9848B4903970B58DD4DE26F629AD2E2A2183CB3054ECC4B9962A89661 +64F15BD83E84AE8AD4958115B00E557FFB569EB78EFE95042FC0D73CF577C624 +ECE57E45F135BC904D5C6722D791040A426C9766C4607CD5CA7AE54298ED38FE +60ACA2735BDD35A88F5B394990BF320D533CBFEEEF0FC0077300E6FB3D808EEA +BE8C4416E964A5D673093480166B503E7C86431DE792F71B0025541659E26667 +BF303598A53CA0400DA9FF896D6114F5293FB6AE8A1481EF79C044AFFD1C3DE4 +8A06216AEE80BD03D1C579767C296C49A9B4434C3317A19268E3FB8162198D56 +3611EC062C551FFC5E17A76DD094B1BF2DC29FB49E08537224389B666D105539 +091F8CAE03B5C33AFCC39F0ED3E0B154005BB452E76C73BFC3C79DD85E11A59C +95289C023A19DB7F061AB2A39BA47E1A9E81547C73796CB226BB8A55AD2268E4 +5564A217DD47C2E21AB9D1D816E47A9D195022251B0D82989D0F4DC19CD954DF +B1B5BDEC1D7DFF81988967A834D6236549F4D4F484A7E173B2400CBD6E5839D8 +B5C5EF5DBFA5717F8A8FD61B0319067B908795C08BE68961161D7B898A80D9AE +9434D738EC57737E9B2DE0A7CD1289629D94F21F872442EF3D0267A4424C1398 +309295B259BCC8F2C37A1894F347478DB2A7D4A4505942CC5F7ECF884C5D885D +ACE1EA5883050D0FB58AD394F96AA583074ED9BE783D6B7C1B12A02DB2CCCFC4 +EEFA4E50C8FA241CF4BB972C19900F5B0FA8E6CE6F2C2B1495C996D5B8D1C4EC +26100C8E5A4338685050DD2D2A8E5395BCAD3D9064805E85AEC31A8B90EE0978 +680998678A2D5522316D7D1F5B2EE30353CB249E7DF0646D07E0202DD1B7BD9A +66B151FA113C809DF13EB798BFF29818C2CE867E32EF3FEB32BE7299DC51157F +CD9F9059E4CA3A87DADFAB36F4881BD781EC929E9A728C9FD2FE76B839E84F35 +4B4353C08F1A95BEDA491F4379235C4DDBCBD70CBB2BC34B563129F506293EBE +C5C516EF82B087695FA0F1DC412C3BEC7142E5D19368D904F8D2EAEF62FD0570 +DA36CA4EA8B866F9B017E7012F4A8AF1A13FEE0F9C568A7D6A92AC54679E9451 +D7BBDA3C9EB65A15BE4EF37F7C60569DA22F0BB241D7CBC4BCE3544C6C78AC67 +49226B987356C108626B7F07169F2B2CB49AF675AEA691D04496E36875C1D8E9 +C4E792D5F617835201531BD533CEF81C26D754A63460AD3927989ADB385BDBEC +347219074B8E68FAF8D5EE8A26635251C6A59D1122C7FFC71C2D459AF4616E82 +23C0FB4FE06DD91ADCB2C8C1CBE7B2E7AA01414F38E93651A889D4379CD4BE45 +F709055A8BC91BEB8345A56ACCA76149A699E21AFA6F6D423A4A715D77DA669C +51884704E172744920533D18E877EB348010C909946A2507E22A3CA3E3041EA4 +60294E8F205528062DDFC3562733BBF0922A87CD2D5F421FF9FC94AA2D380A8A +BDF33CB17415CA97A74009E70B0A7DE15BF1C714C8D63B72EDCB0E8AE1C6986B +208C9AA1D0B6E9453DB51E4054B0E4E4A544F713BCAF55B90FA84E5DDCE1F132 +3FC5DEE7BA419E006677D2ABC0E012385A049C3B9C51841FECEA0ECB262A0CA7 +CEE05A69BD5BBAA0F8EA06D878AC3B81829D3891A456BFE19B0D9B06B5D715FD +1C0BCC3D304FE9F1C830DE89F6D526BDEE9E886621C13BEE2ED59169270F686D +01A7440CB9165022FF6AFC8EC4FA7C17741FDB6D2FBDE95873DA69A4F8252B8F +7978F7314A143F8C0414F532B504F6A6A42ECE5C0F09B9B3FFCCF68EE81CABD8 +0DE789A64AE3F3F7E3293411B15D1BBE264355F096FF90250D0D2D43C3016FFB +2A59F70FFE9636208054ADC08C8D02F9DC2AE567FF26A95D67923343C169CEAF +F14E4CC9FAF053DA5155520CFDEE63169924357A5C3158FC3D43A7A42E4C5E2C +9A641E6E25FB2115C40A03472C5B06AC4D65A1854985F782B387EDC26ABCAF2C +9837E7D331E57EACD575B3349D17706C398A79BC015A0B01A1977459B86ABC6D +BE555CC7776C0C7DE01A158608A0AE3A3E9289A5D8F2CBA9D6C63EFBA892695E +B7534C0453EC26B7743143F2F1002AD757C177F5D7F16436DFF4ED6AD12CECB9 +D9271BDE6ECA276C3B2AC065029563932B5D7E33CB1B71B996C947546900987C +0E4490EDDD6EE78B6DF8D723C19771D36656F3ECCA752ADBD68951ED0E79D35E +D38852D8AB1496E0960D14C1C8A687D31913589A491EAEA3D18696AEC361D483 +4FFEBCA1FB33A8C600EBC456137A7687F4DF40EDFB9A3B080466C4A470457538 +3823E06B9E6DFB287FA7BD7042203D0A6ECB0E47EDEBF97016D831E0569BB60B +F2DFB207C631EA5AB58FEE4D5BDCBBC4B41CF0BB1F4ECA465242E509D145538D +949C0233F71C27407E75B11891045C9F7801A973EA41AFD742DDEAAEB504ED4F +64D6E0B7FB9263BC65823D51D593EC42CFCBC682CA4770C0CED5B238063DA5D2 +716A9205CC862023BAB6937D2A18FF5D618116B45623E06172EC30280C21388E +4D53D077D5EEB77F2B300C57FC3ABAC1E89AD317B46F1883F5F83E7A8AB1891E +8110ABC7FEEBA203BC9F2EE2982D77BEB0F23904EE340D6D6F72B1BBDC76FB3A +8E69F3C5C04F29E2AD924C390DEEC073AFDF3784DC26B85B7F0528E3B61339DD +1E341DF261CE097C3BB1769FA4C6E728D678ED7B928FB44E6BED81890CF233AD +DF4A72B95F85BD95C5645D8A049E89D0F94AE88ABBC66F5ED01EE9141448C37B +D47FF55ECF86E13B47EF1AB27C5CA26F7C2DA5841D47B3E602CDB2125DC345E5 +74A8E293DBF4032168983A6B439B189FCDFA5FCBA97E166C65FF0641E0B1A7D0 +9AF28005F1CAE32F1D95A27BCFF98C139911199AB6CAEAB49728AF2B0A0DB6D3 +7419EAD54E2EC55808C6C176EEC97477FD65C11BF88BFC0CC39BA742BF841FEF +AB317723C3F95445BCCD5A3ECF82C78C262B200894C983AF871912E47342C0F3 +13AE004F1E05CD83125AA4AA5161B1DB9D3F1A960E682EF93123EF53145A9C24 +EBDBD744307F6AE52FF1D6D43C3F667360FF48673C59D04F12C3AD8FD361C4FC +8F2A902193D4EEA3E9DDFAB0D323E2E49CA4B4FB691F9635AF026CE1DC94506C +49D68F5899BFCD1B947C77A77B1598CAEDBB7AF0F13221B59604E91140959F92 +8C49E5AEAE03C019BF6D2FC50B5BEE2BACD955319BC969EE0FA1752BFBDB1380 +042B1C0FD79AC43B5452A1BA2281982E73F681FA76AF1C9C4F4FC38EBBEFD865 +4648D27D218C40BD2C1629E1DD79263FB7FC2005BB3D06C9EBFFB22F67F356C3 +D20EAE1DE1D11ED1DB1D0E6F2F20FE98A28EB737B6F5B3307620A0199A076B49 +05F16F4D4A9C39E1B806BA6ED58B24657C2427AA6C987619D213AEB93B3754F2 +E247612FDADA5F5AFEC1512AC93181F8DCF831DD78271F12D28B0250440AF081 +5C141B11585D8929ACE6C79BC97C804325EC5931EE393A7B964B14B376694460 +9C0858E833FD66D0DE9B7D6BA33AB8FEEC15C99E3E5D329676F0EC2FE5E539B6 +4957002C77505CEE1027AF7F1BA529B45942058EBF4EA22F1F7FE3C5DD93AA1D +9F3A228EC45643CC629AF5EDF9A4A33EBDB7CDC0ACFF4A4326ED51BA05C88118 +ABC356B35D4DFCA057D8BB3D8ED04DA0CA49210F352E589748E63F2B3CDF7281 +6C3E8F46B9C2DF790FEAC41637366274C88DC4C6297F1501436602AC7CF94F17 +17812F8230CBF820885C3BD086289B845ED8F6B8B75015744DAE3981E8A1C691 +93B1D66ED2E41EFD86C74E12276CDE05A3A929E529F7781F1E49550B44A26FBE +DE59A39FCF8CBA8F05862882D6AC13EB83C20D6115D4BF9509F8A506E5ADDAB1 +ECE74497A17AA12D1CFE36672C2D1A4F2DC52DE56E8AE6CD1E72B8A4F850D3B4 +1551EDEDA4FBA36379A26C3B3928AA8AC63B5FF9D24A893EF019E6FF0735FC60 +7E95D2F29AE0ED922BA57F85CABE2AA44498C160656779860006AFBC4BD6685E +ADF006A4936E52637ABCBFDA6C8ADEBE083845A20B9978A2592F98A8E92F2541 +A84F2AD2DC12A81C071C0864A1510CC6BA44226B03E4DEFB70112B4EA34ACEF0 +0FAE9A6A783FD2911ABF67B974FBAAD4CAAB514DDC66C696C003E728262EF4C4 +4AF9AB3E23EC019EB66269B65CA53271B20CB71962FBBF8967293C1A81369021 +E89CBCFE25C124BD7A8A1F7C84DB681A545692C17C5A4C3D036B7E61C7C8976D +A3071BA77FF9F7C9181AC0B09D02DA041981A7FED34879CD2AA43695CF8BF01C +A92100BDF60720C5633E3047655240DFE1E96A85C1F021FC237F51318A9E82A4 +563725D2267D7ACD7C78B228D5A6114D77F9F055B885A279F7198F0993332786 +A3A6459FD9BFFDEDE996C0BEA951C2BFB14F7753C3599F630B00B6A44C46B2D6 +94E02C6E3CEAF82C3F730DA6486A47C2EC4722963ED34D3E982DB93A891A0789 +5CD8EE15405EC998AC29D6374356F8E4D8125EDD844183FE31A2E00102E276A3 +7F138310B428AD8D3BE683B8525524F14E6ED10AFF68127B617167F1CA432732 +081B87D78B6667E92BB1F5794C6A66DD830154311C59A43BF96100AA8A84BBB5 +7F201F4F25DD15E87F6A9BD20A34402E5757ABA204236C00541C68A52B8C6666 +FC3860679EB3C085B647796B424B598E97F6EDD31E1C1FDB740FD735A614B4F2 +93EC1CA3ABB24E4A2FA853AE8688E535FCC99160F55E28D542B2C48644ABF948 +168DA7AFFA42839CC7EBEC5068A78AD0468A6697D0848A6604CD020BD92F5362 +DFA41E55C003B702655FFA0315EEB6D622DEEA18126267998875C2F2CB9D6A0E +4AAACF51EA44074ED7D625572DDCCC20982B43B7BF9488A5CE852CEAD090719B +8C6A97257123E8EAAF13A06DFA4BC20801079D7636DF8B8D5F5B3C75968C441A +F17903004DE8DBD08022CCA7C0CE9E0D784D7F571D4BC3DCE4AD4B4487CD7ED6 +7E4DD4516FEFEE7FF9D7190CFE093423D9FAB6D03D8C7607B9C8491AFFF1333C +C4A5CA33C669A889D0C0F174E9AC7B2B81CA532D70F86D820A8E0BE35B21F16D +C1099AB373DC1EEB63CABB00949B38DECC52B236AC8FF44E0F35858ACD325E14 +4A21CEB8281D10BF798F2B3E460E89E54A8B255A50623743E7C0797644C92832 +60F30A5B104827DDBCF075872DC910E480A48D73118D4541B19AC92B1086E48E +CBDAA0C4BB3600E546D538145C6C449658ED66B292CB2B10431B5517DADC3269 +0652E4287731B70785C23D0A5A7BF2FCECD6481CA92758B74487C3D50FC8FF29 +FB973E1E518130D2662DDCDD6199422FF55521E0715AFD06C43AF2A99999A5F8 +B6EE78F74BFB8F845CA9FE3A03A50218495724850CC8A66C92A3C4827679B4E0 +02B86A7FCF82248A7ED56D5034A349F920FB25112CA8A84E7EBDE228DB05D009 +76B948FE201D9F56E64CF491A7DCE17ECD0EDFFA25E1EBA6A5B5F8B9D811F559 +9A341D65B51A32B2230FB689F0DB5E70967A2F333194FAC528AF2CBE72C31A47 +0902B69CEDB8BAA7BB1381A4D31EE1198324324E2373263CFBF2D56F7841E493 +90DEDC910506EA457385BD968786C753ACB24820E00D74F35BD07195E2959044 +0BB0B53AB9B29D14D0EC5A35ADB896440506D070D0341A5127241D914BD0F82B +A8BE9416B728BA2BE4E0214A4CA7D354E229AA83BC5BBC744C811A5FE4994EED +46C0103C40ACD7C5772F22EE718159A80C6ADE365F84E1327A5E8725D8618176 +7F331D3D3EF56CCE69F36DA9E620197E52CA7B818D4BADF758380F5B10764C7E +C3B3ED839AB620B9555A2EA838CF5D2E9F014B9A3C96BB0EA054081EB07F604A +E2B1A9758C336FD7EC9C7C2A1640725485C5C7B353D58FE00259EE1C709E07CF +FD54165C87CFBACA6E3101C23601BF20C689BDDDB94BD6DEBA876E981CE95C45 +6543A8BCD8BCF2549C97401442E3ADAC213C1885CCDEBE8AAF47A58FEB1B15FF +F2208DE4F031C8415E83CF7A6611464B491EDE2E9AC7D9AA84441F9A6532F44E +3D142F77EBB3E8033F23C93923F0CE6848F5AFCA7AF0EEF8B8DE8FCE52CA1C92 +1BEDCD239C712A1E6CECD22EEF42A99B6640D59C848F9C630F52EB49CC6E881A +0C2104A3ED2DB85AA79874C5072389A73878C01D45AF07B73ECD178FBFDA6EDD +7380E9FD555E929D92876138934B8434B0774E378C1DFC1AA1E65EE9A4C69ECF +0BA16C2B96CCC0F22C8CB492965A8F6AF7322E4142D8A40A9A3B291685B0BA10 +0EAC0E2A92B955B7A115FD3F75B0F081ECBBFC40B4E81B76BDD5F7CD3255E4B3 +2EC25E35718527CE70470C47D4D160871C8F7415F80EC718338E41FACFA607E3 +C29F11193EFDC1C96D24D9ECCDBDBC5A0541FF5ED2915623346D61A71BB2DDE4 +A273CE9CD37FBAF6903058C7FBA3CF4507DD723C983BFA5C2CE4651E2B3ADA8C +28D1525C8A184140BA42C0B1878C5883581826D7F0C02E6753526FC538C0CE33 +CEFA24C86414F785D2F31A5BA161E696782396E117E6B3D21DF1EDCFF6930A8E +4D8AB720D67F93D6F0FAA25894208574DF575EC31451CE3D196319119BD46767 +9E7B1C7E26CCDDB510E19A057209D1F8DDA77F830752735CA95B8B46EE230338 +F37D528BD533640FC7AA6F4CBCDD5F0154EED7625D9BC57ACAA90481BF18ACA4 +4CC17B1FA53AB188F6D4EBE0E89671BF9926B8B87A6EE17F782E1AA5289E1A12 +F791CF64CFA9BD842771237FCF330478A6AFE0D6BF9A80CE2CE48784D0F1FE7F +E36517A0AF2778ADB4913DCBA5CCEA8F423CD59CFBEC56BEDDA8B3E03E048CD7 +4D670F5BEA7A44D309CAF775DF677EF3E6B5131E3F28CEE8F506990446D077C7 +8293B4F57F7FB2D175EE6A12A0E050802017311C15CABA6C5CC5D56F77F93CCB +A25DE6C9DA9C304B98100B26C5BB88542CEC07C1C1AAC21501D933E2B2F74E8B +5153D70756AFD54C0D1CEB3E70CB40270FB03CEA23CA0AB46BD904919A931769 +FDC333FA2B2D55CDD99148CD555C959BB511732A90DB1B986A3EC1F3251925CC +985228C6BABCBEF2C59A590F22E1D1DF16D6654B35FAA7A1BD7ACC0EBB529437 +408628F19838384635676825548558554D6CF471178B8C0CAF16CC278F58AD3E +1524989C16B63834A76133746B1A306E2F89C52A4209999F0E63DD7C85058894 +98C18F65DE1E03297C51BB581EAD46557BDE7155DAEB76F74E3F00A32271F5E2 +E7E909D1826303032047F61130FAF8BAEFC77D524C6D1F8F2DB87D1D36F1FAFF +5030AF4E0BDFE670712B3F01DAEDFB76C93CE59B766295E1C766C1BB0552751D +EFA83B7080B6156FCCF1796A68CD83B6BCD4DAF3353361F6A79DE994F0833A15 +638AE470FC6672593006E47301ED6A1C8727388AB31EEA34613CAE8E8AB07FD7 +6A18E36309FDCC4834F8CEBAE4AA648754D679DD4BDD86513C851A8102399740 +7792F8FF58081A0B4E84058E4C1A2D6BF680CFF926DCBDDC05D73627B7980E94 +D5E410848B1B6FC742315A2ED6F25635EB0D734C82480157DFD2F383E6508EAC +EE70215C509B0B2A4DB87E6ABAF2E1AC115E6E24A55815703E0E054FC445CF86 +C1E0ACEF9AEAE22EB5D627D7E96701F93D080DB33240065D31745331D210830F +DD0DDB83FCC6E4645D54012254EDA717ECDEB5C114D826D8F2E95FFC67948335 +2B0E77D7541876CB99594FA3C629FF182A7BDA378C823826AB0B24006F80406D +5DA1BDD296992542E75B74CD79C2B4386016F415DAD1C183C3330252B1CDEA5E +9129274519705F35769DF987B207CA0C68F3E6247F6119B01802A55CA056AF0D +E8247CD5EE363A61D10855FF3A495861993440F77301477FB4EB0EFFA5D71568 +D708EC717428323DF6942FC660961D005CABA2388F00575F4649F9FCABA1779F +88F964A301A6D5D1FC02B327B55730031CCF60ED2A15E6039471FE70B9C83C32 +A25E93184F3A994CCCBD2EF04491851D59DB819DA46DB076C3ED8230F0AF49C0 +A2224E5CA6ADEC27C15D0642EADB6A63628EEC98F6E941394C71DF59846ECBBA +E7BF50E44E3D78994167B63641F8FB22460867CEB24CA37B08C91E49F0C47D13 +10F05348092FEBA6250C635FBA5C5962AFB24C950DFA5CDEDF063589804173B9 +EC2979D26993378BF16CB04F4EECB360182CCA00094A7E6C9D16630A1089B6C7 +B3E3FC864CFC613F2742065D4A57EF6559FA02C397AC666B8C9C35DBE5ACDC5C +9624EB9A2219385CB8C83DE36D78ACB2B4A8A84D83C4DD8700534E00B4C4AE0C +E431200DBC2C1BB217159174CF4EE41B6AC8746598A999F9F1CB98275D6D4CA0 +16C45FF79EF527AF3DB2FA45CE3BCB2E5D46D6A8CA3B7D81DC5679CC7D949CCE +7D3F61F0FB9313FF41878D6C7058D8B2D3525D65C7FD7770D119E7C4E93898B1 +6844F80F0ADF8E84DD888594153238CA44CD3BB791186B47C66F6DA75F5E8FBC +A623B5AA758C66F72C6E908E5490E95C1E73E674CC58B1ED4B385130382A2C48 +0D815DD704ACD6A68DDF70D5DD361ADCC1FC831C9680C02E77FF1413A025D992 +27C683ECDA0447F1A027DD1A47CCFDBC30AA59D35F731255609B509406D8C22C +CB4A0BCF1654060D52EB4EDF21BE9F53CFEBDF408C5EA49B22A7909193FDD3F8 +DBF9F403B961F6412F2D27D7A1CF7E18F46630A0CA925CAE8CCB10CAAF42A5BD +BF21F7845DDC89B892349BA7B4BAEF3B85593FB06A267075BFEEC3A857CB73F4 +402EDB98A70D15F48C2F61B3CBD7BF277304DE6EE36E9A55D2A1805B37CA9A13 +B37F00DF6FE4F8508305C3FBF257A7884A7C4D95B6A7DA6B2C4BC6465E0B8054 +77160504FC1976456543D6AA5B521E88A74E5B2FE7AE6CE5BEB4BCA8683AF38A +7C6059764A7CF8E688EEBA0CC520F2AB06A61A07CD0222D2270ED4E17CED6C77 +565A18155B38795CD27D7001E06EFF2C41C80404884E878B64E60F13A901CEBD +B0AB679183726D2808497859EE701055276F2F0F36763FD9F58FC1190A59B9A2 +65FFD2E0278ACFD8C6C575339D8B459C4DBDCBC4DD985F45AE1C7AD96FBEDD80 +60AF0F7FF0FB1C8960BB4BEA08B115BBB2B3CF7CA09B56622D59CD9403C2B2A4 +4E6A7E47B8CD864C07648D07AB07E8CE9173BB2B9C349A282AB8BA11076E1201 +69CC0C54AE2E893FA5D95E1A9440D9F991E29CAA259220DE5F3B99AC86DF417C +0F50FC176CE4A0DC9EE549D2FA86D80629225D51F289674963CC78D11F8F7406 +85E67DD88CCC905FD02C0C7125D7F7C2029114E399489DCE1490EEE5DD8BDD16 +BCCF12ABA0D8E5D016874943E64EE48A0CF3B544662F1C107F8E75F32FBCB827 +6B905EC3F579BE9AAE714BCA85FE11E8B6E29DCE0044AB28A9175B0CF183A0F9 +A43D9742DD8E1AF097D3450F83D97855265B9F612D8A1C6165C339F0CE092652 +F3843DF0A898EA13374098110F461C42A17A10F73127ACA85EEBD115225B3FCD +870CCF74E7103E305AD55C8D77B528000001B2593FEFCBE9014AACC6E83581FE +E0B3C455B02970E509EC1C54120688DACB24517BAD30395B4261D3E266C55FC8 +5CA30725C79DA01BA71EAB826745A22DD24AAAA048039BEFC549538CCE9A4F3B +75A50AF2F15BADC785E37D65A772D919482362A3E7A0EF75B61461CFBCD6AE1A +7941F680FF7A0BD04182C21CAEF966A52DD4CCFCC22420CA5433D148A0D88EF6 +32AD0BF5CA6F3E031670EAD28609AB31E3EF73A4DC62C984CB953274C53F4F9F +165ADAFCBACDAC894C0523646AC25509E65DDBC032E798EC31CE2608F1D89B9B +3413911202DF9C0B291BCA78895AC01F4523C7FA4174E2747032E38B32716E23 +00A6F1EC49633898D4EEB694DA03E2E68E607DBEEFA851F685D6EA3F242140B0 +FE1C632CAEE6E741B9AD5D1D51C0D7D6DADEFD3C084E152F8D3341C3ACF52469 +256FE1C5C7ADDA51B355DF0CF42604C9840D6C01EDD1F5022BE5B15E1DB2420F +44DE5B6E7D1CA024F1DA52AAE5F2B3E080B95D6B65914F1A8D7D6B235ACBE85E +61493A5EB7C06CE2C3CE32A42D9508AF914D4ECA8EBFBAE318E6692DDB02C811 +DBD168004760E33BE0DACC8A5E77D7850795B7FBFFDD85A7A12DA088E0D04CE8 +5946CCDCD41C221A1E9729DDD097218CB4783DE0AE30E333EF00A8AD42DA7C06 +BD3BD7716C10EE6F801D3928277AA87225AA33E8141A47FD9BDD64FB6D29C60B +F91DF1B8BBF9154811DE01AA799F5B9B1683A380429550192C09F052F027CCC1 +D42CC5B2E0C4A0FCE424D50AB5B82ACB7A9B1C7838722D3DC7E84A84BCB67061 +B204E8D1715A8EDDAD4EB4EFC2973EB418666C7F57580278514A6C5D0869AF3C +0CB1D99BD5FE72A665380ED04AC4BD8379A1D5B2894B82B8A5EC319302DDF62B +ACDEE383614D564D8FB8A7C6E6D1FC5C5B70C893ECCB540540C23EFCB7BFA574 +10D7C828495FFE4D7FEC9FF1F727F9CB0EFE9536989601F746CAD0EC97778E96 +D62380591A4B2F38CF1CD42A62B1DF45C760753E0E4AFEA5FB90309D412BBBC8 +6A1FE55FAF842BCD90BAD6D491061BCA6D8E589675B9418723FC18D3FAB84CEB +4956C5868435D6DEE4D4F9172BF165C0C22BACE30A0E10B54D49B04AB0FA95C9 +921E11B6F12913966E2488EBD830CCB05F02AEA26A0E87C98ECC85660BA28C1E +F9C2E577F087D8A844537008C8AED065EEF36CC3A5FBDACC6756EEECA8356873 +47EB1F955743F051D9FA4F51AAB900F7A8F656BD967FA52CDAE022EDB5BA2673 +C775BA4A6FAFAA1243CEEEA4414A1B2ECEF3B40BA6262135301CC62A355331FA +1EB4009CFFE5CFC9DF8391D9BC92BF3E666A3B22696C567F6680ED5C4B5829B4 +8A6EF11B93D084AAF2DCE69B39BA46F28131C0B45EFA3BE521822CF75A528640 +661CCAF1B95560682208D24203D6DA466A4C4260AB717BB1656BA8846C4DD7C2 +5E8A48DE389DF43DE66BAA55789B20360D143F7D89F5A7906DCED9F51F8F18F5 +F1C5B170B883F7C389FE4F935D9EBB68F3EA8DF84E501C1F280F8849BC476181 +7950935420C6CB6C7FC4A470966C7762FDAB91FBA0D6DCF03CE97660B3F9E054 +A63216C80E878E319CDAC223EAD23BC143A921C6619B7E522362D6F37F5EEC98 +F7CB040FE694AB48051612955CCF098578AD99B26736D99E3792508507625070 +12881AB347B1ED8F489D4FCA2966944CBE0F62174E2B76E613EE541E940E8C49 +92AE79B2FA6FD6F5B16CA72F10CAB2A322A217C316E4B4CB99E888987BA0658C +358EEDC1D85BA4486B479E2A2E6030786CF13889278949EE21B21D8F023B2CD1 +901FD514EFE94982A0C1AD2BD1C98E19848A4E36F4039EE0F4687FCD9C65EDE0 +5CD331D4BAA14998B24C0ABEB19CCEEB98611BA87F7BC01CCBD1AC749DECD76C +6D3BAE9B89AE22653BE4482ACD59A35DD0DBE43406E57AC36C5307AF81CB00E0 +3E545F943565D0D925513E85041C16651313564518F604AD60C7F24B14DB7C25 +34D8E4C5A0121FA194AC14E86AAA4E14305F6948C6998B3ACF67CA8BF1B12744 +5E7EE111CA04335F78DCFC440E9A99AB34E60F9EFCBB233A9D20458DA9405D56 +57264169160682DDA15B1B19A2C599C1671D0702D3AEF14B2645C6500C07A7C2 +D4B95437F1EE7D8D0DA247F54D4E68399487CB01F031B63760511FCD2858F1BD +AA7DDF5F3D0E4CDACAFBCA0610BF6DFCAF0046DA73542D5AF1E8EA8015D76A07 +7382A7B4F7419DBCE79A551D7A7CD12B1A8AB09174E5A3548BB56C0BCF4A87ED +18B7B5A9B8375AD8535785C2DB59FE934A4BA33E8112C6FAA92CC683CE765D24 +6E6152964086CFD1A6CE9191D1C59521E98CCAAA407F093AF076F250AE02E0A8 +2835EF3FAF19B53EAB419E2677E1A58C742BE93A55D2E6FFB71144BABABA674C +B972E811BF7857D3BDB809C0F23A51FFFF2E9160FBE2ACE2793EC2A381210CA9 +BFB1BA5F1576584EDFA3E904EF4A208350866A1CA232E6521018F245F33A9FBC +BD3B09FACEBAB6CCE610CBDA6170F0D16E477CC664BD4FBEFAC52A887A1FEE93 +C0143336EF77A46748F464F1403791CF0EAE32CD4DDB4F298A17E9EAF1885666 +4E467059DEFEF575A9E0C4AFE7A3BE402CF79B2D02B79C42B06684CE5875A9DB +DB64C03D668BB381B816A6F9813B2F5E2CBC194B93791F3BE0832AAA705D51F8 +1C0AE8829D844D5A1C5B9BE2519C921C6614D5DFF978A762B6D2F974B29AB353 +94166E26F6D86CBA714E47F84FF0A0CDF672271AF9E2AF7E2E8B743D7EE30E15 +C165FA7EE181ABED7981579A2D9999EAA208C7C8B33B9C6F95FD586CBD9354A8 +3B390D280A7D8FF96CE8A5C8F91DF9935F5A684133534C99A5918781F1B26C17 +E2436EE11DB1E3F104F7B3EBACA254B1FCE4B01FDE4183805ACB425FD8B46CC8 +04C1270FB3055101BB95EDF6E1D076A2A7FD3C2F97BC65802962E7EC127FB969 +C07E70F4D2F53AB08970C61BC6795CC95499F1A2C4BF9446FC4B65B123F81A0B +60C6488F593594E6296844C0959E0AB0C386CC76E769C7D325E1BE46926DDDE5 +1EFFCC709F7998ABCF24DD1865D7C60C6527D0B06A4B50725D1C3384EB164111 +70D637D76C3E3EF63D0057B1A0F970EAE0613F3B94B025C1CB733A4BAE995E99 +3C1D5B00419B2AEC1300C1FC9A9E98F5AD5B92F11A90E07D32E8D6BD040E78F1 +48FFE3D337EE827CF632351057B0C568A3413ED28343E0F3029F76DFAC3C738E +90B243F7D6039F6115845EE2EF471336C4D50FC48BC09EE001879FEA9B5BCEC0 +72EEC9FFE66C377390A5651677AEED0E1AE6800C495709B66C7F5FFC9974BF9E +9DABFD11A00F87FC7861180133E09A718D7685953600600A669247AA8F25C483 +0C72735CEEDF3BF9BFA88C178994AF71A16D84630B0FA21369F5AFAF22527409 +3DF33589BC9C61041C8AF4879CEAA373523D99C34801809EF4160416A13F5D38 +14C0B9B4C95B5E7CFE6E70D61A8C847819A9D2AF78C329DC67C123E45E2E81B9 +A0EADF7B66B5D7524E6DC225BFF4364BA9DE24CBDE57667D694D6628D7841AAE +49008D71ED25B845FD19B440E6AF9B5F140558AEFB89546BBF3B434E8ECCD005 +E8311C43B54F523A04B12D9B68400A6433AF4A8BF56A6E9EB36827DD1A5AC4BB +724636815C3149AE97E24C03D9B7DF5F88343F26A7335F47265201ACEB998AD2 +AB922BDCA39EC2036EC2721EC4B4180257C931237635B0C395A73C0441C202DB +9955C439043F04AF3125BB2FD696884E3FED05EDF1F5303D6BD60325CCED537C +0995E73E9F2B962FE6B8816C5A68FCD4D325A6865FC7D57A992EDBD05FB6E92C +C9725682A0CDC3214BD57988D001A5F62FD8A7C180C4F699A6EF7A804DC3863E +DD7A20181CFBE117109A793F1EFBD99392E400F3DDD6C64BE64BA05FF710E605 +7D564C9BB7F666CFAE8076F2E4209DB688CD864BB58965B33CC7AD08A076FDF0 +3CE533959C33732D444D4ABCD35C73B6CDD1CD70CF072BFB175A0B5476B062B5 +3A637FC14D8DFD7C44DCBDC78EA108BCC4C8E094C4EEC35C9A399850BAAEC9C1 +C73E525076AB7EB6F5388ECD2962F7BC6137E78CBABD857C035EC03272BD12EE +46692B841ABA2A1DCFCE4DD3D5E6883917D06659A523E0D3E3227516FCBE9AEB +7F28DFF0707E0AD6BB92A9210EAD45F69A1ECA248D2883FEDFE8C52F75A73B7B +9C7F07C4AA92537A2E9CE45F39FDEEA6C9FF6CA915E3D0AC4FC67BC6F0AFD108 +4810D67B320ADB50D4D37AD0C27A7564F6FAF3E6DB1CFC47CF9DA097AA269A80 +947043CBA10D93FFC7033C60A672C9D3F3999222D57492A97D5A4D10D99E437E +0C0289A1BAA29D449B2C17C24D780E68354D874CEA9EA4E02FE0583A18C0667D +4FEAB0CF5286FE487C95C969ED1CAECDD9F9BF5EC8A36C864190C73473C33162 +20296752CEBD6EB43144764E6FA12F60EA605290CCC3C69994BF0780A0BD9257 +A09FB9A9D3A5272C9FE2DAAB7975A5DCBD78A67E4F981E4EF224986C110F472E +F86E07EEB1B2B8325D4DF7E4751215C7DEB987CC9662B92590889D64EA31A1CA +55701D52590B3BAB4F0EA40D32CE6F98D6193BB6F843FD6FFEDFCD9C2CEA3A18 +917842BE0C2248B22D5AD817421748C36B4A10B6E65BED5686FCF26F4BA1C933 +1ADDBA36F99AD0F880DE81FA0C14AE93074C0D2F32AE2197ED43E3490C0A8FFA +0D747D1622CFA8CCBD48E8DC112A1743AF9C7BCA93E5B5696C46A27A8815B167 +BF2896574824B20D9C1CADF443982E8B8ADF1F705AD3FD030478AA79D12DEA5D +F5E3E9C309D9F3F360525044503A563F06AE33FC380C3DA0E0EACA854B23D030 +11897C208EFB2EFA86EE596420DE71B3ECCFDF3678888606031FDD301429AC82 +92CD38D8DE1C888EEEBAEFF6E5C9AFD6B2F8FB8B283E68EF1E12AEC79FA23D02 +908DDB7755C11E7DD339A1F2AB6AFCC27FBE797D03D01DFBEDB1460274C8BDBB +57A48FF118324F231274183E0C00064893021BC8F3B52C7E784881A31D913F17 +19675260415F19D5CDBE742FA47668A6C3870553E3FA0CFE56CCF589767DDD20 +D4540E734169D2E1E1E979F74369EEFD66777BC54361CFF22291B76CE36FC987 +D78E9A4D17C75B8DB9740B72859A51B65E0985F1280983F224684E7300191D62 +D8248056727303B6FC6CB175EC5C6E372180995A44680EB012A97AF3B770BADB +40FB89E4D1A48C46B1F56250382AFE36A674B92D132A56F5929260CDE410A744 +40E8B4262891CD7EB6CAF8DCBD3C58B46A5F0E9494651A2DF23EA1E3C80A2ABA +0665C9562DE3719F15473F9138C66CC24BE1DD07C961F7F64E638496911F4FAA +84BD95000B76D644EA13B94A73A1C41E1B08ED9A978AFF4BBF6567ECCB823D2F +5FF935156F79A00BB188BCD617B6FB2541339E4CB82D196BA067DCFF9DC6D401 +3114E16A003D4722FAAD466AC7F0F932ACCBA5A7BCD038DF0C39DEE32E0CE33E +16D59F60B06DC9561B40E328F8CFFA55042FE1C52BFD8A3273CBB02044CD01B1 +029A457EB8C8AD1CB1901140CCC5E8389416DCB7639D7D0A608F20ED96CAAC89 +F73DCB332055DBD161936E6A1EFB24CDBEB8AA69BFC7E2C4AA083B55D431235D +21B65636385C41EFA278C440D24743FD2ADA13B62D53E7235A54760771C50DD3 +608ABA221A0724063C839E96306FF87344532D03EE2BC70A223CB6FA74964687 +82CC44EC76EBC8404A42644852197569B1711946ADF595E8A6C7789C7D8720B8 +371059305ED1ADE8B01C494FC1342154916EAEBE3F7732B595A840C7A0363839 +0977D1EB502C15D6FE8A368B398C4BD7977914B072DF30C4BD7DEF9EAB7AB5B7 +0327D5AE95CD10F79DD6844BA1CADED35FDFCB17B8C28D55EBCDF54FB943B39F +0F9E98494B1654B1CA280350A03A9ECA8B00B59BF0D7015EF79C48A13662B7B8 +0547E2E3DAEDC268822F6DE7CD6F14AF71F7E546E12B4E11AFAADC34AEE5BDF7 +1E90DA341B6CD373009C6E774B0916787F637F6EA5AACC162582F1D10187FC56 +39349AB0AF7665252B5403E67686DF0973104F5B193D8CC9F673B3D9176A4B8C +9C31382EBD5C1979493FAE6EF2056A346F656EFA5B31922C434BBFB892EFE8C0 +6230451A3F26B98DD8E62ED4757460B1F0F5C813901F351A93A7E11758798965 +EBDB3A22144A7782238284780A9263B561FF7F1CCAA4D24DD2F37B177FD24EC2 +B372252825D66DBA7941B096D85BAFFA5C2B9F8AA4A31A30AEF5273FCE05F36A +75AC322BBC88C6B7D11CFD48D6D70408C664145D81130A2445D643E7118C6FB8 +48A01EECC93A45D37FAB6680D32FDF09E25481E18C388241D5ED823EE6FFEAA0 +90BA7638DE302486DD4F682CBCB33871FDCE16B67B158816960B52E75A1C28AA +F4C27D521AFD7E74A51CFDE38340A368ACC89DE2FAD37E34F3858A5C2DC7BAFF +F4CE85374EA40E25E959A9B74834DECBBFF9FAE1F39FDD5D0E8863D71D27CF04 +4AF357E77B565F5EA577466FD4138A5516E4624C7214E2BEDF1BB484D3425BD9 +ED34FD792F2F2B9BBB40FEA9D0056FDDBAE1CCC72FC101AC94859A9AAF2E37E2 +39BA606FEB4689E4E04642B70E58DDE5DA6608E318A70E24B6C7B88DD7E5BA52 +8FBE8B99BA85C5444FAFA046574C9160A0A920DB544419993BC4A1E9703A3D85 +A97827D2AF45C8379398A4D2A9DCE175DE7008A138BAE08B4B9A6B52D73D1B24 +6787C31875B04E35112F6A8AF5A2F8AE9155A80C36C6E8EA83642397717383F1 +EA877B01DFBAE379529D16D1E0CCCA4B8C8B94F979251914B958F0713859605E +6DD76A27705012B089059F9490AB4238107EF9AE1A556CFE69360AE47F66AD68 +CB48D08CB5AEE83A3A9D77121D2A599746E7B7C839B4C5CDB41EA0ADF56A1375 +8BB21918F49B70AC01273EF2C388F118806FAE2743E1DB3164F4D5F7893ABA6C +B5C122C9290394F2A216261845738E66B7650C8CEEAD7452BF6AFAF54C8EBDBF +DA5876569BE294EEE5B54F23ABACEE7FD554998C84B6450BDD689A10FC20845D +89F972F368648CB8CF864FF6648AF21FAB210BF101BFDB3B354C6659E761EEEA +31892585C32A18FBE8E4883D9D5CC48D84EA2F9FDB73638E10CAE3F75C3D9E57 +6810FD5239352AF7DC7DDB3704CA7EC8FA4FA3EE75FDBBE9AF058FFA17A32A17 +AA578E1A1708E8CB257CA968EEB34140804C224B2FC49643E5B3A3F7CC5E6C75 +6EA9BFD9FF9067675CF025636875588F8C7CA7E41654D7D3BD7A388B8F517686 +4DD89A12B204251AD96E3FBB73B5BEFAE355E5BA81EA1A1F17DC49647224A9CC +0CA44F3D25CF352E184544A710CF6EEEE3E73DDF1366A99B07F47E452623FF61 +B2D94549A80ED356E864D58BC00DE620D39A41C8CC18B5301CE74AE512F6B8A6 +72CD753E7161956C6BD11D375787797BEC1B061237307B0E1E08BBA7A94F422C +A77335BEED64C6AA2E850801FBF083E1DB91776FE9F7C6EFA3278AE93AD6A58A +193AAE6FDF8B15B529E7A5A543609E3CFF4D7CD3A121E0871CFBF0EF1D6E39CD +552A2C1C3160D13787E0F01B2C405B8D46A802F8026C5CA738AADDA72AC9B78F +5957ADCC3BC0A3C0A201089663D1FD6B68E1D2020E83BB50327141534336F1B0 +9B264841F663B1BFD914522EE29C20E22AB6141AE15090302ABAFF5CDBAB2B26 +84F3BEC919127A72C6E1E35A7D69B367D76481231A33AF2FEB9470F35872DE5C +50F82702B55FB3BFE33CB165015BE9F7CB928769DE116F207DFB5F6E1EAE31FD +000D15ED943A1A30C4B4048AE9E7D91BC1B1CD64EC2C24DAF572BEB3F0785AB0 +0D74341DB2D399B39FD5A6EF44DAFA7933EE532E6D4DF024EE9D4D27C88B25C6 +5CBA87237B30917F6F7D7EEC1BCFE774B4D7E0859EF5E07071B58EC2B074B288 +E0FE19979B84ACA7E6E7FA1889DEA18A119E2509CCFCE53D0AFA66020624CED0 +C55C31392AC12110FCB8C81BD289FE7B6330D7A5F9B07994AB79A494F370A732 +94776A8C2B5E557C2F5CE0CA852092F2181C4EC8ACFB01D197AF975B5DA482AC +59BD5C70267E811E80525111D17BCA8D53EE95A843F1000BE05E93F507113ED5 +751D6970485082915C28A673008B4F9398EEE609E483D001296F181783423B9B +7BD78EBBA0CEC7D10F35C23137BF69AF40DEEA478923AC289D554E6837D380F1 +5C3A29F97B3C2EADE26B9926D2B7F83289B723032C1385AA809D0B23B093D4D1 +A0A9087625FB595C017C1B0C1029511225AEBFE7A52AAB58A9BFB740DEC5AA88 +6F02290D37B03E3EB90A821E4BBDCD96A01A7A23FF3BEA2216A41BCFB63AF555 +8A7B9D2211DD290DCDE2A28BC6E1F96048CB9DF02F0471BB1F9E5EBA85E035B6 +3926CE1E1E97DA841FBA83D8C95717A23664FB840AF1DB06D0C47A989BBD5B9C +3E710BAE7A7C5BFEADE6F96EB056E6E702AE6A84814E0043E61B5A03B7A717E2 +54CE4FABD79B8F2CBFE163F05B717A76BE430F459AB5EC6BE60F6EE1BBDCBA1F +5DFCADAEFF23E029C48C33D5844673334FC54EB282C76357D93593A34E099E27 +0D29C79DC8B927266DC6E71FA8B2804AD0D00FDEC01917E7499F2706F6FE9EF5 +EEF6E24581BA11ED1E6405394C85E81E3ECA373279306298078DA538EBDBB62A +62AD89EB75F19A810E7CA9C745A8910129B1DDF7C70B5853B6395871DF37E468 +73C456D0A83C17DF45B7B242A0FD09D2157EBD8B14D4B852766F11962EFD1B0C +BBCD3C398DBBDDB157F80CDA579478A9689C720C026372B13B363CF23BA8D2F0 +0828BBE088A6DF3EE50886D5D79282B82145D5B1FBA13CCABF9C4E94F66A145D +F1BCCE4FDB0AA925E131B4270A48D25365090B70EF23F92ED72E770744059753 +1AC58E87A3A8B5F75C39DAB382E14AA485194E650C3F268EF6DBA0B1A604DDAE +7A151A21CB7D411E77289EF01A99A4332EEADB57372D43230B804C90FB1C08BF +201C3B7ACECA45D6A1DE107A9E231BA5CEB149F40D71C67F1F7ACE8DE1271368 +FB5B447454BD37B8BC43C65F6E8733323AA43FB5F83C4FAAB164C3C2DB7A678B +6454FF9EB6C0A4CB8186B895D1DBF0B5382BBAFBE484C5580CB354DD40AEF365 +E1DE1638E582CFB5C1E58EFDF0D3636C95BCB4DD9573F00AE7149371E0CB0969 +B3EC075D3D7ADF61E79E29F83144CFFBDDEB68DAA5E05D30508EECFC43B8B625 +5B533DCC9149E8770F4EFE85207CFA8C1E50D8B589E090DC84EBEF2360B5F3E4 +479E68779E5A24BB722A37A311F3AA39BB04530A2BDEEECB3BC9FBC889E66949 +797E3BFB3D1A1CE6A62CBB5CF5DB3CF99954F5D0CB096CEF2F5431994738CF1F +97FF3260AD2D89FD819B16E53D59E9E0FDF6B56BAD6E0AAF557EFB6A48D029D8 +F70BA32DFC0779B353A4D476B86CF02A505D40815E2585FD03C07B32B14D2B58 +13BEB639824A1FC04E7336470DE07DADD4D25A641B430DD1336F3A1D0F1DB6D9 +453006DC947ED4F2D528C00BBA98BEBBF855AC8C133B68DD62E292063FCCDC1C +0E390165DF8B85C94DEC13270D824E029046C892495BE1303C44FBD3BB36745C +63ECE2B67D2B303DFC22E2FDD140E40775A99B1A8D11DB4ED1C625540E3CC640 +269F338D8B04A713CC3063EAC34AEA0AF725D31642877042C6DB4E7950DC8C0B +61A322EA288F55B899F0A08F49E22791A2D55BBF89CBF0F1B97317C04216D616 +FCB5D100126A49DD94338D4DC08EAFBE1F08AB6B1792D358C50CFA58B5A66643 +6B801A2267C9843F9C06FD9F137AF780DE55D83F949F1B8CD025475779471377 +B8CF89B2765C0A9C41C186C586629C36C879F3A29D7A9F4E8B8919425F3B0C98 +45CC7A7AAFD70D88E2DE69200ADF0D263951718B2289DFAC4A38311519C07933 +9627F52FBEEE5B9619DE3BAC9B2791BD888B70AFDB75A1999540A1D16E9D4491 +FF5D3E5CE027E7700F1CC85F0BC64ABE5CADF8059C77CDBA5EB1AAD36B1C14DE +1B30ADFDBEA34650116888C6714B1825E56406C96C06B1D37000AED2840743AF +BC2F6F95E7917B32C3A5C7D36FB9F34626C0E61231599C2EE02EAB2DE0136081 +48A65E57FEDC0664DD2934ED21FC98BD568B4DD7BD55A251D16D2CB99C53C96C +0A44BEB44D9714F33CEE323B0ACE7923AD307A8D3B0CE768240F0E8C15C2693A +70BBBD740B3C410DAEFC933B324A3FFAF31C3D03516A6EEA22D2EAEF4D607FEA +4E865D7F6A47EC9034D23464715127986B704A08EA781C5DC9096EA7A95F611F +AEE6BF59FC2F3F67B20C70C7B187E0ADDC966BAB1258DC4B7C64E317BC97F2AE +B07D61A535F51DB2C0A058174EA194DA4F0E44326A2BE85E31A81A2D1032BD4E +945838B571BC43768226FD5171F01C24AF9654A8846AB32147D9E6F43F03DE47 +2E515D0A300BDE126FCF69A4C19DC8F13641C89A674E5B299DD875DD0CDADEFC +54FDED84A2946C4992B9EFF20C93AB2EE98837456C5BE2D691E5BFAD21A297C6 +9FE7FCF5F91AFE1546DA4F96E0F437460B044CD9BB2CAB9422FB85C5E131866A +B392515816F305001A0BBA51343572CB7B81356A0B45E33BC7BDF0F507F1A316 +BC9F6563A5BE869CEB87DE1051F1BE6AD6F267AC18B6A8289215D968BD467A24 +1F5F5233230CDE952ACF0B776D919520E70DBD5E1D5DF82C89DFAB421F98FB62 +8CCA29D0D223FAB23AA37B3609D1E15ADB7F680CB67097444672C9347E47E230 +B7A8E5D4FBC1C05DACD6CE17006D2150F6D378459E4BEDF9CFF363E564D63353 +C2C609C19DAF27C7DE9A91AF2F0664ECE84CF7A8C288F94EC8033A9176FABB14 +2B41009D02B6DC09CF9DEFE893386E3CD5E7331A35F481E18BE9CBB04951C4FF +7F08F5A49566BD7142D20E1A42C875A0EF12892F404BBB128174F8979852151B +E67D2D84151BF68E9C6427BC362CADFE532EDEAB49BCE2E5009030151BE5D2B3 +CEFE4F215E91DCE7D407FB57BD0FA8BED720E20E65FF4CC5BA32C867A1F9DCB3 +EAD136D0F7767485A604CC97D47A2320560D95E9315D04D72BDF9DA3F9E4836D +1D24ED2D707DF128810F218425FCEA314852DD80D48BD08963976ACFB9C44CD2 +BAC78BEDE35470512463B5C6E877BA3AA4749680D05FA3959A0B2ECE7171F1EA +9B963122A1A72DFC9E6FEC7E699A4C6BD742E3D4D570877231AF25FC17F598B6 +3777595305CAABA3696ECFCC725EB41E222403D84DA710D690C155978D93F389 +0F49E87EF135D19682BD2A2EA6FDF7CD3A2BEB6C087643ECB69252BB8678B21C +33F85002D1C82BC7066BFA02EA5E7D671D6450E5297BC91B2121BF46DF58892B +14D581DBF322E89E6BF24C6532CBA0C3897DC13C907EFA52142A018CA820A079 +52D7541D59D864C597D7ED9B9714A4422BCFE03AEE1EF4B6B565B40FF1EB4BCC +ADD77668A46FA7CFAC18AFD4B92C8F76806F81A818663A4DA845DF15F6A2DA70 +67F165013514D26B51D958A57EEBA06114DA17B3A930FF23B0DEC464C8D2F915 +68700C34E684DECC3639BFAC26B22E277B1AF59112FC783B887F37A730766AD3 +F50CFBAC08E0B4050C1434241EDB33BDB3F97E1CDA67721899E4A7EF1DBB3E3D +4AA90E615D06A805EFD26EB78A6F9FFC12E53D5E0FF49909F41E69D10C308EAE +707F729147F4D375E461690B9DA00A94CCAEF8C039B1F6A911A2AFFDE3C954FF +DA1FDC3C137433AD11A357F011594CCD9D1EEF0B976378F8CAF292E67662EF17 +AB786E90392DA9618E9D8DCF87C6C51C3B7371207C66D0B692FE7C290C0B51C9 +EE8B2670B63946EEB7FB9A7F66CD72EF1F890301173FFCE6B8FFED59895DAC93 +EDF39170D6D906FD2A462A1D2A85C1F19D77EBBC4CBAADAF49CE9462F23E1329 +8CD5B445800973B978A460921E8825014983943BCAA4D1019AB6627925B03E4D +DD70D0A1B8694A0D47DE8DF8B89D079C9C14C6B804058B43B39780847D746616 +52ACC4AAFCF918C3D3135F7B82A38162BFBD112D581157A19DA30ACB74502FE4 +40D7EDC6EBCD9BB458F2668D727CBF2E53A9F0121F62678D113EAAB36C24F3FB +831ED9761D907C5DCED84E6A9B242B041D26BB25A88136470F112DA1459657AC +AF399CE6FF71A7CD29E40A19C2503D08372C2A770118ADFFD821159C067B98AE +1170DBDA9AC3B3C31CEE8F6DC8B20C27295F362B52F1E309146EE975F9B41094 +BF28580EEF0DD850CE543A5D369676D7BB9AF94FBECDE2AE3F09848107BB9A89 +97EF34E79201D422622E36F78FA2B80E678FB154FE84D934FA7C8D9AA1A1AAF3 +33D0A40D2DCE86DE6380BF617ADE6C6E5C97A3F056BB062A9097293FDC0BD70B +987E357AD571971CFF01E913BBC1D05F0A7205F1ABAF516E38C02CF41DBD399C +E4B4648049569DE6DE43170DDF91A4BA23E398F82EB411194147528312F04F35 +9B8A36719E8CB6094DF7E2A14B1632CBDB2B1966B59CA5A778ABBBD66FD53571 +CD8B761D8BA11C0BFFA71C58FEF39ABA40A4D01974403D5076CB826315A24ED7 +3D207C528FAFB65B4861BF8AD2B53C748B0A4B34E57771278FC24E98AD52F34E +04AA492C9815EBE676781D40239B3FB7E462DA782BFE82C1C43BD937D6C260B3 +29D6DF902006EA10A63DC2090C9484C6234AB78A45957087E65F0F8979D5A6DB +C952E8721133F3D88316977789EB8CFCEE5085FA4741AA4090B920CE7849F9CD +4DB2FCC872CAC7AF5FEF0257B4A0AD781B6B4F634F370F7F61DBF8BB66578E34 +4DF73EFC1C23CA11C7A6C336BAF988B37E55C20F4138A7B5D8FBDBFC70BE5D37 +AF6F7E6958E062C6344C14249958E8566571B9C79ECC +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049036t.pfa b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049036t.pfa new file mode 100644 index 0000000000..df2250f90d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/l049036t.pfa @@ -0,0 +1,1613 @@ +%!PS-AdobeFont-1.0: LuxiSerif-BoldOblique 1.1000 +%%CreationDate: Mon Nov 12 2001 +% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.1000) readonly def +/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def +/FullName (Luxi Serif Bold Oblique) readonly def +/FamilyName (Luxi Serif) readonly def +/Weight (Bold) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -36 def +/UnderlineThickness 72 def +end readonly def +/FontName /LuxiSerif-BoldOblique def +/PaintType 0 def +/WMode 0 def +/FontBBox {-221 -211 1138 1012} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 70 /F put +dup 71 /G put +dup 72 /H put +dup 73 /I put +dup 74 /J put +dup 75 /K put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 88 /X put +dup 89 /Y put +dup 90 /Z put +dup 198 /AE put +dup 140 /OE put +dup 216 /Oslash put +dup 196 /Adieresis put +dup 193 /Aacute put +dup 192 /Agrave put +dup 194 /Acircumflex put +dup 195 /Atilde put +dup 197 /Aring put +dup 199 /Ccedilla put +dup 208 /Eth put +dup 203 /Edieresis put +dup 201 /Eacute put +dup 200 /Egrave put +dup 202 /Ecircumflex put +dup 207 /Idieresis put +dup 205 /Iacute put +dup 204 /Igrave put +dup 206 /Icircumflex put +dup 209 /Ntilde put +dup 214 /Odieresis put +dup 211 /Oacute put +dup 210 /Ograve put +dup 212 /Ocircumflex put +dup 213 /Otilde put +dup 138 /Scaron put +dup 220 /Udieresis put +dup 218 /Uacute put +dup 217 /Ugrave put +dup 219 /Ucircumflex put +dup 221 /Yacute put +dup 222 /Thorn put +dup 159 /Ydieresis put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +dup 230 /ae put +dup 156 /oe put +dup 248 /oslash put +dup 223 /germandbls put +dup 228 /adieresis put +dup 225 /aacute put +dup 224 /agrave put +dup 226 /acircumflex put +dup 227 /atilde put +dup 229 /aring put +dup 231 /ccedilla put +dup 235 /edieresis put +dup 233 /eacute put +dup 232 /egrave put +dup 234 /ecircumflex put +dup 239 /idieresis put +dup 237 /iacute put +dup 236 /igrave put +dup 238 /icircumflex put +dup 241 /ntilde put +dup 246 /odieresis put +dup 243 /oacute put +dup 242 /ograve put +dup 244 /ocircumflex put +dup 245 /otilde put +dup 154 /scaron put +dup 252 /udieresis put +dup 250 /uacute put +dup 249 /ugrave put +dup 251 /ucircumflex put +dup 253 /yacute put +dup 240 /eth put +dup 254 /thorn put +dup 255 /ydieresis put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 54 /six put +dup 55 /seven put +dup 56 /eight put +dup 57 /nine put +dup 48 /zero put +dup 163 /sterling put +dup 36 /dollar put +dup 162 /cent put +dup 131 /florin put +dup 128 /Euro put +dup 165 /yen put +dup 185 /onesuperior put +dup 178 /twosuperior put +dup 179 /threesuperior put +dup 46 /period put +dup 58 /colon put +dup 133 /ellipsis put +dup 44 /comma put +dup 59 /semicolon put +dup 145 /quoteleft put +dup 148 /quotedblright put +dup 147 /quotedblleft put +dup 132 /quotedblbase put +dup 33 /exclam put +dup 161 /exclamdown put +dup 63 /question put +dup 191 /questiondown put +dup 187 /guillemotright put +dup 171 /guillemotleft put +dup 155 /guilsinglright put +dup 139 /guilsinglleft put +dup 47 /slash put +dup 45 /hyphen put +dup 173 /sfthyphen put +dup 150 /endash put +dup 151 /emdash put +dup 40 /parenleft put +dup 41 /parenright put +dup 91 /bracketleft put +dup 93 /bracketright put +dup 38 /ampersand put +dup 167 /section put +dup 134 /dagger put +dup 135 /daggerdbl put +dup 42 /asterisk put +dup 39 /quotesingle put +dup 34 /quotedbl put +dup 64 /at put +dup 35 /numbersign put +dup 176 /degree put +dup 43 /plus put +dup 215 /multiply put +dup 247 /divide put +dup 61 /equal put +dup 153 /trademark put +dup 182 /paragraph put +dup 164 /currency put +dup 130 /quotesinglbase put +dup 146 /quoteright put +dup 123 /braceleft put +dup 125 /braceright put +dup 170 /ordfeminine put +dup 186 /ordmasculine put +dup 177 /plusminus put +dup 189 /onehalf put +dup 188 /onequarter put +dup 190 /threequarters put +dup 37 /percent put +dup 137 /perthousand put +dup 92 /backslash put +dup 168 /dieresis put +dup 180 /acute put +dup 96 /grave put +dup 136 /circumflex put +dup 152 /tilde put +dup 184 /cedilla put +dup 169 /copyright put +dup 174 /registered put +dup 32 /space put +dup 160 /nbspace put +dup 149 /bullet put +dup 60 /less put +dup 62 /greater put +dup 172 /logicalnot put +dup 94 /asciicircum put +dup 124 /bar put +dup 166 /brokenbar put +dup 95 /underscore put +dup 126 /asciitilde put +dup 181 /mu put +readonly def +/UniqueID 5078994 def +currentdict end +currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B +F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED +2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5 +592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E +44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF +9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E237CD60D35F0FD179FB +1219B605B80A36CDE0BAAFFA5D97DF370655785FB236544DF1E7A00B7E8AA37F +C23C6BDAB4E3F9BC5EE40602171D028423D88D16F57168C9631090E451FA196B +8B446947EE6233FF652CF41C03ACCD60952FE06298CA4E207FAAA38F192D2D8E +E528AD9B647706997722D73A9203CF7377792AE5780299EB8DBF2C0CBE5E1572 +982D74F81C32E627DF120AE53A1BFC783FAA74AEE3920D208F8AF826AE684F6D +CA41AED94655B6A9E0D60C34C318C7E76F5A52F373693DF3ABC03A72E8DB5E66 +CF5DAD37C9CB9EE42DA592D9DB876C6E62DAC02F1B126C59D1703D3A685C617B +F5A8FD9A630D8746ACEA7B41E9DBD4C47B30163DE05B34AAC3337965660BAA0B +CC2BAFFC0F3446E268C9BB27CE08456549C2DFD8812DAF308024973D7C38E8D1 +30C198D253136F3478334600EBF8C0196ACA6E350182B387FCFEB559F62ADD64 +D9B3C78A9832FA4EB023B07719B4D8A173274C388446C99C63F7C6313DCE4118 +8D2127184AFC17D5651DC1F2B7A763052FDDE142C714658009F5407B20F1D30D +FC978A2FBD8CCE7523A2A62EAF38D6485FD62C13D444DCEC7DBC79CF9258B502 +67CE30E2032F03718CACA3A28F71B941923F52B6FC4EE1731D9BCDEB5F456423 +52BC72B85C92AA0A7EEB5E7BD6470B7FF3C9A68EB479102C6F790F27266B67A8 +59AD2EB5CF5A20B6A39274BAF31E02E1C487F59EA0AD622DD509438C43E7F935 +C21E6FE887846ADF1D3071DB5C1A7868787F92F46D6AB19D56CCC3742B646AEA +2D24DDA6E00C6EC895103BBFB6D67B0C902E176F84AED3A0999C2C99A65F1A64 +A362CFD2DB6885F1EF150D828BA5C685A3A0183963102723AAC166BEBF18CF62 +D0C26D613CA8AF740822182523B26060E255124B1F9C70511B9D338A6AE2D837 +2492D7A67A371CD3E757A8130F8FC9D6B13BFF690257B7D41C012CDEFF5BFCAB +B511D068C9183BC0983E09341008C9717C20DE26E61CF7CA45E59433E58FE1B7 +C6884418C26663988693B995BF1EE3842EFC3E33976C988D6CD724D3B81A942C +2B0BB08F65A08BF768138C8A750A892DDAEF502823D4D6706CCC05451652D896 +38C09DB8EABA368FCF8AAC4E482942DD3D784D9C57675577F107594C0D2E07EA +36553A9785E0FE26534DF886F2B5A906018C48F1A0CFAB7E373476BCF98E7CDD +18A11D8F2FD16699FAEC22754E53EE9C972FF4A3901F94E58E23823A78F40439 +B709D90F48348B8B8E78569C77326B684E4DE7AE9192877076BE05932E8D3FCF +DA09EAADBDDBA35290E3FBC6AF2FDBD178AC051807027BABD733B54DA6E6ADA8 +350D3FF874041333CF88705C96F55CBE46A4D6DB68FFD447996A124603F3E29D +4673137D87A8B33A430F18ECA5DE4ACCF88AA16294BD9A3A98C5081C2112E3A9 +FC7C9FBB704BAD222B07D0D7E9F52BFB316992C7ED6AA618163D2268734D7B22 +3991A8C256CC17087E844BB8FB806A66B9EBA4DCD9FE4DDA936CC61229492253 +2922EDB5B12AEF0F77D693C51D616EA252BF6CF515C5CC737495F33CA41D9F8E +34572232EB422CFDAB03BC194E42DC669948235E0BDA96E50A3B78FD24A8F859 +61B560D847BE4A63E97358DECFA6BE9B86E026176DFDAFB470D57AAD803FBD38 +714DC319655DDAF6BF3E085819C456BCA734BC479A22BB6E8C9FE3E747A5E47E +0FD73B4AF5A80AC230DCB02818AF68A251998462E6DE10AB7FCA5FED041B32A8 +382B480F30400DB936DE1665D9D7592110AACF516FD0F68026AFC371458BACD7 +BB9F0A7C5B399DF9E7B02249526C555137B5A2B8BD3FC2A5055ACF2A983C54FC +5D4862F8867C39DF18824D457F222918FACD5EFE01982CEB5E75643EB7C61F77 +5ACFF22D54B58EB7F0BB14210CBB8A8B562B188E04164F46DCD915E428BA6137 +08420B83F3ABEE130C92EBE3A7C55FE7AAA126F2E9D450350F6331D4FCA8554D +2A0D48865FFB3E0CB9E97847D82F8EA1218B5DF5A9966DF6B7622A0BC06531C2 +54F0589991E10C95A5D1CD2BF64E248D3BFDF25F88A405E95FA254D2E4B70160 +9C8153A5504EE22BFB83C771616044B55E0B9676CB234B0054EB8B3B073AAD22 +B7E7A89C15A80E3344ADCAB949955641E1785EAB2D62B843DDFE4D5974FB03A2 +8E9CD8E6B10A98611126BCACF813843C92AC35DAFB9F14055EEC42E01028431F +2456598FD76BB66F1309B1DA0F7077D86BDCFBC6B628B895011B8D74935F5419 +8902392C6D35EC29225CDC7D49712D1D9FDD66C24C5340C1E05646631902B92C +516F67ECD172F882CDCFE2F957E4F6395D79E9F08E0EF64C7FC0B3118E3BFBA4 +FB752619779BC1645969558BA349F8868B3A3CAB48ACA78FC8BBF33198F03AFF +3862063C0BD73AA486316E28F948E31B89CEA0A0F9F10311483EC0676F597458 +8943317514B3B0D47274A499CBA6F76415D22ABF9AF5AE9A164D3444BD3A3CBA +17682AED8A11DEE04EF6965C07849C06970829560793B5E422DD801B4AD94CCE +AB73562530310B79FCD6F2F93182C05C509C0B2163F9F24A7BD06DED8D50C955 +1C9012158313AA8A548B79D495DAEDFC651D4A6110B98A88047A6893FFFCF00F +03D6848F15412C9200C5AA0525397806CEBF448F92E9EB110EBAF17CB2856DC7 +8C22DA7487B9E55B6DF23F345CB478689FB8522A1FEB34EE58AD8A4805B7CABB +58EA56D1FCCEF7869901EA0229908C74EDE80E2CD07B0E33D17389A434C54E07 +039EC17E27A56847CFE4FA04D65AF20650F8C58D24745FFD76F443843B7ACF94 +01528C2F046C2F8598C36367E9FD009B2B73F52AD9DCB49DF76DF74597AF9AE7 +B43E4988D7CAA34ED694CF0D3F67B9C21680DFD8E925FD4DC6E4458939C1F5A1 +1F0465493E0B8DD3F63034813F557C9B321E9265F4467E1BE3070101675A40E2 +36AF9F1D37162176B4B950A37EB1EFA3642B9E8AE6D5CC77DDBC6E5C0A172BC8 +4EDAD45A7502ACE290A9AB4D56E32245F7AF75D540485611CC79C813CCC61FCE +E7C773F74E26BBCF5EAFC476AB031A04C1BEEEFC881843AC2438988CDDE7CF53 +C18FD1A9E1F1EC264DC2484BDF4867933422A75E0EAAD1AD55A408D81ACF6AC5 +D93D12EED180D56666BFF3479B7EFF185E39D4296C7C87F56A6C1B6B0A99DCCD +F7032FF77585F4A1A22DDF46171A5A0C0601758F64CC10DD4EE4EAB0BCD05753 +76ED93EA50B176B36196DFDF5345E4BC934D9B6CF7ACAAE77A9B0BC66E460402 +87AC5F4CF69ABEC05B6DB517FE1059002B95E4245297272E552E6DFBAE1663E6 +1C37C0C90916037DB040BCE0BC1FCAF881461E0B5960997AB582942DF119F00A +A58EF89B9CA549913721521F259B135EFA1C7E1A5F87550621E31BC7DB07FD3A +85F024F2943F95D66503E8498D4B7038FD7F938950FF22310D1B49E61E395426 +B20B952D57983BF33A707C794895B082DBB035705F8DAE75EDD15A2F75C9DC04 +91A59777B2953CB4A1C8575C4FDC2DECE1737E9ABAF62637B0FB6471378E942F +1141977AFC8032A13866589CDB087995F9F78EFF5713572E6F3F7FE4467E8313 +44D994CA7AE974124CA93BD83C9E8451C956BAF993F279AD7044ABBE7BB826A0 +2757ABB1135A21C9DDD3781A589F9252C51452458CB5C94C4FCD53D3ECCA36EE +263C1ADECAAA22CCF6CE9DB923000BD7FA6B6B12032ED49A469BDE95C5903420 +CF275F03D3637C7A65A872F462F19C6EB25EE8F4E7A49C528806EF56ABF5468E +BDFFAA111A3B5E5DC9C46340DB0563DEC9250C603439F656ECC6F8A5E344BCEC +DAE02EE7F349175C35D8F8CA7715BEEBCD45D2980B707B3B2EE44FFF846C8B8B +8A7C02A56DAF16192B3823283E9876E8079FA3EE07BC1EB30AD14DA63B80DAC8 +D1311AA303A9D56859A4169C20C7F279B7527741D44DC6AB31A2A048C2CCD362 +BAB152807E3F73A621579EAA2FA7EB2BD45AD89E170D4AFFE6ED94A395965E32 +09C600D9AF322B870B34068FB0706EAB341FEEA668275183D38C641A98EC2BB3 +0E6827F3A764DAF871DBF5D27D254FD78E5F99432C405E92178941EE9B1999AC +3BC5E2D10BE76BC555C63167A0408A69A3B37A4D263204F6401A3AFF49398862 +C685EEB99C79D42A7859211B6C447462C894150469429C7E5315F575F8AAA66F +C2DADD013A304894E50EAEE124C86E1AE87AF200C8DEA35027ECD102071F8FD8 +F3EFCE1A14AF5910C6CF5A5A8DC5F09A18285D0384717E4FA0232443D12130C4 +EBAFACCEB4A8AC281F8B4CB5136740A15E7184A2BE166ADD3B307E918D326769 +F99E923C3834EDBFAAA5A2BBA1CE952CC01804000E1BF0A4C80B35E0474FC985 +3F852E8AF570C542ECF37F4CBB940E278FD2AD1249144457ADED44359A90D3BC +9022B23C46F25C74D22A61BA69F1BBDB4C5AEAC64AE8B6AE975822C08E416810 +310EA856B8FF8D17BC79AEB42808ACDDA673BE0BCE980C6A98CD5A0455A1A234 +BDD559C0B31A798D088BA0AD425DCD904E8C3013C388770DC9D03B6249E8A4ED +A49B3A2EB11723B0D6FAC3BDE453E1F8DD6531BA42B6359F47A61B5762AFCDC6 +5AF5130792FE98C5FC024B1DA4887095413C6FBA16EE59F1C8CC43A9FCA40344 +2ED9359597B991AFD2D94BADCE1E96B676A5910BE322CA3BED9120062740AF03 +7DCCF5793E87E7C05D95C4F65466C2D1867518BBD4CA2CEF4F6299E122C2EF6F +9301DE754D842D32BF4FF0C61001FA3929564A3935FF2C291B7E3B4425E9A0B8 +BD326EB5926EA0AC4FAC6D34F2A0715A68D38EAD576CB1FD774C30F0CDF2643B +2DFDBE58F38F0589ADDB6BCA49E1280F5219F45B0FFCD574ECC51BCC8625B1D0 +8A710B796113F13B8115B3EE0267F25C595CDEC16A6E7A016436A5AC93783EBB +443AF8DD342F6BD1F58C315973F9FE0B6D85C50D9BAC10A456CC83D8577032BC +FFEDC71049EBC829D6A419DCC22ED0A3A2E230101CEDC64C67E4F442E36AFEC4 +EFD6AF959D4341CDD27830F364E85DEDEC69E1D375AEEA5805D45B4507275AC3 +95575B9C83CF9529A9050997D5235ACCEB4E79BC37515C7C0205D8C9B827A5F0 +04E21177207379699BDA9805FBC4CF0A9B6AEB09E1E21DCC693E985DDD79C45F +A33322BF56FF7B91ECAED3E0E9C92729CE6894815DB7FF4C61E9F74AEFEBFCF4 +56FAB1681DD80EBE8D418B6B7BAAADF34E87EB5CD4AA2FFDA2E4F238035FC14F +6239B152EF3232277E9AC710AAE11C310DFB02BA392A026C661EBA5669F33C22 +B850CC57351F9EF0D6237C36753FE0A63ABE7C6E11798C9CEB6602D8E33724D6 +CF700E1A9D09D6973C99EB520C3034F8B38EFD43FF71313950C1D44565EBB204 +A614DB50EBC153B59A366BC76F01E5C3E5B8BC09D2B68EA6C154F72D54AA4733 +A4FF05C6A82B0ACE40AC70343FC83133797AE8C6DBF3BE1F6E441D6BF809C71B +D392A0CC32F1625D07869950F857E4E2B3B9979131C4432C44D8F6EFE9D01F80 +86D60FE915A474EAD180B21A24FCE69D511C011A8A6A39DF30F87FB2EFBB376B +7CFB1EDA2447181948D01C49F3795ABCD52344B58ADC8A8DA554849C97E5ED97 +E42F571E5F2D060FFB9E1B012FDD38B53C3AA5172E280B319BB3AC47E4BAF2A1 +4F891DF034AAA2F2AECCCD8C23182B5535DAC76C151F7718C39D549B6610DCE6 +9E154606D564619BE796F85050CBCF8EAB4EABF17FFF4ED07A3BAD022C523621 +DE7FEE8172910DD5448D8F7456637A17ABE96218AA7B1665D361B7FE4427BA75 +8F9193B7B9A52D4AD3405B7DFB1FC79D235DDF354D321B293E5C269616A10E58 +722A50BB356379CE744B3839E7822455300AACB0AD45EC8761F560B8D1073C9A +5BD7ED1BEE741282A92AF285BE80C6C65B2448E0A4A359851945AFFC91C9E578 +2C12D27B51BB4500CFB533051D055E7EE47BCC23D8F8DEE569A1FBE3419539F0 +8FA5CE4D8612AD404EB7E83D4E4A547C2C347D217979AC48E5C081CDE3671319 +7DB36C69C2A31B0F633EBC046CFE969448FF2A253CAC2B4FFDC14FC152BF83E5 +E517DE19FE1BDFFB7A3F276293E761C3B39AD3610E442AA58A7C25BE41C05141 +AC500ECB657643CB128E8AE36F4B37E8EF15CFEB1F8E3D334519A3609CDFAC3D +362933B5A55559CC28DFA89182F89B2FD5013E08A2C583FCFF9CC53A2D5CD13B +1C9786D1F39A02106517DD191D9E5169363FB01ED68C4CC13CD9CC257A2EE802 +C9E40E5C0BE5E65982AA15FBF0F04118EBE9DF64C279AFDFB1197AF62F6E18C2 +3E95A13D6B6737C4579B24E33A0A14DC922EC4C7202A30A06A4596547A791955 +B3902033D6047AD6E44A90FAE4333D0891684A9B1895585D9E91985026F72BE9 +C216009AF01806AB043E51DA494644D61AD7379C7F93F17AD0F164D794DD82B9 +077118A0426BF267C12997090821C5E01202BE01A1BA5CF130557EAF84E2AEC0 +C83C03CBE7F14C63884CDF25E5248C45799F080D281E3F9FD932063E7EEDE22F +0B2F478FF72D54E68FDBF6AF5A8BF8EE06EF6C30A5E061D14A512075A873AE5B +5DF02D81390DD9597AA8E902459BDBE5A6A61BA2E6CEC7C563DEDB2BC950B307 +CF22643E985DE1D7CA84881D19CAE2A205FA5CDE59420353F3EF23FDBF391FB7 +38CE81218276B2960C3923B47EB52A8429A50E28A607D5242312ECA5536916E1 +8624CD1482AF8AD52857F38E4E689F774B55C3946C2012635B911205A760F77C +8093298C200E220697E6F3D210C88B3E46F2B2E931952D42F51FB5426DEDE03A +05004DDA3604F38CD65473D13877822CF615C299308395A213B5D666EE06B0F6 +C1ACC344BC1037B5C95D78BD424522F051CA1C03F9FD11EA355206230ADB90B8 +E274770F8DDCDA7C3910FB07CC477B04205A6434DB34E69F3B69EEA2ED6FBD58 +C6CA944822B44062ED2F5B0AE86AA5F40E0B171D158CA1A57E5C3240A1A721C9 +92AEBF5D4075D78D772E1364F9BB631CBE1086D4EEE58E6B4D6BFDD7581D2075 +EC0FF81EC590A69AB9EA6C38D91A3D763A1A85D9588741BB657A7CE31A9D8C55 +9AA83C9DD8321EAB44CA22827230A11FBC9CB12992204FD936401DCF9A71D190 +C9C7EFF35FA97ED1EA2DA3584CDF3D66C545AE37E2403C3945DFDFC3F08A6C76 +C6E3F7C9238492D7022B904C846CAF40F0D571A39FB05B7F359C869081274F4F +3174CCD65045AFA181235224859AC3B5A708301033D0DD449D0F3315C59EDF26 +94B3AF8F8FCAD728C18B55A9A4283D0A257DE2C36F2066A31EB0E401C34A5861 +1E4DD5C81288469B625BDE1B3734804F726005071BED0BC518D0A1CB8C45CF5E +01E344C48668D815DF1B3087DA5B063E9C6D1232D3337DF90E71D10A306211F8 +A360053722E799E182D22CE80F4B0A7E118806F6D99B4456C539DF049BAF6694 +A9EFC7B847D0C45BF90DEA76CC68BFF4F733D246715976AC5BC56AEEBF3783F1 +15A79B960289C4BE778BB63F8C46237A84D9881B40B9562E460ED08BC770F6B8 +97A739BC2A060A76F1F1280EB07487F42EDC0C9510388CFC618A311A3987F4F3 +B464489A974B2F8C2375351E70C95BE7A7E25777D78FE245195F9920C14688F2 +05F350B893547D619300D36C58A8FA419F310A38AEE84A714BC8D0ADC2166D13 +80BBCA7400C6AF8687E0F9690EE1B71538EA3534E43F035B24532305E07133AA +F43680AAC2EBE60674F991234FCA58A01A4BCD9486599B2AB70FC48E0533CA06 +C2DF386E46617AF45A810EB56C610168AC4AED960EC344187934EAFC3E1FA3EF +F5010ACD71A7A902FF0DD4CC41107189041A71DE11A6BFA37CB035F1C14B8161 +9D70DB95AF381AFB800C99D56A366ABC81B4B463DAB84ADFA5272FFEFB1DC405 +11A92D7CEB4D54CC1C682E3BE2C0C2E671DF073A96B9DBF014588B663BA73768 +A7C3D4D546D8B59BF7447DA941A52D295B8002E5F1C31ACA441F6F55DF69F515 +19212E4BA25B340E9740499986A387E9B379F341B3A2B4C0D0E79379C6A2606F +744E13D2E415FCE686A2DA21195AC7431C9AD3F4165C7635DFAEFE5ECCAE5372 +BF7B107E6363B7C97CABF67A141A2B7ED27B415D2CD730FA62CA1C8900C673EC +373485615ECAA7C4C7A187BA60AE6B4E6200EEBC4F421689E5578A29F16719AB +154C41FAB20E9D262C2BFFC9F6C6394CB841E9AF84A48376BBB637EF6BF45330 +346CAEE1700DCBA3C1E0F2E75340B6FBA1721AB007CA80EBE1E66E785B2C9568 +E570A8101996903075E3E9816741BAD2A30EB96430A5710348109270BA7CE860 +C227023C77730D5CE4D23CE0D48707AA4C314D6E065EF55B5E0A83ED927D68A9 +0421AD3A6BB10F27DCB22DAFA033F15BBD985E2468490DCCBE677EE57061184C +73F22395323818EFB3D0906537F0881FEA258E8ABA6F89758F21A47AB72A79E6 +59C9F0737C23D76F95B80BEF922C62502C533ECD80C618C1814F112EBD7616F5 +D9D42153E5DF0B4F844B66F5985A345E26E93C259D36FED6C9751BFDCC82A233 +6FA4A91926D768AB042278F2142C51997A27CC08DCE7985FDECC2F99C25F5F04 +C48C0C4F532256581490B27931E1A472C7895E90520ACC252E55709DCEB8D255 +45C0B5526F339CACFD8A94A1D58958B239FAB094424412FB699FB5A036BEFBA0 +572D5738B2167771B29D3ACD92667C57B07D7AFC1AB676E600823FEC83003E43 +49F0D3F7CBCA7D7BD764C70247299783EAE00B03C09ED5A6330F1516600BA52D +E1832F3268D38396776D36166E26BCA5252A59D3A9DE42A84969092761BBDACF +6C5E83A69C03B53B10FCF95EF76F91F7A8EDE6E450CE253F373FB9382FC84BC7 +833F464126EFBD42A486308AD1A30680F7C423EBE1597FE234E510FB4F2F0F65 +E6CDCA4D2C5BF86E743A39BBE78D0E4A3D56B04588EB457D96629CE5AE95F268 +87E3B49D66C2BDDDD27E9F1986BBB313E33110F099C9F176D188B7594C965EAF +AA4FEDAFCC7BC9E7BAD2E1C983D596844DFE6F321EE15F109150CAA6DCDA513B +78D6D3B8260041367FA44C058C3EF84A37DDDDDEFFD35AB50664F7DD9C856D37 +D5C6569718DB3A6C869C9DE6257E06ADAFE2FED0A544F5023A4452AF73771AF3 +06B737395348ACCBDC9662EA92616D197226E424520F68D38E80537926DE94CF +13DCCB715204C3DDD69DE77BB00334FD3086F8B961FD7FCE4B565BA524C8EDEA +84EB69E3400A075561A19AC5D2AC8786A68EBFAC2860ADF804AC53BDA205AF27 +37D47F05DF295430915591AFCA00CFC65B428CB41EBD97F229F171C8995887F9 +8F99C0B45CFA0787C9B23EC73EEE85AF1ABCCA5DCADC9124A41671ADD3C33BC4 +2BF955421C3D563B1741C5BEC1F28D2011FC1FFECA792B31C208A9A02C950397 +74ED4874D55F2EC1655102672BF26012D747D46563CAD7C0BCF5D194B0EFBE73 +71C1D68F3AB20B63D083F45945E1C5B21C0FBA4FD11597548062C967CCCDF68F +6578505652468F71B803C9A4DE8093A4D0FE29646D7F8737E565EAA3D9F6846F +5AFAACD20B44F58F143E8CBF9C236938CFEA98EC19AC08DFB881F560A2ABA6C3 +45E6E8499338F1ECC0B7AACA6634485468C0BBED3F99D6A304BB5968EF8345B6 +AC1683C7E9D4EA6BDA3BB7D4EE9E819325D0BD1672B65C0D213DD9B988476936 +7948106DB8A26C2F6A511B771CD57462181CFA3B086CBB508270443C48EF7EEB +7C7F0CAB757FE1A1E62C26C079AD2DF5C2A1DDC919F59D7AFEF92DA0B1B3A34E +9B142C92E8EC6A370DB976E3D112458AB0580EB79E6253D01E59A015278698D6 +38684DCCFE13D476679E1CE55D565D5521684B4BE62D0CFD7FB961989C011660 +E79F7A051AA75872D48629E5A1598D29E8AE353757DACDC027C8408E3E027B8C +2304B2F54CA64306776A2A82017F5C96BAE8DC9D7867857D772DC9F4AB8B45EF +F3CDF3D58B91557E6D39CAEBAA8F3D81023C344B2471128BBB0632FC6F05E9C4 +95D16C636DB9858D1359FB36B301929881F09E5F29B0C2D5D13D4E598E1C086E +70141315351EC33C15AEF4FD6519FFD5352CED5E5A878FBA466F1C0252660F79 +29B1428E9D0467FE26A3E1D22B7B47EE8929F87D906923BCB7192DD94E22DE58 +A49D4BAFF8DEF1078DFC049BB16420F6F968B2F6AE8CF8FFC65DB1AB9A6EE972 +C89FC33EDF480124696DE3FC43BCD111108C9FE08482A3BEC819FF71917C5118 +B38040F48D74E224B495B90667A7A678A9F55DEA4F70953B38F97FB2D3EA9B9A +6E5B19CC035DCCEA31C8FACF62CFFE9DC86DE87815BBF5B7F9D4EC7322C3E658 +BDCE94C84A4D747531AF85676C5405242865E9086E77FD8C51C1A5984C9D8C1C +7B29952094DC47D9062C89BB7AE2279B1B92DE43BFC54C8D236E546D0A3B9B24 +A143F5B47A70FDC724F45AB788E3FD7228D4991B7AB0DAC1588F290FA1884EDD +5A895972F0E76446925A73E616C93E0DA74520929A053B730EE97CAE5FC04749 +18F8E2B87C210C799CB0AB651AD24D9749A2D41DAD03E94DC779312BFB90883E +3628A822946BF8F81023F2C0B3DEF58D73B11493D6482FEB44DB9BAE0FFC52E9 +0BC04A6E50FEEE540E4E8C8BACDEDF32A3F09FADF274150134AB3D62AE0A711B +0B30F3419615E7F6DC430C13E976246B470440E759117045A4CF8CCFDD9F0E2F +E1EF1170FA6B80D192C34F01E472F8CA8978EF531C13D5BC6571F7C3196584E9 +06ED32F98FCF35B50BD2C4DEEC9AF9475B79FFB95024D3ECAB0522B19786E083 +5B86E984FF076AA82F707048BAEF3106EDA9317B42AC8D3CBAF0B9E21D0AB84C +957D20D768C903AC512A947DA6119F151C1247B23CB1B52B7DCB17C5A6A5205C +265B78795B1D00B361778BC7351787B9ABC1CE5E5A58D0B7EA5EEDC3EC71B1B5 +BEE69671010F9F22067E99B01575464E9F34574E1BB7464644968547382BE1B7 +891A84149F9A5F42CC21478EAEDC5567A0D430A296EAB205368B068AE66A1B0A +78A65BD2C23B4039CEEEA7903B1CB11E476C1384A332FFB687F661A368001C71 +722E27B624DA1939FADBB5BC7086FDA5094001B50895C70159DA51BA742D540C +2216A1C5BD55E2FEF4E71561612C02809C69C21A072F46FBEDD83935A9C850D8 +EBDA855336501173E29F765129023E86D29D6CB0F8BFEA01229DE5369B143A5A +090B7315D36169A8E4704BDF62F93B949662CD574211CC8CEB59C02E1A061A44 +0CF5A59A05BF9D4E71F5FE55772FF327119B585635EA460B3AEE5965DE139421 +BF947637683431ED8EA28BF1FD43F8AAAD8FF22669DE5C867E388A30D0677B2A +8168BF8243E3E7D7FE9DEEF929735B1708FD0685C575E96A621EBE96EA15C3BB +888D276E8923D2F7C946B11D5E7AA212219475D90CA4114C879783235D636B29 +02E43A52803BF524F84603DA0D27C8A0EB4B3B84C66A0F270A49A0BF6E5148EC +EF7C6BB67144ED456ADFF8EE21371FD8DEDDEDFA42B0738DB69E1BE864CBD632 +EBED5E9C457FBF80B2D1DADF31A63C86144A1AAE498162AC4DC9E04329792111 +C631C12CDB2281987C5F9E12625B8331C3355490C0139A306F7C0E8D9B3FD198 +D77A0D2980599D64829F5B509C5E88AC242BF2B0D6EABC04E8A25CE812352A6C +8A5EA0335322C561559BD1172211A0A5F5B70A8711B2C277E668A47C1E254047 +298EA350947CB275DBC85B531DEB739A78C504FE2D679AD7D3811237D5349D6B +454A0B44051150C0DDA3728510A321DD25BBFCC7CED07D88298C30225632C5E6 +627DB302E9AC30AE902B82DF0ABC2CDDB55EBE98D1213C397780931F58854D9B +C355F7EE7BC6F526A5EEA043FAE8BD740D2713BCB352811DB18A253291A8D465 +EBD45B9E21447B5670D47815E7D04C00EA15AB089EE92683E6242C8948A3FC16 +50BB0BADA960157D20E3AD217C5DA1563A86FCFDDE2D274692A0EE47D41227C9 +1188D534C7F42858D0087713B9829DB97B31EDC82BD05AFAD4B4CEEB3554CDF5 +56F79FC410FD577693706CEA58F300F8158EAEC1ACDD7B0F2DEC83EFCF850B45 +40A00794BDAD3C43777EC8C9CCAB480D931093495BD55F39BC6D33DFF3ADA062 +EE643B9B84086693BB70A7AC9B290586403B43F4F930894FC0A3A4C9133E84D2 +7A144EE9A60A6EE3AA5076ED1BDE8B56AAB7AC243E8317343FC83ED2AB33D0BC +6A130EE2087C0534521954E77121B2F34D00BD2C6D7B29E6B96D15CB1BE9D144 +6771C1CC311CDE1337E2122076006C84659022B235D597551AE45287BE7CA489 +1B0CCADE0B548A0850D29B6C1F38ECC3E534E37848032818CEB1962A7AD21DFC +F4083B75C000F0A5D0FD565F1737AEFAEA0083F3066B540E93EA4C32BDC0D5C9 +4ACE4E5131877B46D2BAA122680620903552D738E225E3D89D41A391D7F492DE +617FEBB74C31F3193275F2E456E705C0126654C36C9243135BED4ADBE26B01C9 +7366ACD0DF11A3C4DF0771007B319462E4396B8F644D67A5DAD7F747B9FBE502 +02D24645EF82BCFAB980F80933ED035D6E31549503126EC31B8D205EE4EBBF82 +56CC51748F061A4322593ADBFCDA9A704BE5FBEB0E733D025B4BD81056ED0A03 +4EA60DC8B3853A5AA4B3708F0A9786AABE370627C32A82E588C76F8DC6D99CF5 +ADBE29DA22EE31311031FD37408FBB7C160C2F9895DD2F2E40D498D25BB3FD71 +A28B9524619B60E7696833F73B5A20078A6330A62456C15EA5EF488094536156 +4ED0B6A26E6EADAAFE761BB8494E33B4D87820961BB5E38BC45055C5921BFBBA +665611136B7400F3271A865138B1BDD4E6FC6871A4E9AA7E447DA991C4A894B6 +B3D2A552639CCC2EAD55A6367B500F7793F9DA332D5AA3B6A7DDC903B1E5C223 +A5843D031413ABDA79FC810E408C352A0FAD6401F612F78FE6601A45497F67A0 +E4047A1953BD656FBF31FF37789EDB624977D7D7EBD79DFB50EEC4EA3F89CBA1 +B88E2BB110C1BF48EFC58539F2E1B36A5B9CE6891B0DA32BF6CEE62DA5B9DAA9 +B9D6AE4D088A536F7C4AD89D079C9E4866073EEFC46C46C77255420F786D6AE3 +A8F397CA9C3DEE47594C109B794AC7E43001E6CFC374C415E62095C7FB05151D +21675170547234C3B3EE974FE929C1FB4BB2405C28B844C82004F533F4BC6FFE +F62BB9F778F81A3B28C7D26527ED751763B8FCD7EC02F565533433E11C1869A1 +E427023B1041B70252EF1C68758BC8EDC2046266EE0518264C8CA97D6996924C +0EDB3446A9A7CB910CD8A2AEB08B1E35F71F9CE07773F3D2FBACB7D9A4FADEE5 +3B51F1468EFE1E9C7B51DE91BCB86733D77B9D11828F6ADD68F72B405C41CACC +98076A626DB8F7AF19B919834DCE03391B7274D1B1D9838791D8276DF09401F5 +B130C9E744BCDB98D02A68BD1D860A54D8E6564144688C0B43BF0D56917A2AB2 +989EFA8F599520F2B19EF6D8D92138EEB8854546DB669CF14CD5ADC9C8F01DA8 +20F8C5D21D0617FCDC8B1A7D7BF6D880AA2B410A98CCC8F96AB191EE1F64C9E1 +C9AF753B04757489881B2D16459B7EF2F612E658C62C32CE17767209C5FE65DD +38D736E96F29CF8F8B6AB28FE3D6F6F48FC05FDA95BE564B762B456DC4B86575 +014BA2B041B05FFCE349DA27064514CFCE004DB9E05F6C1E516B00A948EAD74C +D2F1CEC1E150F5533B662CFCD8AD232C2666401BFB7679DC7530204AAF2FD7CB +8114E3A2530EAB6F7C75EC5982B8816C7AEE1D69E567C0934EAAEA4B09604564 +B2F5416576945A152EFD7B85B0D1F53D4431524AEF0CCA43EE250C6FB1A6AFE8 +F92C3B67EF9DBD5F8739B064DD4826CDCDA3673FC41C521ABD1DE23EB0700C50 +3D202646191A6B031483AAA52BB73D98F17B361B8DF51B984EAE2FFE0B1F4D5F +DBCA6362C76813086B3296D1AC387BDFAC50164525AD253A46F52792316FB237 +45EE6E4B3B4C56C2420AD3DE65421E5A90D4DA797599905558B336C01856BF9A +F77354104FD93CB2E90B0E5D615A2E2CA4F12C3501D0863396290DD285DAB35E +79A8C8DC6E340A0F32CCBA90FAE28FD3FC95710B0D0C5757D97102EA269A0A10 +652E8B9F9517ACDF09218926563F25B6151D1AA8D79732A403ED88ABFB0E7889 +543FE0D96A0E1245DB8337F8EA21EF2D948C0EE666B4EA53836B33359085AE96 +1709376A742AD8B181DB35FD583EA24A5B43B1294D9A144065767659C9DA490C +29FF12165AE21AB10B49A5FF797E3F079A645648C687ED6F44EFFE79464D5696 +875EEBA4AFB09F3455EC2E0122A7E91DBF828906BC05E6DA2ED9D9BCEE5412C7 +3B6868267C29BE95D732BF9FF6CAF6084159425D3CC6AEDF7E552BAEE821A9CB +1F806C46A138A2C5F6765F015C4C27F6521BAD1A582326333BC11D14F7F5C83D +464109FC2BBA092FD6DB0FFE8C1408856DDA1D6F0A04F831CBBB9BA91D700396 +1F3503C4898EA49E922A556A085B9D50D1493176C9C740FCDDB1A313321B86E1 +E5C5A295BAE5C271D536FBF8B31C95B6F648FAC4DEDA02318904CA443DC63A16 +BFA0CDCA75245A4AE420CD20DD780F2AEA6388F84A8FB42BFF09F9996DCC5844 +FBD0850B5E46824C6C5452E34A39E0A0BFD082E2478E0A0B2AC9253B4326B21A +DF20260F9E9D36004984C074B1419385A1C52B3606B9BFEC246E26EAF79C9964 +C34DA47CFF84D27DD210251C784578B1BEE835AA614695107A4CB67298C47886 +9FE67FEFBEAD028894151095F8D728CBE7AA066B03518E2EF6A0180D050F04FB +12E9E7F3859A223303139EFA0CC71138FB807BD816B8D83AD3AF3B3F42B73F61 +F95A647C354C384BA91BDB1F80B1D756FA5C13BC4AF763EECCA28D2627C81EBE +A34C6BDD97B0F3514F9B1A0E3A30D2B07CABB15EB3EE9E3F530019F5C749D314 +5CA78408F38325F93B97F5856445395F7C3D8B98AB1F11358F2CF97DD723ECB4 +7D9BE2DFC6C0E44AB939F235A1CBC300015BB9DDDF9A0AC9B7EB1EADE2E947DB +BEEA69328ADA6C95EECB9FE886ADF89287461853571EBB307395E2058B2478F4 +703779C0516D8F56B021437EA62B26E57E6A023AEFBC3C263A0DE6F365BD527C +531072303C7E6230266C34FD2C0041839B11D2ECB7274E7C30CC584C8C591F5F +C8950B9A2CC207711B3045796B08C8A43D7E580E8089D0B63E4EFD0F188F26A5 +8EBF298E304C8C104E150950AAC8D6E2EC9F7926921FAD5ECEBC0FBA4E0862DE +4E1E1754BA60C7C98DEFCEB707F12CC44947007D3D645F586A132A3A7228B5AA +79081C76C88638543806730012023A16535D0FF1E28E1DED9989E3BED625BB7C +E4C52162FD31C0540D5D73AA9EC196D29D39192BA969E221FF021DC69F379B3D +06357B828D205E2C4D37DE3B88FECF77B3D533CB93AC8FFC16E8E5822433D678 +931FB87D23452D49ACB5680A3E7C3543D728413168441D4BFAAB9B7833A46023 +D971EAC42B2339992915C854A53C62B68F867122956DE5272FBE60C742B6E5E7 +C8821F723450B4579DAB198FAE97E500ACC86D78FD7248876ABF21B761B9E2A1 +7380FED4EFD79B47D3E1A31A7FE648301DD9F7F4F58784DF0B54AFF457AB34C2 +A493CCF0F735C1C9F3203E59348D53D65FBDB6E24B552DB3CF8509DF3930F641 +E6FCDB4A9F970C1FA4CF1A0F4717338835895255A1E3737A588A5EFFB8FCE73D +7EB9C0908DFFA40F8723A9319A39548E8CA5533794F50F3B6AD6BA01D48A9929 +65261FE523320846602F4FBF5B4375D70D8BDB9A559867CAD2D047A8680B83DB +0DD38FDFBACF3678E77CDAE128A19812625CC1CFA9BACE39E6CAFBE28098C380 +17225012670F963056EBBB2748634B343C0677B09C0ED1D4B33DEA7F07B03E87 +99E229A8364F326D8F80ED4A9095181FCBDE9BC4FA0104B28F9F8CE994F1B6F4 +1316B3B768C81CF7C38BD55AC7820BE48F949730167DE7AB0B62365A9F5A4E0B +2ECFD6F04D3652B9C1BDA8176AF1146B91789BC2BE3664D906134D7723EA4EA5 +6DEBE02A75EE93E24583B1217A61521946F7BB69C2371151D2D44E3888C50FC9 +E49FA7705BD8800AE067630191AEBB2E78C4E3CFD62DE90683910856B7FA74C9 +312EFBC58534DA5656239BBA9E102D33D2E76DD8D170350C83663EFA6D07C076 +451AC8F5F034F69855DF60EC8A88BE7913502E562FB9B64FEDA4447AE1BF6F04 +1F366A5FD382142BA4CBBC451B5470EF3D51B57EAF791499A140BB10FA70A06A +E0B18701CCFCCFA2DCBF92BB59376D462F9D59FE114D3538880F32B7F4140E13 +F386343F0C4074277153D61460AC6A392A0EE67F11C411D68E50C9CD2BC171E2 +E4E73A231FA6311B3D0062FA73B5F5563C0357EE52FA4B5CAA9B5EFB20617661 +9EEC6C742BEF43DB2CC2626A76D03FB70C959A24F269E1FE81AEBE54D4BFCB6F +A56B6B8BDFD3E69788A32BA3072F373DD1AA6787704CB0F7EC710FEB08A82825 +50859DD1DDE613BED2F9F0891F5533816ED8137CBB3D7EE93D723EBBB3EB841D +A4EB010D20B870CC5C2C95E722E77C639B189CD44285870666494C2C00639F56 +D91A6C2A45F4C45D7D904F1799EBC44720410E1A0E32F100FED8D696A7031FEF +CF56C7774E4E568050487F1F78A86C968F82579D9EBEF42C500B23BA00A7099E +275C9BAD491D22755B542FEAC98C1B1C42EABA3A39C1C312767820D264438F67 +1A65E314A633CF3E2FAD7F83DEADCF62117446FF4A4B099A183342916F8BF57F +A3D0BF61D2DC3726FCDD3A4F7C723DAAAA40CA0D68460DC2D990B12C405FF111 +4F5B07278ABC51A7DFE18ED1596AAE6208F189D8CBBB50AB6577E2A635205E16 +F78C97714783DB67D467EDD804B062FA8463BCA130D5A0727BDA392C22FD94A2 +25C674C3B4435BF4436432249C48347B7382CAFFCEF88BEDAA614435269DF406 +B9D5011315265A9525B4919218D9B932F3043B3B2B4287F04F12DE69080CBB54 +A11A3BF8D59EDA74DD90EAC521976C7882CD8571E764B4FC566E3E08B1E7A1C0 +7F16BD8A1C1E4677415E9547DED46BC202BC1FEC8741D71E285B87F8C982EFD5 +C201155719E4AC66CBDC95012913031421A36455AEEAD59F24134B2A78C93812 +12B1826E250AB1987B31C6A20129A2EB557BC85FFCD1DD36C678B5F39388E7C4 +1D4B7BD640ED5EFEFE063C9D91308850548BEC011A487B9DDD5E4F032CE0F094 +D548572784220981B268A932922A79B9B8C16FBE12E6D7EA801EDAE92079407E +00312D7BACBEB5C45B62BE9532A4C81D39658A187E1EA1F4C16624A6AD1A56CE +5077F62EDEF7E3A07084B37731A237C746E6D89167EE41C278D2865055685107 +CF73CE1A574A47AB40792DD4A970204B8498C154CA1CBC5A23F270D44742EB64 +5A7A385B37BE67CC817019EA16BA310A19CC3AA2A5DCA5C010B76D985D4524A6 +3643492A26A249FF85944150DAA4343B30D77D7639F4076350D43D7E33C677CC +8DDC7FC142D1D376E98C8E2AA0310287D51168F29612C4C421293E23C5F120E5 +268BC1932C4F9DD29CBBCC08734EFE71678BCB5CDE4B5BCD8635F3009B631D3B +C2F00A38CF023D09AF6A832A32C7E78F1FB9232FB9AA5FAC477BEB54561F25A4 +BE1C23C41A6B1A8F49D4057050D846A50960E64246361DF2B1F829CAE8A81556 +5DF1055F9DA935D01D8071914AC2A89223C7F14AD4C36512B62BDE4FB699BDD3 +FBDC8628B9430467A2B79C4225F060419087B0CF614464F93AF3165A5366250F +72778A1C0BBEAEA0DB639FD61F5680B6A2903EA8FD9F056F77A68D10B2C7B4B7 +C772FBE5D7E3DA169257F2B6F9E3A1F2ADACBC3A10E1A47E26A58B07101B541C +E72012DEA2E1603BBC157C589791FD069E7EAD5EC41061B8034D22FF0EA7EA79 +87139328F4D74C18721E4773F841DF72B3BD044A7FF1EAC934BFDAB2ACCD0395 +B8635FF543B94CA4151C672719E68D1540047B466EDDA89D3FB44E2D75602F6A +639D9F99EF31C5B04299DB9F3B51A574DDB9346BFF5C978F81246026991D38CA +899CAC9A9E91BE864BAA95C082E6A89C7514FB6518341AAD562C3902A8EA5C9F +413CB578D6712BF142F643FCADEF165E7ADCA15AFEA3A330CEAAECD393DCC91A +75989E3B6D937101C344F859D53534B5CE55BBDE02C4DA5FD1B8350AA76A887A +875ACAF58CFB7B1E755FD2011FEAF1DFE43928AC8E01C09B272503DFBD21F115 +2577A6C990FCFC9A42B020EFDA2E199613B0552B7765928F2EB3C4D7ED2B4D6E +978CB8E88E1DDF4E61A50F34CCACA8DCBCDBB2CB1C747F70071ECFA1F31C9656 +22D28A21D48AA970CA6DB819810006C3037D4637E26B9760F7BB016EB4FE8125 +0B9D841ECE3D5A3704D93F448663998DE3FC8EBFB76CDCB79454DEF45256CD3A +2D180C96F89882EAB95A97E5EE721959642B176298959B934141D00B6C7CF1A3 +B1CB3A19E4BE96C990CF77832C665E6F0828867F3859879D83FF45FC5C4489C2 +00A8FDF187E6723B23F760AFDFBA6A4830611C4755DCCCC43F8DECD983275642 +1BF5B6230D3123380AAD3D3A8A9A60F67DDE88254A13CF536A93B326329A4EB7 +BD5CBCFA582DAFF013E2A4F2A909A6DF1465F8C1DD7649C2222E0DE04BA3FF19 +31A0D71EE85F748F964D6D57EE57DD800F105282409FF2E27A08B059AA17A4B4 +E2D848EBF8C8FC23641E2B517710012ED40350615AEBC5C115D4777117440A73 +C4BE0F4F6D73EF7B35140AD9BBFAFB43FCC0764D82E3AA81F25794DB6ECD7A3A +6B72ADBB483D979591D85D3002AF1B4956F3A7E083BE9D6ACFDF409852500ECD +886D3C4E51169ECECE6297959B78B813586F2075701F256137C9F92399F3E5B1 +82FF6E10B5C4CE5078FA4A71841D9C3C01AD81A4F9D80969AD249DDF63FD9505 +6B152B2AF6D4CFFAE20C111756204BD7BBDDA81A9E3BF3024D31C90D1CBB4B7B +BF83B8C033868615017CFDF7B2FB2DA13A7D65834652CF604DBF9412366D4823 +36486DEB84980FD65C2875281D0AFDFA70EE5011118D1CEFC78FC4D4AE20AD45 +AE7E74346B8897BD97630888CDAB0461B781997541F1C74E240623B1A7FB26FB +C4FE22401B8A4A6239B10D9E897191D185270FC4F2DC7ED13E73F9B0A1F3F0D4 +31C739380EDC495827B4E81D7DCCF8BE6D384ABAEB6447B65FF319284F0DAA6F +5ED58695628330CE770F62CA16248B1E0FB657214115DC760182CF062D97CA40 +BC683C923DF12BF39E725FAC6411359FD71DFB26E8FBDBECA81E03CDAA5FEC26 +07A5A8F6C925582E6C516FEA20488E24CD42A5DFD29DA96E6C9A12EC451D18DD +9464DFE4FD5AB577FC667905D9BF08C7083850C3B3EC67DB8CAA3695DF32C256 +D54ED4483A53AD3AD376590BD1BEC8C5AD3E253B3EC721F4A71CAA6C906742D0 +AB1A043660F7679433F7354CF1A36E59B40ADFF929F87B03B951D1393F50387A +B3E7185DD68CEE7C232EF44B747356D3C81D0A018CA61E48EFCDA4EFC203AEA2 +838B2885F7B626512C631538384A58C478AFCD28F4FEA7FE149D850182A270B8 +D899D8CF3730998BD517CA64AB0A9E40956D4755D455F5A56BE4DE02EBC29B49 +7B800445211A9150A9D09F8C285D67876F5C5925E12BF01A464049BC6BE89F5D +807E9BE5B8EEC3E1EAC7CB602C673D0E2C64F79BAC2E963EFBEEDC5E1C6710DA +290407E7C4B81E3B8BA1D40245A1081FD81E2DEFD90944A67EADAF922C269175 +99CFC6962F9409D9BCF1CB785CFC2B59B8E059CD2A184FAEF63A7E4708F82785 +E75B8EADD1C81D68908B09B9FE30E8EDA5AC37E2257D5C689B1AD942FFC30273 +2327B6A7A6F92B6BA207979CE10AEFA56075103807D6BDBE7397A64E9569C36C +CC6AD742DC9D5E935A8E28101A68DA4AB6224BA4544DB47247A30F98B50D7211 +229703CBF5410F964A91FDA6DD4B0A603361C3EE0B65911A79DD7935BDE86032 +44A74B051ED27B31FBE4B501E20076AD67B32A6908D7614CA95B06DD64B01C93 +14D813CE0EDD0F2FDBCFB731995201F07483A8C5ED79C56CFFA3BA2EB734689B +D0BA4DFE2F46E9325A9E7B6EE2FCA7825AF486E0A4606D4A1E6B8C8439AE7AE2 +347BD7656CC4F48DF8EE3074C98C3777E037E8E26C6369008778C331A0601077 +14EB598297507B9F2ED2BDC03C3E29EECADF0F5FFA1225DC5F27CD8EB7D7199E +F496EAC3998FC12515E0E75A7952C6BB951C8E782145F445E917B19413C1F702 +AD9E0180E4941769351F4DED721C0089ADD66BAF9417F5CBD78BB53F12F14CD4 +71BC0BEDD7FDE799A9306D0885FCD40BF15DE837EAB5A40EBB52CB6B4ED299DB +B12A2D1818F135706AE013BE70F3A60057B5A82D661ABAF018DFBDFE65AA8E47 +AC6C8A798D2F3C772C0BCDEF0A9CFB8BC638AA64F95D41715353D25B2143B4D3 +7BF3852091153F5732DEFAB4D4BE6199E13D1D9258142FAA82F3EA57CDE218C1 +41CBC59F5951625C556F6D38557082F300E341B0EF1AF38FBEC6BBF6EBD87FF5 +921FF53B6C78217355B9C1C17216DD5541FCD35123EA68D57904FB1BD7B9A7E7 +3BDC01113118854E5FD8E88712E1C916ADCB543B264D9573D2E96376A03250D5 +700A0CBDC1143FB85B69CD3455E5CAFD7AAF3D2A2154E2E19E9CC8C233AE6E94 +53A24290D61A03F7CD038D15317FDE765000BCE92199B728DF17AE8D540705FC +237F527B4EE8EFA5A870BBC588090A087B108FB0ACFB705103D027DD942D8F7E +CA2293C9C50DC0CDC960139CC4D6384A6BBAAED1D50EC10A261F22EBAFEB2876 +76BFE0D228A14D6DB2524801192D1F0EF49BFAE7667188B4827008D05406539A +1AFE0979DE52C462D998F769FBF62A45552C6CF1B30059B26F3336DF19093DC8 +2C75A5A9022EA3A6A35C35965A96C673FBFEFEBC0EF188EA9B3B31036CA56634 +F7F89E88C7611B6007BCEE35E423B73A63028078FFA84E73490DF2F564423647 +8ED87859266AE96C56883B6AFA0A46AF1BE64F7A07F9B9A8A69BB47B83E904A3 +A6DB8B582311AA9C2A787CBAC2EB5823F6DA66D4CCF5B5016D179BB50D691517 +130D77A7C3205F27D4A15DDB0D2062C486B59C70D0969CA5F00687A0886CADBB +CC06B136064F97A43BEC08811EA53CA13F190FC6F8F07FC498BFE128EBE6881F +1A4913BD395DD85B683FC2A4290C2EA20125ECA194846444811B0F530D16B29A +6CC24D9A7F3BD5888CEF45FB9BA8598B3F5032ECF39E2A1A3CBE122F100C72C5 +071FC086C9739482C8A19195D2CA3D041EC36C93FEFA520E94E01037567F0A57 +4CF1102DCBF9670740C273E2CCDA3553E267EF8ECBF31F1FAC3B1ED824DA935E +9E52E9586ABBE45F3B5A6409C5E779B6A0768AD6323E76606F20F40F401AE6CD +44F2F88CE5DE95B9CA1711A877EE203769B566E263AFD6360F1312A0AB9CB6AF +2546F112C20A703A01AB255739647E46451EFF522204A0CE985A609083F52A1A +9ABD0B01910B4FA3E4FE3A060791E1986BEF81F9150C2AEB6391AE1F09F1D94D +9BEA9ECB59E7E9B116128DE2205D27D2EDDF96FB50F3E1CB742CED4FDAC545E4 +9F5B5BE0A88FE7B227332D171E14DDF89EC0BCECA370EFA73C40EBB1A20FAE8C +C1B7EAE158B5BE22AA16F12952628B2FE8F086ACBC5F778A18E7B67963975550 +735D4CB5ACA7279379D2381BC97D1F2613F79C32742750006973C036BE035C5A +BA17EA7BDB9A8F098B733DBC954574927A16961C2B7DF2D0ECBCF742FFD781DA +3E0A3A1278178426F4592799264BAFDF16CB96EA4D1ABA4D806C9D264095EF6D +1067FDF90690EFCF0146A1E143798F104534FF17AD762F0355DC69F821234018 +A042CDF7D7379DC718E0865FAA8B0C757D0A19498CEA30513FA12003629455AF +B115BC2DBAC68D4937314FE10CBBB96AF8B3F4CB26CFDBA604A7865584AC0763 +BDA317AFC9906AD0B8DCC5A6A88A0B1ED4C6CBDF5F2BB5A5037C1999CCCF507D +AD3F6E4ACDEA803B4104BD05889027E00B027715C1FFD9DE303C2758CC38AA7E +9CC9AEF43DC69027ACE2AC9CB078FE8290FA53D3F6A2AB73EA241E7A53806998 +8ECC1327E41B13C1F5F79A1C963EB00EBAAC27D716206FE780323CA86495C3CD +7EDE7B2A5753E0FD0E0B62960AA8CFEB2823BE0371EBAB60C6FE9F279133E88B +2F2DC40BB446D7C3E955243C55956B7AA576879BE1EC0F2230796408D654A069 +A93FC77990E9C0D437535FCEB32D61DAD9EFAC776FF20A7110E1F3B3C4D89AC9 +759C25536A1604BBC08D52CD8B893A50C0490691960F833E421739B7BF232BE8 +2C53D766D04FF056E6AAFACA416D25696ED97D10175CD63BAAE9510FD1CCD8BD +06A32D6CA296C24AF84692D043E5515C5C261D8C49306AABF81A6D6977EBE74C +51A79CA47EC3017088019301ACAAB074AC3870BBCF2F7A24760CBD344753DB5D +83C3CAB511E2BE890C2EF39DE85FD5778B70C0CCFB18A7717C794488B1D8D1BD +1B23DA8388227ADCF12A251D7202928644FB9F97A97A48CEC170393E8B261E26 +99635A086A8BDE8DFFF1AB3E25F1A6AC7DFB45723AEC5A0DED5769F9AC15A4FF +A951E7D42EB97247257479E3DEE9E695C3D544785B5C1E6BD0B5F4D1619BA7A1 +623A55DAFC29AA4502274386B438F23EF0A56561EC3DFA3F85A1011338B2E5AE +40F075D94A3EF78CE49D514A237A459E4BEAE702222377581FE3A5A6EA51E701 +CDF405444E9CAAB052DEE3E7834DAC8988EC4558E03CD0D9935DAE536CD28ABD +8BF2392B102D2DA4FC0D219DCC8AFCBEFFD823B324C539E5E8B76E006D596C46 +BD79ED7547ED1DA6E352FE2221170EA158E6717C745BF178252CFE4C75801C86 +95074789408C86526E3E872D606DCB4E37B035482471101D8F75CF415BB55E2B +AD747464B5FDF829AAEE09A6823BAE96F66B1452FD4C25A88934F12F448177AD +135818B74EFD6F812A11CD02561938195F7126DDB92455434EB548A5E1B28511 +DC14E3A398F9D8C08F23B2F89370594F0E6544DA432B9FB693F1265AD432CE20 +8123E5AAE03AC7D2C9D6C129B0C3B39CD79F035754854C2ED206791498E26C52 +79BC4C326BA7053582745DA47D6F8231CEADA2547CBDB6BCC2A0858758D65522 +8180BFA16671793B335DC33670B4C7C99BAB013CEB0913B1AA5D0288ED9D527D +FBF2D7F780292D4EEA768D04580A1BF6D292FC886D00009EA6CEDF31D2D22E89 +4382CA2F0FB37686D30898A9EB923F0A181AC58A4A519DA05A5F8C7151F38709 +0831D20D980FCB1B760C636CA2AF619E226DBC0A68741B659D52635E0D1DCE57 +165B0E2ECE8F37B58AFCB15CEF1E23E0E71CEB8AFB3B5E1A59C886486FAAA210 +71B222001AEE2CE52CA68FC3E8ECD1F4692015206665088B3E52E6C33E31590F +17A4E0FCD13A761752BF155A22AA0E1ED55B70BC00793756AAD810A10CA9C4AC +A3804A9C4D27F10EF567F9592731C95E7AAB6F6CFF2E9413036CC9400E00442E +05EDD9B298BFAD4834737E37910B74063BB1E3D5B0CB4CC774FAFECCAD9ACBEF +EAC03D8EF0141885A587B64C83660E0AC8D9B2BE4BB8FDDE306A625DAAC314B7 +B9C359AA51715B2B0DFA7D7F671B1C5EC2B1BB5624D72B7AC0483F7F2837FF52 +2899193863B63E78A39D926940FC71F00FAEFF9751C0CF42A834F186D3549393 +7A052E9CE214054A6889AC95AC408032D305B1CD6C89083763722860F875F4FF +640556DB2E770A449647988FDBA00083BEE2303682B28C8C7BC163777EB51A97 +A20A3F99A01D5B6F2C183048B5DD93A8D445C5DFD41C909B49D23BE41A60F01C +1D6E704C8C5F9D783C224B70E56009569C54D5F64423D3BFF8DAC962FC050128 +965B9870AC96D51CA8420FA8420FD88F6C7B963822BB292F2B00297C40507A70 +2A32271F34B164F772763415FADDBE6ACF6EF3E791E69EB0557AE5693DB0A20B +1DD6536F9D74BCF1C0265A4A88C31106E169732563B2EC5AAB3C0768AE2DBFA6 +4B2C5F7DC339B4BDBE3704DC48633BDBEA8AB3195E9C4677088C47F074D28ED9 +4ED5F03A635888050524C82BAF1087764A217B1E9585C6C38E41A7A26B355130 +9CD809919F9976192C46D2581F984E71B6BE7E626202B45B414A97BB4963E609 +DAA06B99E772BA4C6FA7DCFBB5E2AE2E8E02358DDDA48EDD8B46AD558C1E98FA +D23EFAA66E98B1C49C08BE57FAF9DF8F246DCF7FF9DF21C48DADCE837A503D55 +BA201BDEEB84553DCE5A0C3E2EF0BED804315BB664EC9B8459E09A203AB28903 +9850DB3898EF211CB25C20ADD50EF5439DD13CBFD14000B15424054E0C2147CD +02098784127BB9411E4C96D30C16706DBA484D3C2AEE11D693ABD7079EAD3AB1 +61EED1BDB6CB6FF66B9FF26D4BD79AFBA78FBC53E7F6AA1E103155B980EEAB9C +ABFAF83A91206CC20932DC36910AD39DEB52E5C0539DC99C056A287AE661B13B +1A2DDE0AEEE340A727006033BC6636C743D310130EDF6383747CFEAF9BEF1D60 +8E851A71F212CB203175FC6A58EFF38A833D588A1AE6457E269045C40E432127 +ACA54E03232ADBE5FF45C23E025665F43DF522F20E776163C6B7D069B0EA8D46 +FBE3A12ABCD9F5C249299B57ADEB9B9AB1444F42837B39B1BC6C4026F788CD51 +93E52D681F719ED741C7C9FFE946F665494F17C17501988A509EC377AEB8C87F +8BB6348134BF9806C11669EC6A43DC9B8FD334416DB537D1AC9311E69417CFBC +1565476D77E4C3A1C96FDF49E1F6D62302B571A6FC3037DB9C2ADA5CFF15A110 +83FEFFFC074621E9ABB9C62CC3969B6C0864C41B757F23E189788F0A0BE16026 +D1187D48AA190E42BA6ADF00B80E44AB5512DDD195C376CBE0825343DCA082CC +411E26E3A71EFB7BCFA1B43BCE6F86720E7A0D2A60DA0ECBC4C3A0BF5FE07553 +16EF96247BD1BEDDF29ADEFFFB4B355ACE88CC5D4A37E7D7817B98B2B1E4A524 +C54434CCC39C7A5869BDE8C5D9E3098CA1B65AC57C9D81D1EAF711423A9FB92E +C20F18C80E22E7731C56F60703C6604EDDEF15F234A46F8659C724595980259D +35AA0847B7E96F0D3B3F4D9D1A82E8742CDD1FA2058770AAC4DDA727C506C700 +9A9F93144600628C46B6E5904B7CA98D21F4E08E6804D920AAF68293C4F0666B +1742FA95AA85FBA95037D9FF7E65F6B503D22180437AAEBF65FA8901C1903EC3 +896B213EA46EF7B5541B74F72EFD07C752BFFD26B8746019D131ED8B94E23794 +A5973768AA9FB961394105930FDE07BF0D08218CB985079BA634D8029FE54CE3 +F758E2C8841D7E2D1D8DED3D2D69E437597B28CA971E8161949BF5B71BC1EC15 +910426E7C2855DC776AE87C7482DCDFB994608C0189B7E24E2F16269068812BB +6F1E98EE8DF82468763810DAD7CE08EB0896F7D5342BDE3609522A4D6670016E +A837BAFE7CA0E712D9C68580B5A30E544C25A956EBA242C73DCC40209CC0E557 +D16ECE17D18FEAD279B4143B5F3C69F7F5087D5CCCC6387CE3745FE9FA4FBF24 +A239EE87218BD2933BF6FDCEE282EEB8C709303B35D6A8D9279917E28FFE2CB7 +7F7843C0D4BC1A5A85818F3417B85B416A3EB78C00CB196CA920155690D58079 +33290BE8EF54AC6653D30FAA959DAE3D153426163119BBE5F4D6636AF877D304 +4E74FE984B62E07CD1BEEBF56A26B5B2CFD7E622EC2211DB6368086807F8CEF2 +259FE58C1AD88A982DA8CC8E3656769F2BEDC9B1A1A26985BC3F4AF421DCA42B +2F70334F378D6ED76EDDB59B3B754EBCFB8B35FA47E9DF5CB209BE0518F9E6C7 +22A2A537A3209892448DF436370F0E5DC5E50EC7691C720B26B5027C2FD0DCF6 +BC303E8D72FAC731E2EDC1E2A70C0E51CA0103E7F97727583E65ED760FD724F9 +D318F10A6F16A98574ED667E810224241CE1E674C20EB3DAF738ED6BBD6360F5 +2BE448328D5279BC25C35F2509B2B77BEAADEB4C8F915C73888C953D40417510 +684D630CC51822F84466E3BD89BBE49D4F01D3A8AB9FA1A4A0095A76E95D6D1C +222FA4123029FC4CF44F1E0BBDC820272D681B7540CB096976F01DB1F8F42B59 +1954DFEF62F91CF5D72849B987118BA52928C213EAC75A50B61A7C1BE41B1AB0 +0EC9DE839CB0657A17D9B40BFB7D1A9E101C359E27168A641AC1821760EDE5B3 +53BC6D9643E68F49F87B75AFF41236A9F59F9929BC6BFBD4344A325F5C6929F4 +B1B977F84ECFAD8F885A3D4CA3C8DA38536BB5B76ACBBDA57F882F372EC4220E +1DE5276AB135BC50ACFE5080E281D2243CBCAB5465F18682B09942C56456A432 +7E6C3BFB691FAD4BD032FA4CEF24C1B06CB560AD996AD5C9DD766FD65D3A9C10 +534B84AF27525C7BB98302D952A4469A17F850AA95AC91962AED0C8FD8632BBF +73D29C76285F9733EC29D5B6C7455ABC96BE7F4A3056364A329158F29A1B69DF +AF0BEF221497937A09FAB0C4870C8EFA15303E8DF5B1451805AA50172FB1A797 +02EA9CAE6D6EF65020201A5A0DF800F80C02FF591D1BC9A4E504BA01F48CDE72 +EC8D0FF70B703E749B60A1589B1D80F9E71E8CDA61E7580C12F7F1410353FC3D +0B1604AC55094DD12433E043D958B66E72B718697A209BEAC588407D4F89430C +DF029CC69D52297D801E441FAD734ED519FB78BBF223A60624740CD10AAB1C38 +56534B7525561DD7776393CF031A5B71344809979D150E08BBEBADC84A7E0036 +870490909D120C9614974B2A06D30ACAB28BF9F812889932DEDD470BF2D1874A +106489BE6CE558BCEAB2B0685EE12F7F8099854ACACC27738BEDC39F1034B1DD +08B9D6A0EFE43CE60FB97E9B4C0A2DC5B9B61944ECCBEEA72915C03FD7E467CB +FCB568DD452C729492D0ADB06452F78E8F619A6D4BE8FAC82B3F3BF301830D6D +2773D4E95DA7FD8C38D69AC9BDE1A779AB5B170120F4B8BCAE745FF4F56266B6 +ED9D14509CBD0CC4DF264613B1B021E8029CC0D22F06074E174B635C4C0DD15B +1C2BB2B53CDE374E4E6520D38D8664E9EF753B1E4D7244E071912547E0275504 +C0266420D5F18027CABF3061B054AE9127C7D13007B03C0A4FF7D71ACB26D732 +FD54BD1227C94BB259D8AC8B246F666D3452BC92CF4264664A28C6A744C13AA5 +11BC7801E7956F4E5113500AA535BD7B5225EB693E8A0A8FA7038F789035EAA7 +B5E227C1CB68C3A4AFBB516DABB82592D5FEB58529BED646E3A0E8C0BAFD87EB +CEF8B46FB294B2EBF7720628A3711AF55CDBE85C92A7B0AB3F1820D6568B0FDD +DDFC91A440CADBC88ED53DA9E7C408BFBF59CC87853203E3FF707C55BB314805 +C0E9695DAE783943C37CCC94C7387974A5C88F1B9FE40CCDC5535A48DA86CBF6 +A6A155F451AA39CDF4C010C66ED11E3F4AC9FF5F78721512E8757B77A301400E +6FDEF7FF640B85EB573BE8D3CF834E45B944B22A01DF1F657DBB58A071584A08 +D6943D1E1A712EB23E749BD181C8FDE4C27CA25B9EEFC1BEDE9E99062D83C20B +8CEF0E7E7A7D40983B8C09871B41CA0B3D414E6B503DFEEBEAFB224D1F129914 +67889FBE3BA7C43423D2851045E70369EF98E0FAA1DAD562894C6C93D76B3A20 +B73E4C54E735613973E6E19700ACFF7ECBBDC340EAD2AF295A2F070AC4433E32 +5678B6F710C5545BF2721D3FF8A895F05F7F5D8BA3FA244CCF3EE68544098667 +EF8DCCFA2BE9DE5342D1FEBB4F074A1DAC4CA2DBC82EF2B85E7C1C3E750AFCCA +1FC22A49350D891C052F46D2C04C50BA7260B0B975C0996820BF66F9DD100B26 +1BF9CAA3DAC323CBE5BD11B75020AD3932499ACE1C5350EFEEACD5334252EAF8 +04B2A70F1027AF7D0CADC3AECD739C9CA5653426CE0104D5A1D5D5893EE0B068 +D5F6AC8F6413214052045D650997D30927FC5283F35F6ABCB5BC05D92A241271 +52E1293BD8720727D530A4B368DF0AC5529CD334BADB1F8677D25593AA974489 +2F9F548874FECC35FC83814651A33BF12C79C53A35108C45AD8B0C1B1EE0333A +61F52F2FD2367D066F3CCB15595B21031EE2C1AA1A76E103978447A34E977FD9 +664B7470201E0B68B4206CF910FB57A357DC43923B0D7E29E7B4B2245097D593 +DCCD25A270E762567ED47BF94B6301D7A996B13CB258872DF5302FDF7F0E7BEE +0BFAB7FB65F0DB0503FBD7C66371305DCF168797BE81DECAC68FF3942C9ED677 +427BC47B7AB628A989B8BE079A81B2CA513D69944B03A21C59E99D1B38E65AFF +392A9E10AE8C6094EFCCA5B4D2CAAACF88B6DD46420FE2858794BAB331A31466 +28D371C206865FE867912F5A7249AB90095B075A2184D676A5C7E257A581F693 +FDD8B34A77CA78F06B674E06E3C4596AE9DBE770A51A2FC5D50DE3744F858F63 +2A810996C917F1DAC470CA7B462684908FA48884514D67ED5BDC043CD53021D5 +9C701A1D62D9791506430BB45CF1362B4E8364A43E7E59EF5F44F78CFF4C2ABC +00CAD79E6C2A9ED58156E27D74959BBBD262EB44271651D95FADCC6993C4F789 +008648C1282411014B9F1EB5EA7F0880A80B3B24860073C2EBFEF40CD1AA93C4 +154CA5BD37CDCCABE50C7EB3E5933124E2B3B5451226CCC20EB0611F509CA7F5 +5B2783812F6F4C1F9119485933D8E441B9CD7B18C88E193114613F1B55BBD2EA +3083766C3123D53F2A968F4E0F4D48D31C3B9DAE4FBCB8CA79C5B53EFA185F2A +12E74835F5DE5CBCF32353991DCAFE8A45336264D7C1DC55EC1249FE846B9998 +2E47E6D855E6C56E18CBBC60B84B0AB44A4028CF9AB16F03740EB584E81491AB +00845F21486A1F903378CBABB122FB199E33C89DAFA54F3AD43EB6A4A3B9759D +454E8E3C14FADB4DEC10C64810D3427F1EB144E47A429C8350A99391C82BB82F +29BA08A51D727FF0FC6E7D0823A4ADB2B40D00A96F00FA7CA1D5C8ABB86B3F25 +5CA86D9C55020908DC2C8371F5BA6D999338C7C9E06B28FC1B1B3E5FEF3AF0AF +FF412A76E841CCE583CAB8B89C0ABFC585D365B7D071E6E35E40002A0F654689 +BD1D5647A800FC5AD97C20F84E9A608F9BB348EE0D3E9A542B4262BF1F424558 +D3E455268D042F048B4760A6C2E6BB9A783C849787F9F02B98C356C1BAD94634 +2485F033A0CA885570C419818C8203CAB7B9FA6290F8A62EF9033713D1257064 +0E305EE5170A4DE71CAD89EE2C0BA62E9E69A9870DE74CF52D0DEAD65DE2A291 +2282FAFEEBC0B936E91595F7C6E0BBD33E79FEB2ECBE04891F1071D631B3C9EC +6305879468CBCA461AF927A3561AE15A463B24461B9960474005F98892057048 +6419A27D3A51461C9BB9A0E8E621ED1F536937FD0BFCA77A3C33C35E11F3C367 +554833F4252C036D579F32DDCD7F4081B4BA73AF51A2488EFD7877D917B2D4D9 +C239AB6DF1638C9BD14BFC9964A0C65963F6B79D40CA9E44A301F437B8E03B73 +0A52683FAA4CB2620D7426916F89BF72052DCC7E24509A893B715C4515E740F4 +55EC935779A22EEF3207C657A6833F73F04206D147F5E427B0414D8F6F3DDCCD +BC895E1FDCD3A7E76D4B21669D5C4C5113959CC62F0B7023F58D771229C2A3A4 +00FA0B6760C8B77E356410A854B23C9BE8F4BAB75482495E621F83045452DD46 +B5F299871544E4E922780FCF0BB6DB666B9EDBCA62703ABD4F3CC69E15728DBB +6C2DF999717533FF7F98ED6934826FC7569A4020DE4B06147865178D420E8CBF +FACACBDA128C17B635329AD9995E6E2033E6CC702D5CEF1F0DE1F25322BF58FD +9041EE0D904200FE87E2D5A672FF0B3C63575D5F7E07F01202FCB8C42EDD0296 +6E657B5D703AF68D26FCA74FBC8076ADBA7F5A4BC58C10D91FCBCB628AA9F313 +71CD61BBAE0B6A6C7B774DE4903676BB3D210F220B413F0B95F43121741523F2 +F65DBBC09B04BE87A030C607A545A9D5791FE4FD8F479BB213662ECA9103027C +01D85141DC897832816392AA1F49056AAE3EFAB417AEA3C79E49E68EE9CBE8B5 +717FB5C3C5E811F51BA685A178DA6DC3DAD589ABB4F8A0A27A5DDCBBB11A5E76 +94B6320110123C630857538E620AF88BD8ED5B5B8A10F1F28A15BE1ADB196F40 +CB04E8A50ED5322AEC3CBF8881D32160209E8FB6F7ECFA70AC58F94CE3810BE5 +8597D5657E39AB15B3E35DDD508F74069DCFBF0CC70A6399C3AF7B04D4975FA9 +31698D10B8E9CEB89DFDEC2989C37FDD417360F39FC6802EEE5E3CFE7DF63361 +758BF4861385D4931323EF38E7348EB98633C83EF9BF627A29219E9F75A1D341 +5C8091A908ACCCFC01395AD91DDB82EB58BD88D5387994A74F35BA04265BC32C +4DF225782658BDAF63E8EC8B5B4DB6CEA66F83961D5B41C8FB62CEBA3DBEDC69 +B6DAF5BC4B541FDCA54825918B9C84E7122D9718D28BF9E9066C8B122072225A +1B79B4A73C235DF52511CCC1E0A3420B35A5598230CBF3C6EBF09AEB6265B481 +304D9325DC8AB8F6853D4111D42724C558761991E953F114019169BD632E6639 +037344F1B767B0DAB524847DCAE3C5CAEB864973F3A3FFC06312A7753F571888 +957ED07CAD5EDC9D04497FCB48446F6C44C6083BE9A31821BFAF1046F89985DA +009025D4AA91058EA366244ED8E64601B374DE230A90463AE4E57D5D995BDC18 +F621E2B31F79439BF5A4984BB6A02833ADFDF4AC0DD58F53BADEF74BB1D4AB88 +90AC403AEB53313D51303384053A941B0AA32C3868582180868D7B6822533E61 +A4C1E26794A2D9F505EA75EA790BA944FCF61B5314DB14FBBB6252495103C7CB +8E355F9193D5ABC556F3E4D5B6CD2B8FCE08570B3B69075E241E06CD9AB790B5 +948176080294D56000A0B7ED21D906169D052EFC220767178ABE60759E148036 +388530AFD262244BFDCC980D432DF470C4243BE84EAE322C4D8EED4C2242F490 +93639E49E5548FAE9DBAA2826176756D46BE3449E33E8C1F4CEB4720D0667DC4 +EF9D390416E580ECB81029054635C6DB6D8A1B7B964CCE4B15B632416804C805 +0BBB666A4AA5038D4ADBA00ECF22EB59FE9E6E4F801CDAFE3E35C44EB6C098D8 +093AF18BF4FAFBC3CF7562B90029D395D58383E75039003351E35057489BB5A1 +6AEBC03506289C918E6AFEF280E437299C2ACA7E6D5D52AA3EA2509A1758EA51 +637645F7CE54EE87093AE38B8FBCAAAEAA2452AC65FE2C68235840BE62B91742 +96AFCBCF4AA8300FDAACB55FAB27B2B29C488628347E9262464EEBC8D13855F4 +56D9775DB23F069E9CF9C84813F0CFF1391D72DB08B0C9A3FE409D8D08C00562 +DAEC5022E11EEF099724E648BDD73DEFF8E1FFBB3F80042554CB0C03158793D8 +CEBB320F8E0A86CC95E5860355F00DBB146380CD6BA35F93F5B8FBAA54280262 +31CB7998DA8B43473EE8D1895D5D85ADB6E5C8D2B5109E57DE3697F541C7B27D +12650F96FC01E3D56F457FFDC3BC2668F8E6FFE82B94D81A648046D7CC71C4F7 +E218F5D5D9F899E5A3A33EEF7EE7C8CBDC9F239BD2C12612519ED9D4E89CA4CF +348C0EA704B46E56FD9EEE336494CF103C93CDADA00AC0CB74DCCBF4737A481A +F330C6969D9925BB1CAAFF8A2D857245B8E4C82A7915D97F7466501EE7195D8D +C35D2B5DFAF50C78686CD5F5717ADC8047B7877FB15E84961F372D03C0679375 +88E4A9A5D2492D28D55FB00ED000E2B8DCF24AB3EB4519CDF68E3FF98B54A1E8 +E4DF661329FC27BDFD47BE63E85A469191E476D0406774727EE99EEE6C2A1C0A +EDCE20F13FD1838EDF3C1E5FD764723276ED5D853E609B0800197BD8E59C1265 +4092D1D76BF60B1FB675B25344D65C0F79C3064CB634970B5ED680EA710FF884 +8078F9E050655644617690A3EA66AF2D9AB40D187B46E22E72001E2A9D3541C3 +5BECA48A812700501568565A8D37A2159A51A89BC59D4ECA20F3328CF48838F2 +B6BB50D0DFF3039160FE2E278D178B673361A3D412BF3ED1554540F1F0A9A1F5 +67C7C4B257B97C6BD1FAC85ABC9E86B175DBA1FD0E9BB7C0DED0D47956AF2389 +64EB6C4CBB3A03A8DA5AEEEA4422F432EEE66860BECFF5BC5752147BBE75D0D4 +BED50695E88D2E9F01FDE0FFB409CCA801EB16F6471181E62EE70AE4AE06B9CE +91079CB5ED83BD82A88C835CA82612A4431EB7979FCF8A7D1ECED31CBD1A2C3F +A586804D66B8A86997A05D349FC01A2796F1892A42979F50B0DB1175B42EFC58 +0B1D3CB8DC992ECF5BA9A6DBD1756C20DBEA6948499F0D245F2CD8D121A8F916 +C0D41F5FD5414C12EA4FFC688344F7EEA2DA6BF2795D4D479851DC004555E3D6 +0AAB1969509FFEE0390AEAA3D631B78EED9370B286B5D2F871EAC4F14FC32B7E +5571510C3C9BE1467125B7EB3C9E161B0254213733C6992062A63C6904575107 +3395A27167787044056BF09BA5BB742AEC0D7546E9D092D2F66D3BF9564F838E +FAB5EBFE6FE458D8FB9BE05800AFFF6924270F06FA0DB61E48F36417F2B84ED6 +27076B8B6EC6F7DECD29DED0DEB9D51DE150938B7E94D09D19F28E3608DE37BA +FEA6BBB3BA06C13F39BFB5268D4BA8D8009E41D5DD8F5C0171FE2859A78C8F16 +8A98E12F32F867DBFB07EB5404B6092C7B04BC47118E3B3FB66F981FF9642C15 +A4A63362DD5D20EC4EBF415D79626385EF9D7ED7B18A41A4C33F3C70553B31A7 +01EC23459FAC1A5B9D320B962D966C43887CF3BEF40D2DC83E843E51C9870C2F +43CB49080C3C477358867A4FE87FB6E9F79C7C7D573B0D65F155B2656F4D33E7 +0C6049E8C46513CC500CC600D7EE5D30D32B9324C89AA10A9D676EAD04C9728F +4A4CEF9925A294F26E6AC63730B4520C43BA5AB4EDD6441DBC3F2B4EF8FC4AFB +1ACA19E714C1CBC4AD114FD0744F84C85F4F3293BBD036EBD4CC29B3B9609F46 +E856F37EC8E33396C89DDEBC43C0A78A3FA67A155E1DCF82148893C418531769 +CB82B1B6357335742E7F712A182C413E8D8192BE6584A907969A48EEBBE5C0F7 +95C7219652F28F3306DE1F83315BFF09D66E3C31CDAB730DABB8ABC1A33C2BCF +046D3FC7E0084877999B7D2A8AA3880006B9D63BFA9F82F26AF0B93372E55EF1 +DBF53C7494E42794097DF15DDBF43180CD643589E2F3A40AF0A1A0D7EAC3373A +B94B1C375A45DF21509C3D094F230B8EF207F4D7EE1B6096FA047D0AEB83D12F +E3AE9ECBDF2C24F3D553DEFFC93ECC63A2479AC22A209FAE85E34D7A6855C386 +C611D60159CBE8A9595DB541849FEDDA99DB09BEEE9499A6CCEE6A0BDB150B11 +6DF9A795156BF845FB89ECD6939D6EBC8615D8FC47911BB34107E71FB3E4507D +215C1A8476E75BDD1B3D87321852AB6A94D21027D35A2199F25DE7F7BDC4C865 +98DD84C89BA03D5498AA3AD62135F0B1390613421D52E2869B87579EA5AEE7BE +6804CDF29BC99A9F7355ABC9E42D21E706B97091AB73D3CB9184013C6D8980B4 +CD5C8D5D13973F342E8FB4467260B23340BF1254E3D9195B1D6AA566976C0CB3 +62B492B2C8D4EC481C5756496FC54DD7A6EF6A209F1E15FE2C3F57821E9E19AD +0A563DD390A89A6722513345EF58F98D65450541A0C5C093E69D749E0759FB1C +DFCA7A4782EDBC030B9D692B3EB1003487863549585E94245D9ED36D5576245E +C189F5E31A033C68BD21D5A477B756ABBD830CEA8D7F0FC73F93352CF95D584C +2593F7389DFFED1A40E6B14BBDEBC5368FE10962FF7A8938227FE9C44AF54602 +3EE2AA0B6D7B4044F906480199E49B3F2AC6ADEAD76C88DC8D22A417C8A4BCEA +D0812F1F513068E700040A9F3B6678B1F51A48592437C79E2BEA709B92669764 +8A058E234468B01F498B5A51E2021BFDC09784C706024DACCA6EC0DF8F9039B9 +02EDE264D7BF8381A66751F4B9FC4734CF608898828B5CC3483C688132FF61EC +E7BA899F45C3530ABDAD48A5B5930DA1BE15ACDA0522A33E87127C559F551896 +40348DF2CA4651C51475B1B611957E11D787F05CA436BBF1655999F1DBE03AF2 +3C83746EF137EE71ACA97CFA6969D1CE5ACBF61900A452D630011FC3E85FE0FF +AB5AFB57483E7ED55221A7735E5F89CB4EC92D5A8C9CD73FFEF46D62F8DE207F +D4DBAD9EEE001DDF0750125FBC59A5E13A921955C6D7CCB1CF8F89F3E00F7B12 +5D358163ECD0CF38A118064862EA04B50B6AC7B95D531C2065BF2CDBBCE887F1 +70650E0772EE5AE10AD67FF178EB51F8AFA0CB0213BBF9757976621EE0058B0C +3AF602DBCC7ABFF5F467B7854904BD7F7E89BD19EEF9A2F7B8E557283AC672B2 +92BD96D87365C681463A6FDF56DADFE485E1B81A7766EDFDAE58F92E33CB12AF +EABC9D80CF4514D8BEBDC6433B990B0AB267D378438D738025AD340FD602C441 +A5A4C63510DED267FEFBF9787BABFDB79804F56C89A602470AFC0E541B46666A +1C167AB82E06BFA1814E22B65355F40813BCA02BFECC086C7E8FCBD845191C28 +7FA8F4BE3F1B4057D192AF55AAE787B0C654468600ECE8A763BF3B5A7324F7F5 +62F7F596204F0A50A5A7E1911418C00849DF24E00AADFBBEBB6D10180E9B5FC7 +BF839E08691661836B5DE3E5041DA4D3B4A458E270B274C82EC58617A98F0341 +C4D379C508B3DA7F2C20A1E7CA5DC9505795944BD83EBF02022F31E50A3FAE52 +7259693253A45AD3AC1D1E40D694D4B33E8A5A09C405B52BEE5EC132C9B27B8F +4C45B3EBA9CF34BAFF627AB8D86755D31472CE8ED453F01E96F74851862DDEB6 +0A8B4C6A0D69783E632065B095924AD3D5B98A8100E52F2058E795639BF91C8C +CF10E8F4DBAC1F9BD167FCB399BCEC1652C81DBAC4B0E37DDAC9998105397E3D +73FC7E53E70028314EFEED71A935C9792CCEAE794608DC13C6D14A069A02FB43 +8A05187E9EE03AC908DBCC7551F1E933B4FCE961926D5B81CC885D8CF3F4CD3F +EEB5DEE1769A5C5D8E86C7DB3E96FA500A2EB89735C55AC3252CC280ECD07AE4 +64EC4F4BF687A866CD8A9806BF96FCB8AD9BA0972F3DBC2971F50CCB4E1A2979 +480341DC01E58273F4086B4FB7C98D4271829AC9255598669F26F5B59F3DE2F8 +9BD2FB9BF3AD79C02B8199C952D7135933BFF1A3B3D04EEE52CA1CB9A15413F2 +158BA8D689AE2F93EF3EE2AA055B2CF2CB6D077AC8F72126FCE95F30471F7AF4 +6267671B6EF1D3F5A932D94B700CF3FD7777FE123129E874DA871CC6F54D69AF +CFB6E499F50025567B58595509CBE1300AB209CD88FC472BBE9C5F8124AEF8D6 +3288921A3932D0374333DF8D0F77881B9012D75EADEBD2F80DA17B5B1CF8DCDC +C71A7E217FBC07ABE2395653552742AD35C5B3A99045B92B320711B18E9580B7 +071C0C1598A58D0CFBA46370CC8111237545DB6353BDFBBA45128109B9311523 +F493DA4EAFC9D6FF5B73A486A8D4E39C582280BE7569C1B272F2942782C52F6E +C26A3904E0EF2926B98038E35113D0D1E6B91A310F30B0BB7971E5EF0D4511D4 +888AC76E95D810A7CF7EAD44883DF3CBD91F1452F901F6448EB8914C3FE434A9 +60166AF573EB5D77DA5A16A33E5ACB089C8E0F8FEACE1F9C48C83F18B685A3B0 +027007A99175E59A6C9609A363748E53C44A1602A39E96776738B54690E9E4EE +A3104B25F24E3F3B77316CED31ED193B4A33C5E8E1CC3B2492319BDE215C1AA1 +DD86D2622627C483F831DC8FF17D9125974521EF53760CEA854F0E8DCEE92856 +7E9364B786F6E7995A3CC87196162C734CED436832DF7F10CBBD7726A1A9FE74 +5AF7E934B5418F210BACAA8C3023598DBEEB4DD2B4C92652B61C76FB1433B9EC +163099EA47869D3BA7C97B1D27503C4C8CA20E2735B650C7A18B57B8E960F8B8 +42E06826FAD393BAF7DE0D21AD910ECCC2D9D5FF7A260F2E88345617B09EB029 +432AB4ABAF89680F39FFF1722917F6EFDA157A5B5158C8A6261CE4FF77D4E971 +D892554EE4D3E1AED976FF227FA98944D159972872D6DBB6E0805F0D7F267D18 +26ACA6D4BB463E6D288CEE66B08BDDB4FC916718B3A497CA632CE6E8FC9AB174 +8EA17C8E6F053F81AFD6D42382AD9AFE8D64B2A4C7D91181A73AC25F06E5DB71 +4506F66FD51B010AE1AE5E82A3ACB0CC3D5BD1224A28B05D2470209C182FA991 +A9F2DBBF7CB018CE87D3EB1D9FF744099C62169EC03A45DF7994D8F42C326A4D +5F320EFB7ADB34F2CF4031455F5D42949CB30B925BD9C5D7F8F0D85877FA7A42 +DC6B98FBBCD08BC4A760453B73CDE333CC60A6A8F2BF2785B457CD11878F84F2 +8FE44CB9E828A5AD27EB965ED94BE35BDD3C6D6FC4027CBB93508F3116A0D4C0 +0E75B6E94219DA65169079555947CF73645A516B0B779D4342A4E65B0C8DE843 +4858368B3EAAA38BA9750EFCD7864D6F931240E80E49A8FB2ACCD96C67282060 +B4751BD16AC3232A53AC9B4DD68839A36615642E76607A784ADF74DB11E2C67B +3966754103EB44767F5DF32FB7BFD4ABD89789E9B5D23E51ACFE4E5ADEE1D4AE +26385ABF6CC8B432096689A9CAC71E086FF2F5A5111EB0F631703C7851538CD0 +D6EB492CD25F666697B3B6C184BC91B05371345FA185AEE6A5AF301128F4B4CD +75597F9ED3B7823282CD05655F3BEB5BD4BFFCD0F0199E2FDB6C9F8FB3818747 +6738C4F7610C3A2F46314B90C0DB9A4ADC56D955FF6AA22574B727D8857F2B24 +8B5D884511ED7190EEA9A71E9708D4AA1B06222D5FE5A4E25314388A959FBDDF +1EA0C85E01169B2AAD698AC73A65400E87B7A9E7EB43E022817C7392CEC3FC67 +D6663DC750D40671F0337A49F2ABDB10AE3EAB8EB746980BDEB2E69D762C19E7 +440F5275C396C3B56C6FE9196ACDE6159F41CB9A554D8320A4D71BE0F7AACC4F +466397A75E981E1A215EEEED4F3A8482A686FA7C695B6D40AE92B4150BD00DE1 +E4FFFA42AAA059FFFC4AC9491C33C05E4D27808B69E9FAE08A86FBD01A35ACCF +46E967E862960EC4FC2704B507FBDF00FB02494D7059E429E80761626678AC74 +0BF0108F8B03A95ED783A10FC5938D9E42D64E914E9A4F04EA06BE4C8D79AF99 +25B19DFCE00972D45CA59A8BA41E349840ACA3124E8F3297C26A6D1BB1B02DE6 +C52F047B55DC672DDB9BC73BE4B39410E9CFEAB0A4B1C55DEA46746AB52CA9FA +761C8C8A2D34944E904879403B0686521C9CFDC8FBC32F4AE659FDA262B41F54 +4D5D69DB0D26B43B68EAFF8C8997A267477ABFCC6FB829632BACD3129BA0127B +1B9164BB9AB6EBFDE99D84FEEC3F04533B07117AF9ECC0BE6845F0854805296C +03C11A27AF920E36D28152A50418A9EDA2F14940BFBD9ABF2F31E84D5D0EE3E1 +94F32CEDFA821CC1FEAFA56758D269643383A613B466305C21A87E58C9296CB5 +DB8DC4EEAEEA89A1E84D5DF6041A12563A0EB66C2A0F59581FA47099D429E615 +1FABC2046BFC23C7E848F53D118239D666F058113C865B01A8D4AEDD8AC89F60 +819C1A3A051AA665A43D3552760D9410843CA004B1F2CD998A3FBED3A7CA2277 +E1FEAA9AD910849B10145FC2E0D6346666DE2FF7C2AF38E2F84CE0DF16D0B90D +03E00EC3C55E5C05AD3A120CB1879E84898995AE5A205721E2AC6F88E5B57FF2 +7CD9D37EAE28F3461181FBBC340BE35601D0CDD0FCAC181EC6E2CCCA00ADEDB3 +6867BA1627D730CA71566C9388C6F0E069BFED8968B67AD465645798D18A49CE +1C34EA0A2DAE4C7D13FBA180C50EEF9827FE456C27BF25FEC28ADD3AD94486D9 +9A697024609611947D03EB461FC8D17B2EED155A46C0825FF872C1AAD02CE9D9 +A2FC62A38F4784B40CC33C298B4E8F7C3E8A3018ED0F497B054DEF36487213C6 +116F39D64454F11B0EBEA532DC3F72A16454A5EFD2A0A702139F6F6647338E06 +773E301EE8FB984CE226025F597DF0B44A73629E50D39DBE28DE1852B0C79E6A +1FBB78BCE132753A07F858898522ED3420F671D4EC657B1363D88433F155911E +991DFCD39AF4523716AB392E40BA705784376CA58F5C5F06C71EAB6734C12F8C +C6E8D698345483D4DC9194204501A98315E44C43B38D7F30C00E01F0D1024052 +D3E0C5FB320D54FF4ED525133C55CE2021F9B06130DAECE83115C5E4CA7A5E60 +78A5AB40B902EA0315651E07B8FA6367F01701B9F5460AEFCC9F591678A12F90 +A8CD4150876FBA33C30AC006B8D168BCB4B4D63259127268C996A5A59D12872B +EA4304B8A5A08ADE39604C14416F9B327ABBF977BA56FF620A97FE4F2D4D4181 +ECC349BF0776276405F54C882128121AEA5A07478E2AD6C10742FF6430EC0EAD +752F3541B1CB283CB24D7E37445D4BF42C8BC632D41C4A168EEBD0B086BDA9FA +3D17F6ADE5D0D70BEDCF0A50B1E16055999018B459146125D16689CF811CDC42 +E1563D331618A22EE81DB417DB13ABDB475396B02F8FDB041DF6B099074AE073 +202B439C5956EA33C15AA8F1F6BB27F0160337203EB289BF55D613ED95A97685 +5F86C5FC55B627453171F5BF641E5B6DCCAA31E67DFD68F968EC79BFA39B178A +D3EA21270631FD29031F64621061E60C7E2269645A51A239A207A51DB86CD07E +3BB35993A95FEAB12FF6BA96EE231F1B2935E979AC69CB0CF2416938F5FAEE48 +E813DFFB95D13BB6A92A7A6E2CC08E3789462092F4E72626279E5C8257EACE5D +B3CDF6D4704A729D020C278BF8BBD6474912424702ED4DD0368F30CAE5977FDB +3541ACD80981D99B54976936DA5AA9975B84F7F2A2B2CAC6EAADC5B2BF652891 +FF8BD1DC5BFE7033D9D2A2C79FCFCBE44D84513D542373A9CC8CC6267A6C8BFE +F2FAAF8AE6C30153EE9F280A063D05A9443DC3B99AF1C9C1F2B0D4BBC6804F99 +5167D5481B434092E61F7F6120C743597D4CC8F7F158622C87E0D7FE7595DEBE +2EE42174102C99FE6092CD19A8E424B6DF432EAFC0046595DD05EA58D034F4FC +FD90B00AA18C3CA05F03445DDD30A6F040B51DAD4F04EBCECB1D5482301978D5 +DFED67774A1C1251F2003FBF6C4E2913B259D99C55B25C3173F41AC40933CA99 +2CE8EB0145F68130A4B2960C2BE2CC89AAAF8AE833982768B321DEC8FC8EAA8F +B64A9868E32D1914C46C8A2EBFA46F7C1CF199D24DE24339661F7272A6E34829 +E62E11A0924988177435DA106D7C524C0C2BC1C2AF99D496859326FA74FABDF3 +83FD82C9144B6F03F082E20EAD92284139E45C994018F889A1FFDA5FA2B19B90 +38B9EF87D2B34A7F46AE27BB95E2195F958798982E96979BF23BC7EAFAD3F1D5 +AE454252A06C5953A6553FD93ED295F86F419D15FC76F05B0C15EECD70D0C784 +21CAD58C34FF8689CA2D0A2C9A204D99C2378421A0F57EE9A3E6C9358F3AEEE4 +E9B6A0CC3AB9DB260D68D35E66376A74B26F925F1578737AE6539575B969F269 +872A97EB9E0181BEA5241F9DB74F212F81249B71B82D547D1C9CB6FCDDCFFA1E +700FF34E08147F6E29F10F0CBEF09CD254EB5F9F8D8099C56D859AE9EBA5D4D8 +256B90DE65747C78D14B4FB8E39A67FB1039914026E0CEB6FEF629E1C024CC37 +037DA8F073991235541F09CCAD292E4F7574ED126C99628F6B208661C2EA782F +C74AE7FF1F486B781D89357F70ECDE3F36FF6580E6A0F43F9CEA95BE57AA3AE9 +D82F4D141B9F92F22466637CA739BF9397BB94F60A6F4197C6DF0C4A9F348C46 +29FDEEB9DB680EF7EA71037C2C42D15A966D378AB2192B56D24E2EFFE4421B53 +1930203249DAC898FCBB90EF4FF10B95B01E4CA59B25CBC1517740BF94243B52 +E8B96AD886C9D9EDEE636A4F8722956674D838F57A2B049E0DAAD8731CA7331E +6D5F3CBE866174B949D87043C4686B226AFAB0BC6878D1693D849CDF52B2D498 +729734641F6F8A63D0FCF3139C55D9ECABB27508613C1997A8D8AFD78C8E789A +D7C30F6C58E84FB564093D7A589F4181EEE55EEBF39F369396ECD59D90D44965 +1E267F20B980A4359B462F692E86E04E0167B965B6D958A52CD880FB69F6C60F +F0F76F5DEABE3B0E21592258BC83BD9AD7C087B9028D3F1941A2873FE5D6911C +7D353B921FEA42816DD49B48450049B8F31D7078D0AE7CD7DB8765A8781D9B75 +0547884A23E8DF7778571C650490A77F1124639AA7554AFE3D8589DDFE5D7141 +43B8AF5E82E9098B95F395C2B9988068260570B288D1882D1EEFEBD9E9B0FFD9 +331503DBF1ACAAE998CF3F3452518B30469A6C72C23D3344C4FC1DF7A8A01148 +73FD5F56F95BC98CB2278B583574471BD2E97E95E8EE1860E74300D302602DCB +74D548F0D7377C0A1887D5FB27534A5560DE1D1211F52963AC6C7523FDA0104E +72121BA9D2CF1D84B299F2826B5105F140B890484CD2D5AE03C69BC056786534 +2BAFBEB8D80273CA0395EBE9A3BF3263C1F46093C5B3F17771D7AC85CD72DFA7 +CD767C726E7BF2196380E57453AC511C99DF297E4A7D01ECB22A095355C30E6D +CAC1B1F0FC955478F0953EF9CF88940D6FBF6D77BE921BEA61F3F1C939EE6351 +C2F6A29D1F1FE4383BFBA53ECC232C6535151EA9E1E81355FA9E72847EBE8B9B +11B229BE65DFE9774B9B2970C8C08431943ED09CD1A09CD6EFF896F43EE81FF8 +69C777498FC421ADBC40DA7AB46E3C65998092017F8B6BF96FADD768770E8219 +71D03657047E0E6E154CA34E4013D724A8F78B53CE623DDD13A5F7B7FBDCB909 +455CD4AB2062AE859FEC2F78116EC8583A2B002C2D9258FE3DF659855CD98E65 +876383D0F67C2BA1DBDDC0F652875EE767025C2EC6FDDF5CDC440577D5F9ED91 +8F6593731D04B25C2868B3356C87A9ACC98AA052932E01C509DA912B44AC538C +DB92D01A4AD932CF0D48E6DC067795416BF0A4E5B9500977DA66E4B346394D3E +D27939A56887239B7FC7F15F564E51116B615A4900CF3A67F33EAED29CF39528 +2BBF2827BDAF3616AA1740B7CF12854CB51175B088CC6A697B5D5462C15B49D5 +D4E58A406B51EFF8CABDBE91FFCB58E9C8101178FFD0833FF612DF7F99891F97 +6E994A80EFC41B863696FE7EB6787E4AEDF21E8BB6D5270927CE9AD669261255 +4D345A92D79F62F15454A661B4470310C0C7F85545806CAA0CC180B957846895 +BA04D4ABDF3D89D321D9B9C7DBAE4C690F4625EEF664CD0BFE548E057E484610 +1839E6F5C8662BA539813EA1011E77B85B859E5C2D30C27E19CE1FD55E2953C0 +6C9D5E733BBF99B3FEF8EA202DCDB64B8588E0F0A5EE6D3F214321FE15C3C9D5 +9DDCFEF830B4A0C458962EDA665A95F4779CB7C6F3A1FE80C8C9EC1542EC2D9E +B583B37FAF62443FBB3E5A7F6BFE6596DF1E9651216FEBF11803FAE1CDDF8756 +A55D19B3B1898C71ACA59364386B4912DC634E04151A443C6B6C307AA2D3BDE3 +7AC16A5B39744FAE7E9BD225E04A466BEB4F9F51959F3188325DECB6CDE15C2D +66F4C612224BA6A9FC70787FF17B7E0E31F556E2E088DF214ABF9F27C39EE495 +1EE163A644106E1C1C7CF6BEF07009B38022CB5B9C33CA4C62E69DA01BA25CF0 +BCA87377622FF3C96C68D4FF09BE24612DC788F0ED2910FBB1AE8C023B7CEBF5 +86196213453251BF1231B5BDCE182503C9B0E06724133CAD069E14C36DEBF9A2 +5661BFE61BE51624F42EB5717CAE7F05DF20A27F0CD37D268BD50286E891311C +D55744A29736BEA554B466A7AEB02C5C0575EF05CCB1F69D37EC144458048245 +01EA846682850F97310FD68190044E4CE798D51699058F03F5B0035A83F96E99 +A5F7112737D436EFE6A7C60627B700D4B539288D2006CCA437D0AD04106AC8BC +9E411030E00CBCDC3F9357ACA9CE3E6A63203DF968AC474F722B889A4EC10DBB +39295354F28BD8A3A770BCE14091561583447E29292174A067DDBC4A7C638A50 +7A0F05863F435AA2C763BA5CFCF6DF8E39189E79A9178E80A305E8F03534999D +532CA867B055AFB2077A0C7B5D1B738DC0494871F707B12D1EF469EE4FFD9C63 +78FE05E1DA7E188E997AD2C03EEB2CCFDAB1019581FA9C57C8F1DA051A60B02B +C76A5F7419B32AEC483D1EE2E7512BA83AB78C796CF06D6A01AF6C1A517F8643 +141D48E3344B15CC483395CE83BB56762A423322A0AE12786626E541F85C5A2A +79DFBBE6DAC3A2754AEAE562523A5788C3B548B6DA59D3DA207E5628017BFDD0 +A9DE4072882788AA1177C695DBF0BB784F480F831C4FD4B67365B15CDBA909D5 +F83B44B360609163287D7F315CF95B8090B2BA45518F9BCD3884CA9641704A05 +37D4CEDBCF7F3208C7580AD987F7424C459333F2C7B11937BC3AD70EE12EA881 +FBAFDCCDB80A1C05D129E0C0DAA23909BC56AFEA730F64F93FF369928C40F0E5 +CBDB410CF2EF47D49B0F04841B268F954E225ADA644566B2E2A7B93A6C6EBEDF +F6CCD83C4BDD1AF12A016D640CA9CF1BCB0FA48213C25E7359294857E16A8326 +400C324F4D6D15FD011EA1D345CC8585B06A5D34A0F2103FEEDECC9D3D5C65D5 +620710092A213AC8E1C8C5AED11E350F0760D1CD7062BC1FA480A15DE733FFEE +5F428FBF94488CDBCE85D4B65593362AFCD83A782A03F80672257A67EEE33940 +89F04CEE35C0B418BF33F65357EFBA4E3839D5CA447BE8D1E7C14C99A1866A13 +115E858073E68F259F48908E980C8335F9ABEF1109A93C20164161EE5DFFCC18 +3B913D65D9ED29CE5688A0078454080BB624DAF959BF30ABD78B1964C0D38D81 +BBEE68F8C31A647B75194980EADAE5AA18609FCCFFFC73D55212DB091A812A65 +1C62893A54B9E9214A6223EF22E663B0076192EAA8338FEBD91498B875DA25C7 +DB83A8D36542F0818F02717973F1FBF55811A03592A5778CCCC941CB636E6C8C +0159AD962BBB6951D36FE9966DF8111AD385EAA574BF225F06DC016443CDEF40 +632709C6ADDA1A90DC99DC0C4AF29CD4722CC759C1E811676F12D58148FE7DE0 +6FE2C004CA06AB171D171B21D3F01BC76C5BF9C95B7BDED1E82C0DABA460AD4C +B434BFB99978D079BB31CE9B6961CDBED6BC7601A99A1F811E5A1384107A9E79 +4CD84EBBA899EEF9F33583490C3767041B9DC600FB7311C8C606F1A3C3A30630 +6C6B2E51637DD48659A31BAAD4CED67A90B9D8FC4B548320CF65C66E5D0B0726 +B2047D77C71A385C3A77DEB598E24CFAEB307185D6CF4DB6985EA47290BB4191 +F5A5700F9070499C56DE417EFCA43AAB5AA92D1620E38D9ED6E01230409EA873 +F16CF19C67466306F8D5A442B9C619D5108E77DCABFB71F3F5222D46DE8B5103 +EA329DC77AB50E9F8C73455354851AB748246C351B313D14292DCF639D80AF65 +2E765CB7C1CD67DCB2B1FFB4C7C16FF06E22229C6CA1B90DF3BC04F43DE4F520 +604F5459B3E77FD1448F38E411CF8890DFA4625A9A70018DB43BE1C83DF0715E +769DA23B17BFAC15285413BAC8B44E0B8ED023B4CC9F65427E922F7AFFD419CA +20F0E82EB61C0EE762F546EDF4F6C3BF91F991CEC5751CE393A8A1B5A740E47E +208BA82AD0AD81FB31FBDF64A44AECE390218F22B94F4912735351875810351D +7DADE83748BC01453FA6CCB00DB1F253694EFA2F906121935E446568F9C36D74 +22518EDB8490CBFC2A03E3F7C143EC67BE7758D7E018B9D17328E842A71A6DB4 +5653AD77807334DA683403FDF3909AB57EE261D12038D277D445B4AD4B9D0943 +9E1787ADA6156861B188646A3A065A2BBD52DD92CCEC0121BB56AC8961E67A21 +C6C56FAD0A430B0EAFBCEE41F8D7EFA3D1CF92A5A26AB7B1ADFCE7B43BE20CED +4721BDDD06BAFF6F0D44EAAACF15D4BEE561E4702B525EC62BCF202D52EAD25C +90F6F53F4F37E45B94C0E707B426F5D598DF95372790BACB881E0C817FB3CE27 +A8E31CBE57FDF91582510DBAF8CED1E042D592C18ED85C646507E39D28C8A6DD +073FA1DE452C4AC40489B68FD3343DC637070716DA198EC36C2A7283604B99B7 +3389D0F2D1F95455105A3B7C18400F55C617A2EB7EA84CA48F770953AF9FFF9A +B00A4C6DC1A5BB278129E7B98E1124B396DF750E2C4470DF3AB074602CF55478 +F2DD0FED01D5989EE6E52B3728E9D5EDFACAD462187C310B04914E2F34580E9F +D2D9939D2E18753A313CEFE1C6C4EC368E199D5569DAC78B62B967E2A01537E9 +6288410DADE218305D5FDC8B96F258964BEA24E3FFC3C092F7FF5A8ED7005939 +CBD7594BFACAECA3A650BB2D2BB41A9146C83BDF84CD8349989B0B7C46264EEE +B0AB0F2EA1D9911B68E9709D2AA3772094EF0A8774A4ED4B93B45EC22B6D8616 +66D1CB9EA64AE4500209113975CBE220A83B6C74EDDAC5FBC11190A44223611E +C2829BD6E3443F5938C20761F9B1EDF84D060FE45B20C86C3CCB8C7B83D74235 +598FADECA175DD7AC9C301C875DDB055AA7950C93DE8D7016A3D5D2BE2A0CF82 +94AF5DFFD81BB8E7A8B0664EF4426A765AD48C168965DBBCB4A5292E99E329E4 +3B68419B564858738F4419D2AC492DA601D7D4FB8082F16E104F507B503BF9CB +7F40A15D1D6B1BCF03D5630E16249ABE6DF0EDDB568CC19FD9F785F3F7417334 +8738B91915C553906EE1B378AFA358CFD6FA3C815F4EF44DD5BA6D26C6E17CEA +0A29B307C857D5D2CD8C3E506660D7950B82F1DE12E141F4740DE728900709C0 +696AF057305E6670C23DA0BBA5C64A111206219FF2C1CF6FE7B0EF257D5D99AB +C60AEC3AED73831760CC5D22E74727BFCBFE6810EDF4F48AB39121A82DD5821F +DE6F8A10AA6CDECFE7D4BD8E2388631D5941C5DA0F61640103E5C68F6CC413A8 +EAA7D2419F2B6A643E8F9A95F66A1ACBCAFCC7443F4E01B62320EE7DE0689EF6 +B8397698925233490BC6C4B90243E9A72770FC68CBD3854821DF66B785087743 +9058E6DE7D1D932ED00A1AB57D21067A5411DD097EB0065B1EABEB209C5B69BE +87F33EA9E280B71D4B8C8CB8C99123B8282AB57848A99699402FFF93B755ACEA +DC15E0383422646F3F80BA0698A6A51AB1A28169E38340B303950B69B881030B +1EF221BD8E44BB2549234CABFC545DE97DCBF12F75655BC523A2371D5E680BBB +82CC1D799C451E8B3C8AFF0AE63EE353520A2EAF5C4E815352BB98ED6162F08F +E2EBE7F408BECA380891A40FE3691F984D498935B11F7F295E98A256E77BD0BB +4492D8CE904D9CFF530B5A26D14A0B49DEDFA9B19DD80FFE4A56CCF3AC87C651 +FBE675846EE0A998B2BA26234849C4F95B0C5DC2D3E84A26961B1175928BCF7A +730B085C42FEB713C58A2E335CCCA1A5DA7A88F6E2BB015961C14848F61AB3DC +DA874008FE811F38B13959D227AE5B3E358F1D2BB8E2D7FEC13DF0CC79DB6D25 +5C7BC76C29CF9A0F688A0ADCF3D902FB7E9269837D1C59976F19012919F67E3A +6094482E0EB91FA4B137FE4F07CBE4557F414E60EF225666F9648AC754A28E43 +629F1F070299834C1309BC28F0659B8FA58C133F403D61BAFE7F40B6E31D6C83 +EB980B5AD4CE3F01D8547DA7FE177C1D230480F771183B302FF5C3683FC2F628 +8A9E6E5DC9C029E7957CFAB8C1C9C4B2B604812854153C683618749FBDD5FB05 +3F743A4FB268B84ACF1D9ED1283A7DB64A31B78636B4574B8A473679C3A881AC +F7858416D29D3EDB3C2A62604C0A666188BF9287118F092485FF10AC343C31B7 +66C761AE8DF4634B448201A9DB85B0BF06A2E8BE1A762ED37127DF2245084B93 +FB078BC50ABD8980CEE021547ECEC6751B2295819D5F39BC3B210560C383D887 +A4B179D0ECE8C1AC8E0A2F97DF032D1EE28F3C835D7BFA2DB9AEE349E65B73D9 +3C9A367A6C655174DC8180663D37E19C6B5C44031067CCBC577B786828DBB23A +C076FD672CD32D1AED09BF9F38834E6B16F1BDA5A34F063C64AB8EB8864E7D5F +C74EE517DC915F0C77A2DD5923A50AD8A4DC39344635AED890A5DF3E461AEE3F +E362DA67E73CD14B200DF449FBF2D92C27FAF4B895C45F370C93AF5F429A4303 +4CD0D65D1FB3EC103BB5A48C04D675928B6FCE127AB32BF205F2EDAC29B327FF +A10489744E27D249753E5661634753915059E6E2702C2F58905DE3AFCF2D4272 +9BA4DA3E6781EC67AA39B77B6DDE3968AFCAF99554580AF408293DD5CA032713 +CA5B5D28AA46606E627F53F27628FA563C4759D84697781600DE99D895B402BA +870E5427BCD0FC02B9090770CD84BC9061B76A051F6CB4921990A0DB13C2E333 +8CA0E378EBF8E9E507E22979D9B694FEC20378CBC11560FADFE040DA63FA4E56 +9D7D12D7005DFFB82D17C87C9EF63CFBA5CA887B88BDAD23B4816CDF4BAEA528 +E269CE1DB32E79840D3569ECF356984326C1E4B7C20B268FE955E9BD3884EE01 +4BD7CD21031F7623DBE183EEF39AED664EE4A94156DD0887D85F19A27C90B834 +4FC4FEC2F39029872023186B6CFCBFE065D9ED6B332D63847E5EA8DC91C8C668 +2026FAD8E24C00B2AED44466AF5BFD3FF9255EB05F7CDD90826D88D6830BE8CF +2AD621CBC121437726CFCE345418CAE44DE21AA3711E4F9DF7AB331C5B074BF7 +3FD41C21F642266E799450F7D0EBA2DBCCB9D9DF3F331602FE0FC18225BAB14E +26D1A7E72290E42B39172B949F58258D96DC335CAE79C3B583BEAF9F36AF6DE1 +67213D403790B505E753A10C277A6FAAD5327B738517D57BC130A486BC8B4746 +1D46DED8FDDB9C917B1E8D1D6E4DE551B412DBA2FFC1E35473DF49D9CBB20666 +9ED63C06DD802CA9A81BA3631F1CD8671744267037EEF17A82CF746591C63A7E +8BA5F822B443BFEEF8BB6C0717AE87D880BAD61A1A478FFF5883C463DD83CA43 +793AE5C407FA4C66A56592862EA0F626822AA8AADC651E6010A652477E63AC80 +0F32336858B94F8D40E9F9FCAC69E8813C76B5491F4CA8B291CE1E7BCD138383 +E02AE5A5C8A8B13569D813A947CC46F321029906C5DEED777724A1B34A684E60 +90F8205B446B5D744D622DE3632F31DA8EA4E412D8E65E45FF964A545CB8CB3E +654A99A1C4E6CBB8D8C61961403D12CF6BD20E99765BB5E239E8357620DA54B2 +61BC00063389228BCB59EE9565B3BB99F1AAF30D296DF5D34D86B543B41308FC +B5E55F4B0DCB6D3D5D5A027BA1E23566997C78B477E67F00A57F67414ACF113C +877AE58946253165E92084BDAA4D40250ECA51BCBD9EBFF9EBFD6369DFF081A2 +2DE96084D718C88C6DF2D167C11805CC839C7CC393C052FD4959399A9B4330EB +88CC19F2B480CF088E338708B643279D35D68C3679A6EC577997A54FEE8086D4 +94BA562BF63777FCE8EA4E0E59068A8433EF8B64BF8ED59CCE16B7916D9F1E57 +322E144D245577C69E99E84DF2367B1865CA3B5FAA34F4B00D059D09FDAF9EE6 +F57C0D4F73F17D9136F873F1A8A7D2880E7319B3188CDF8451B66E5D08E20BAE +C106696379B76C44832F51B7BFA28572850DC31EA2512E1BC3888224F96A75A0 +8B7738C1B2981A3B89D8D5ED4B7F6C3F6995C893D6C174F4E3A38268228FEDFA +A72E14856DA96125C4217DF38DA9DED696C4D62DBF37FA9FC1466A31047A6223 +DDA2F118E90B180B45D0A6D20EB1BEF9FF0C561BA1D870A01349AC1E42A6E9BE +FDA106D48928D65EC46F2CCE64D61019ECF22E75F743E9E1D0FE98FBF5729A93 +86D9AE0309816B8C5DF3E9698D51BED760CC637FDD3D8516E36B036E7D784D69 +E3512F9AD76F7C3BFC32CE40EAF7C0B7A0B1729E986790DEBD13E2DEADF92C41 +528C9DD1E835CF18CB8489B4CAB7E105CE9D16CE645599199F1D2A58BA2AFF59 +AECDF574F7C2944699ED630718FEF049139CA3F4ED5C0C5702A0DBBFAD074AC1 +78C70DD53C12EC599A5F1B2AEE886DC46426B8A21E059D78AA51E4AB57F8B4CE +5CEEB784C7FF980C36B2DE62BCFF37CF378A7017D8144AB88CCE45F3A07680B8 +32101BC312A020F621AAFC524C5F86BBC48BCF4F7C81B4B2E82CF585F06F2481 +2F8EA6A1BC2D580617140EFBC6B8F7EB7D7E323A27BE3D5AD599C6BEFBB2CDA4 +3BA86E0E16D7264833827DD01E7B4FFE6EE2454820E939066B988DD2345D97E1 +88ED2DE120992C40A3A5A073C1371662E3DE05CEAB8B438E47057EC5139AE5F9 +7CC2A859CEE5F0EB7F062946327FDC5BA33A7E1358142DC5E7B5476BD1AA7AD0 +1C024E313D070A8D7A3D62FB6B64A5FD562263B79BC832D87C60489FA0A2C4A8 +BAC86DFB78D38A6EDDB47D21A596969093A36BF8185535D3D5C987160188B6D0 +5719D2FB8C8F0F76A5A0A8562E34E7A4543863874E81CDEE68C57068734270B3 +EA9FEC6514B36D5F2484079464CAAC1E8BC82B9708E7355FA8F78C9271ED294E +146EDCF66FA86CDD1D47D5590B633CDAAC3E559609D270BB7CEB794F48B5DDDB +EF716CDDD85A9E39CC640E1232BA4E057518B0876B3491AB21CBD1ED1BF51F0E +5B171D6DEB1A7C292F2FAA36E3AAE7C21548BA6A5D681407613CE614A81AB209 +198C5F7A36F2EE329A3B3BC98B1DC8A8D30EED1D7D0F62D187225BB3224247FD +67EDFA0A6C417B3411533CA4B6BC54FACFA7D4D8377647AF0C9D562080BA8221 +B1371213B8B1E28C69C6DDB4448B8A5FED0F15656FC6A229715BF71EEDDCCE88 +146243275714C6C27476BB6AF2DDF878F223318B1ECDC0B8FC4D1010C1299A14 +83169C33DB33166F1BBBA3197AEF05A8600891D61947E919A0002297CFABF727 +0204E391480B6C4ECDFB94567478AE392F34CFA124CD2D2637ECD95197F371F4 +92CC9A34BE0FC2EC3E7A05E25D1D76157E0F59734C3969EEE34E164C7BA3829D +EB3404CA60DEDA0EB05C66D78234729EFDC442BCB0878530CAA0B8EFFF57F74B +9D3F8361A24E3ACEC3A1AC34766ED8C043B6FB579E873758C501F81939E79C76 +BA612E0F349E8DC891303776A7702C082D91CB23D2F77E08FB2EC60EE73070C6 +4E033D300A5D26F59C51241BDBBEE8DD113EE54CF6DB8642063EB84ED1CFE531 +D9E90C0A972CFA4674937455B30ED726FB98C786CBFE0CEC95EB60D2AA279F64 +C723DBDD83BFFC077DB57F399F2C6731145390B4DAFBAB65A25E0B41E617C71F +9ADD86B4CC8312E8AEC23ADF1096031DF225F59D890AB7AD5DA0CC8EFE1BC2E1 +A5360CD6799FA342B89290EA741B84A37CA3D64297C8DC6B5ADC401329873763 +E227DD032DBF2164DD14408EB89FE313988FD9335BFF72AE9A5982ADFEE44A08 +D75DD38EB950C579CB6BA4B381FC43354CD9FDCB691C413BA246F07E81764507 +E20F37B02E320E2E086179CC60350B236E249FF196DAFB94242CA7FDA746228E +1EB82BDB89AE60C453081FC2D1D9E546376F4464E9AEFF63E8CB8D6B47A4D499 +6BB3A0A8744679D7D1C05AE44E98D7325A6402228B87AA3A410367E956D24807 +07581F6AD7932EB450EB16449E1A40E7F250A989FEC92E27AC6AF78826FA6885 +ADC87FD6C0697F41BA2C7C79D777B344037BACB220B1A9A657030A5965E025A1 +F953185214804459E96A586BACC62FBEF3CE5954EF1C61467F5514ACE043D448 +5D038438250F1B85463F8A324962144F9D7E1C328816994DD3A9B31231871091 +5552844DF707EFC3F81FDF4169CEC3A1C38E24FF0F0AFACDFEFE7F745CAAEDE4 +04A092E5809AC0EA02C3F06E384B0FD60AF369F9A9EA85667035DF87C5858BF1 +603E9A419D4D8DB73AEF26F7AD52E9E394557E1B2B257F0DF026A431A192ADAD +00BD4836B2C8B54D646E8EF9E52B0FB19C4FA322409D09BF167CAC5ED3A82A48 +C8FF640CFE6D091EB6032DDCBC50F9A593B5FEF9976C67CCF409F64207FBA557 +77340CDBCA6F7380B9E2B3243FE805C4B69A3BA2FE1830139F10A403CAAA7ED0 +BF5386C7D3BC998BCA4ACD968401DF751A7EE9492A690BF0D521932FB4E63761 +DB383CDC362D8E5A563BDC4BD8D2A1DB5D900B8FDFB5329CFB85603967C42502 +0947B3FAA5AB0A96FB08A464817136A4F5BF988080CC0085CEB42879D650466E +1B972B717B18D5CDD21AE47FA495641374CD156A4F726A291D4E7C5CBC042DD6 +3D119BBA7E7163F6AFCDAA9AF22A83569D2FD35969143D992570D905A90F247B +475E253081579D0B75467A329E5B5F124DDCB602D34D12D72ABEB65E41C5C919 +BB9B1638E41165C33D20797C3755AD71F53FBB70A0FCA76D52B33097C3ADD50C +7CE5AEECB9C3378538FCA2D0C5928150FCAD751DE3611F9E84ED2A0C6DFE70FC +4AE33F879129C961929BAB02BE32CF4070F8F4F0BB0158834FB0C605A3CF5490 +4BED0B1E98A2FC5399924C4D554E41E74CB58A21200E6DD2AA0A734679EACF7B +97D1030EECA997D2371712690F8D8CFC9A4EBCBFFBB9F4E4BFD790A0F961B95B +700A2877241797ADB1CEF48AE70DE669C8A8E990F7EF38F24C269734C4E230CC +FA6B080559B635F5D5F78972786469291A062617CC8919F2C8CE94845E955DE1 +F668AAE68051854B3766B7D14962EA3C322845BCD8A00341B20A2A6A90A77DE3 +EB2757A5DF3D6292033C869AFBF5E58F4E4C0819504B93F88E6F116F39200A19 +FBF1236080BF69C9F77C53413323BC8250901D87175E2402926C33726D68FF1F +AC4C38FB4CF0EC80BF1147AEC15B05F580E4C51B2F5F01EAAF8095B02DECB458 +C2B6D8D951BB2E7DE70C31E4FA5A4FDE49AE7E89DD82B217D6579A00EFCBBA91 +14E991022833D0DF8CF05A1BD852C1879779176564B121F6FC64A795666A8920 +24DB2D57D0AC1341F032403EB030CA99BBB31BF216A87FCDD7282C4497A99AF1 +EF9E7DA614FDE80B811D62C995F5178588FFA0DE8C76E18CA223BE296CED4016 +A8B92C2C727C4E5AEC2F0C56E1D4E004FC3414502FD82A29EB4B87D8FEB92155 +F56C4C27BC1EECDDDF5F224F935CC45D2509E4AF6227C89C20C250F7C823911F +0E1CF6B31C793BAE12A61A6BF5C8DAA299201D9514267D54A2D201E4257AFD7A +8BC070BABCBA91F449CB6F546A92F87ACE058EC39AA84EBFD8FAD238EBCE0D63 +0007EB216406BA29C84FD6B9385577D04222C305114F3B59C186604F67C5AC8F +4546B1B55348E1E2CE449D3A28562FE514F36A77F66A71CA91EED86EADEED4D1 +07F36C67AB83B0BC344FB9DF4960D11FE02EECDBB829B0F2AF39FC9D02E75C5C +5D3C1BE00FD913F35AB9B9F693E7C9BE6B315B35D035585ACA19CF2C7CCAE105 +349E30AA4F57A63149D9262028C53EB8129E0F15EDCC7CFC2CDB5FC190B1010D +9F198949F56402888E3C7892E48408B34D9EE3E9418CFF92B8418498297E2449 +E7F92E983348CB30D76BDAA84DD2797D822D6F26A582F8A338B9D4D370581CDD +34D0D334CA8D7616E448C86374B65CC0131010CEF730785F3DD5ED2E26F27011 +CCC7B554FEDB02B6DEDF48CE76591CC110C65FC5CC72E7272FF63F07516AFE39 +11202DC05097DEDBE384E8DAAA2F2A422565FF426715A849EC159220C8CEBF65 +1E4FDE87CED9414AE86D6D2066F8CE0AFD31FE5A839EAF3092C2974FA170835C +31E8F1883E82EDF30AA1BD6AE0C5FD22DB9B1A53F27E404E2B8595E241843B95 +A9B16F40CAE8F8712E1BEC901165E4B64AABEAA93A544682298C5703620E42E5 +F8536D0DACD0274B1B13805CDC0ACFD5A242AACF29B8881EAF29780B65CFD8EE +21524F3F845BE6D7E8D5CF594B0B15C50A9B5A2620907241DF6100DF4AD96AE1 +9BF9254162CA6386079FB93F1F88A94BCFD6E47B1CA020129EA7F34E9A261581 +615C23C8D52AFA37AF575417C814E74D56F08AB575D44B2D0C17274BAA5611BB +8C61D49D7BA9343D8998110796E4E060523BB6B22F1D5DEA9CF8620D29A5CEF8 +5EDC173ED7142A121F0E472BDFDB29E721A825FEC5013E8794B8D132E994D583 +412370CCA2DCB10E3A5B49778AA5B4489AAC9918D4658F0E43F10558EC41D454 +FF56C8261842EB93FF326EE3856FD0A25AEDC72CF966CF6FF46383C39C44836A +22485CE993E3A0578466FC77106CCD2195126567E11E54EFFEAF8F40BC0D1B97 +634F8C121D9B62648DD61752005891596F40EFCF13A2276A4C187CB66F0B7949 +BE95486034B3E66445AEB24A084F8E535C754892FFC156AF7EA8315A1997D3D3 +FDAB4CD7C426F839FCC9BF4506C3A9430F6963AA8215E44D86ACEF423291375F +F6242DDF87980A9A5E55DFB668C74F123656CB625E5E335D2CE989FDBB269F18 +432F91A9E4D62B32E6B9BC8AB5CA32649C98597DDCDE2F343AD7E61F0F54A21B +449DCD1FECBA7CCFFFB5B2090D90251DF0E92CFF6FCB89B5A4FE39F78E9B817B +90FC9CCC283011B96319FA61E5C1BB9E2A633CB9BC346D08ECB3AEC5A4E36A75 +CF8843027E2B411B4410B5C06F3B83A37442D06B4BA57316A7C9DA5956B0AEB1 +C7A221C939DFB559CF0FD174C3E9D917DAAEF97391558C48DD1BB7992B14A8AE +55B1CFB6678C44305C03297D61D45A23A162A71873ACC77FDE7501DEEA302144 +11A8EC2224408B7B4159154C4B1CDE75D5A80FEC50C1E123B6E0ABB523B90F07 +91E363150E451670DF047132CB503719485BA8058750DF7E7961AC02B84FC89E +B8D57BCC582C6D9754CB90691F65EA57AE3D8A7F61B70AB95FD6C05B0E0D107C +7560C1C8AC53A0C5588A14412A264BD84DF2A164B1BC8CA599C58A8C581DF0CD +C9B9719A9CB243B95A41402C29F2F56C71D253FC699BBDC4F2D2FAEAC42AFA75 +DB38A8EE0398BFAB528832A80D3ED42E9E3F3375F7DA493A936EAD1162DB55F8 +79F31A554D8BF98B5E1CD6F1ED1FF319B61F5743E24FD64F42873E0BAAE0754D +13634CDB4BB284979BA95CA517BCD14F2BC5B7ADF3C105B5FEC0C9A9FC25D662 +0237C84F75CD28D122E5BA85BAC7CD5D8A520DF718AF068A62E2B9D20DFD2E16 +B9DB0234564337ED27C69DE8881A6493AF8FDBB5920CCE09D5C1FB480540C2F1 +980A6D87A4105B168D570BF0CB65E2E03860C838011393C9AF6F6D688FC52770 +EA668A2F714A1F61F77AE35A1F55FF065B799C1028ED8A5E0111581FB14E3CD6 +BE1A98601BDB8B3AB76C58D31A1EC0C72EB5965CA5ACE2E42C73DD7DF21F82D0 +1A3331DFA06E332B68858574FE9CAD3E3D720C17A2D92C53EEE6B58B230316A7 +5AA30C60CC672E473ED311E7D38C4EE2809C29F2E76EA3F5A474E6AEBA84862E +7BD677B6D9AB0C2B501BD929354DF6A3CBA66FE0FCA49EDDD22D6E660085C421 +533D735684BA3BDA798AB2CF9E8523B16389BD242E0D19953D83FEEEA8ACB5CE +5EAA4BD530D3F8C8CD72D3EF90DC038E2307A58D51800A5F9C62025039CCA4D3 +07DA0A0A0263FCB71E20C9DDC7F26718A2D1B5882C7BBDD3244701B62D890C48 +5FAF33407E9A5E4EA5D1C6910815BEECBC69FDD837E51154E84FF784896EF91E +DC45F60F9C2FB8C376B5728C7EA835A807DA811A64C3F8C7043FCECD580B0B02 +F0E23F84CF6335F261F030FB1CEA8C261EB1934C750B34039A5799356B79F65B +1CA31F02BE58D8AA229FD20CDD1BDFCF6199B6C5B9FF6D63C3585D3475C58E79 +8FCC21AFEDD5D5CB5ACC9B0F6AE689BEA23DD30F02858CA6806DB4248C837B60 +09D96D24C0E2CD5F4CD2ED50E60D03CC760D996B108017B26563E5E8FB203D96 +15FA47459C2CCF99556D0F91E5E6DE0051FB6914EA99F0016627491BA5176383 +AA37E3A49B58E488F1D6D37CE2EDA15AC652164007171D4BB2E1EC06F7ED225D +71AD96534DC26F8E167179AF8714137383561BD7EC9C5F8ABB64C334F1AF280C +4E70CA3751C2ABF7FBA2821B286A9F6DDA9E769646D5878F8860F02B8FABA6CC +A82EADF9A45A30889AD551894A018B81093344C6CB0D59D09D6DFE91112DFC9B +5F0387D8727D1963415748D482FDD5AFB001FC249FF5B02DCE1D62F011E553B2 +E767E48A1CAB27FA0237E35464C55CBC199F7596FC2F60BD9D853D825498D381 +D52C5FECDED23525AE02234F8AB609EB0339B06A46BE7AD7DC67A08FFF568B3F +25C071294F839F96C2AE03BC57DCE13855AD7400D7BE881DC5E34720F408DD31 +B6B5A33E2BE89889F0F5868C71602B086EFF8DA6554640A822B59D547C1DA709 +E29964B2E321E2E803684C8E5D64384228714509E618BFFCE97B1298203E144E +FD4E16F8C2B37AD390CA7A59E3ABDD281B2B41738C96478DEFF7DFDF45BD60B4 +BFF2C7E57027AD51112808DF8E36F0423391C8328E17AE3D71B3EA2958720539 +5182BF85FB826E5119E4D56BD5C0100647B190B3F2F671012AC37165C85962B6 +E1679413DE6F824482AACAE6301C9311BBCE073B1349BE7A287D9B6486A683C4 +4D4C541CF4667B55EC959511E0FB0DD4BFDE5F7F71341598CDD86CFD646C22C1 +A2919208944AA9C75A62F1DEF2AB80DF12023564EEF49D56B0D6D05FE2757BA8 +66F35AB485083ABE685486B81B68082FFE98C89CF09D0171A1FD0CB866E94AAF +AEEEC73F2AADC9F1B1ACD6545BCDA0CE039891B541FC674F2D6831ABFFF143A6 +8CBB10ACE99ADAC14E99ACDA73CF808B10E87B42DF4AE186BA18FBF828D0BC09 +A4A1C10FE4C47233B57CAB00B6EDD73A38F345609EA860C884E22597A1AF21A2 +4EEA28727C1A92FEF237B84507B38CAA4C66BF72CB2CF1C7F94562029B286AAD +BF01AB7FFA13A1E0D33494802667C5A3EEF5D51BE02AC508A997B5F09B747089 +2D7C3145EE5A9E7C15DB5AEC8304FB776F15122DF7B939265D4FCC43488EB42B +699CE8F68E943B035FA1F378E5621BCC00C810163737632CAB6826161D90448F +3403C32EB1B52D7FB65149EED419A765D56A05FE6A2706D998DBC84125D617A3 +37351C9C547ABB6F1AB4FADEA5A265AF4D9B45BEC4147B6CC5110251A426350E +60F3172C40805292170B850FB347DD98793AFB38E475AD2BF38F8628987E3F50 +651114D1527F030ADA4D61944E677977BB8EEE0C1EF98679246CB1D43403311F +5F09BCB30445487F82ED268577F22479EFE87DD0022D42D3328990B88601C3A0 +D5A8389C4578C3DA01F653EEF9EB5D83A98A6939320FCD6F5B6A5A60FADBBCD7 +E5A7DE5A95D1CC7DCF5A051C652B767FCBC59D61AB9FB5141F393F2028879995 +4AB737BD26D81232CA8D64DAFF989F878537C305BB5C09889235BE3727BDEE32 +EC5A4D06A68746CA33CCED3F1D456DFF0118E993C802AF0C3136FDA8B93BC16C +E22A5C124972517594A82850CDC000F6505A7C5AE9E75800EFEC3815C130EE25 +547A326325271049D9B178E23FC5FDE8880CDA9C903EB4B8A44F85620465FF4A +D097A6D89A8B644E7D9944E180A3E1EC6D2581715EADFBF3C2BE3B330B1D208F +B84C4B98E999C5684E9843E6AA2F932D1813DAF4931D12AF17FD2CB2387751D2 +5D14CEA4C66C48C7E6FD61BA6D09E591188E7CFC0F5C306672481FC77B5C6D84 +F589673C4F4EE90E2D3D1345196A10907A22585E7D55A9620FD7D191956DF340 +4C98AB5A8A3D98798F2581D409FBACC2419A031666DC9967DD10A1A565A98672 +BDCDD345FCEC9BC08698949C887E90EAF94B7CB450A9C45FCCF289DEF3380309 +D7644EF509BCFF5628ED51E056FD7848A2A36E30551E13B2A2921AE2028B2C4D +902F7C901BC54F945AA1AA018EBA00AB9A2FB36159147C74880C06A26092B54C +D3E6DD432A3507FA11384F0C08C68942C26ADD98DBE948D854199B19B0421687 +7FC55F9284AF035C5C9DB4269FE72FB251030F9A5A31A75FBBB0DBB1151EC785 +08F8CD88D6FD5A700AC0F6E0F37536C2F1228052846C3ADF9DDB7D56A57F19C1 +B8382EB996D8FECE8F8B130B89037F9FD4D58426049F99B840F337BE6A9427DE +B68BA69B32A301263F8881F35332FF35ED6BC15FBD4A8915C8CC37839BE3944E +A15701B8FABC6D533FF5D8C96B1D599DF7E2738996520A0702307E3C91A476E5 +C76AA881695D7400238B4EDC669BE334B84A66B9427432A3AB970D55A899DFCC +81F7C68D637F77121B75C0D6C073CD14A7311799CAD07684A5C0F662CB10CF9B +FDC4CB98B6E7892BFE731360E35AD6008F8154E419FE86FCAB0264173127B1C7 +92D6DAC832571CB2771F9EBF2486F61FBA0D94DBF0795D5653EDBA2F7441B683 +C3E77B314D02C049282E7B749B80C326DE8DA52D632A1A9C3C84198785161129 +D527239F456F6FA14CC264ACA06DCDF408278CF105A3786073709E365A85BBA4 +74A20C47CF495A0913CE079F33B71BAAE3928C18D59B2DB6A38E54EAD9FB87B4 +EA6D147D264E48E665A4DFB466A948811DE66770B0774C80BC2C54EB7452017A +52AC312508C6FB6A4DE3570A3DF50EB00540003382B91E06067A3D11E1DDC023 +5EF8787F1F1015152BE7F3D5F88EDE778E946768E4E333288F4DE66D604822A7 +5F2D5069B6CAB613145652E07F608A093645EB6DA6A9B231EB5EB31C097354B4 +AF54E8AF3455011E51ECC74FEB9847FEE3C42DB441DC3E39DC1650E80BB2D530 +823B1246699B391341E7D7BBE42DE15092EE2FACECE3B8290FBFE4567E4E3B09 +973088770EC250F55AB5FB3E7ECC7537909622252E7967AE84368FE204800BC5 +6C51A8DBB2DF121FD04225015DB5A39A1D6241C9874215D115A58D8329E752B4 +D5CE3B1BE30D1703A044BA14B6C71F406733E771E8F9FC662C6DDEE86BAB4F68 +DAFB63D8870938C3149CC07F6660AEC0296885F64905B8BC82B317DE4DD729C9 +5989533686291EE980EA2470794FB3DEBEBE9E41F9BD793CE4DE37D9821D44EF +803651668599D59FA7D44526F67C73C954BBB28BB25BF8606340755D02B23C42 +094CEF3CD30B04B9AE08FCDAC339FC1A9DD2008B0FF3C1F68C328541FDE6FBA9 +98DE24C4C3B3FC7D3B0D86FE89B6716E57BF46CB201F6A5EF73F05444D024D34 +639BA30B6D6F1A25D7CDB89D79FFD826663A3DCE5E9F4C72F06DD6C32A34CD22 +A7A1B7E3CD27707F4F09EAF284ACB3D960A530D4932D08028CFEB3AFC2D59170 +730ECD5D19B4D23108944CB7649AB0F1F3C286863A6A34A964A879D63CE05F1D +FC11C5B69374F1993DCCFFC99D0E597C3BC99DE67E5059FF0672F79938F4CC4E +4C66D6DCB0239444F2E614D09692297C7329411AA1CD5A540F9D61EBE2AF8B58 +DF46F4065672539C326B50BA1CB54DE5603D0799534ED0BE40AD5C72B4EBEF40 +A5EEBD414F1639AB6C955557FF9BAA0B62DBD32895B0DE12FDB66694F3CABABD +7D54F0B29F8EA32CE746B652CC9E44EA64C3F8847053D8E50CE044C990A7BA13 +7B1B0F4B2FA68D08A82C30E800F8B26CC84495B222ABB5E41824953315CE7F22 +6D8FB5AA10A3EAE16A1B5BA8A283854C5A1735D5F628DB64C8DA6E51C727EA1E +C3CF188BBE2473E9112529AA6A8DA151DBABCC26973531DD69B4A14D9783FF33 +FCD1672B629CD4DAB4EF573DFE9C3BC550C446A34940BE4437F43CCD16CFA3C0 +537ECBB7DCE1E76D9FCC2EA5E9E5656F7C7A3FE1611BA6A8AFF0667450A4A8CE +0706CDF854B4DEA79C5FC25A0556F44CA3593E89ED5881ECB5BB3EE6572F8F2D +4D31466C9AC2350898349C3208636F43D1EBF5BB2F01DCF827AD6C205F3B381F +800D5F4B827107AC881BD66BF5CEED3205535C8C3704A02614E6233344667C48 +570C4B5A3326D2F58A6111AC9B0CA7F3A48DEC898FD5AA05929492B8FF061E1C +990E08AADA5E9711658E30F71BA41A7806BEB51BE0949777E1550F54C66B8AFF +DF4129B42B71DE6101C57DAFA63FAA169145C0D6A0D6279658431E874C32250B +AB0B09056CF7A096E7E644B5B629F275194CB0CCEFC7A802F123A587156AB136 +513A7362EFC4C0EC330E11C3E25B9A943D2BDFDC1EA5C19DA64B47E690C2726A +0C0708F7A1DB146B80C6E8B4D30D28F6E8B7A7505EAC296258485AFF374652EF +ED73EFC04C6CFD28890F035DBB7A0CFCECE8AA68FA622390B782E595D4157106 +802499D76B0351617B5CDFF4F7F758DAD993DB5628B346240DF540E821144C5B +D7FAC2C00B22D8DD374C6FED26F619FF150AA2292A9D03AC7F5F6A20B3283890 +C80DB07E6923B6C485819A849BA8A3F18F7B4D309802AB3D489587721417A2DD +0B1A4D9994E3C611E3289465E657939EC06D752330EDD2D475E67F345C3527BF +0175182934D53176D5877D064F6FE1C1D559DC657E4C2CC83FB022A38E6E406F +E8F85B556F9A771F4DDA35AAE7C76DE0CCF5C2A9D9F4AC946C1A836553D792C3 +F2F8FEFF9A6D7DAB2FA5F0C9973FF8E3206680D96ACF9CAF54FB6274B99E3F9D +7E2B64C85EFDE220C15BF9F4AB5CB772197464078AE34FFEA9095DDBE6B0EFE7 +4AFCCEA58D12EB46648093EF927A8E600F0D4E239BCDDE8DD5AB6A651018E932 +746F18584378B3B4899B6E5E7B3C742835BBDE2D9271AA95E1E1C714F51B8D08 +562CFF8AC79F495578993955611AD98303AAD37FEA8CF9AF63543C1B4DC0281E +1269CECEAE77D660AB8800EAF547ADA30278345A189EB7CE9B03B936F3511496 +84E87A395C9012C66EE994141779E4282AE968FFC1E764C45751CCB23049BEED +069E6AC75A8CA8D115B4C269C8E6EB3047E0A17251D46D389F43809423BC2A8D +1730A54F8ED38019DDC4BC752539AA8FE9514EBC42F74FC8B50A850D09829810 +4CF7546878A85B8A9CCCFC866B5C30E1E5295E50D2E05F02B414B04830756970 +09BE8D4898B2CB6D2E95FA6890A620DD863B30C1EC77C08AFA711EF6C0D45878 +2E93BB6E2B4B44A5D24C55C22E6D58E4AE93A566B5545783E1B54B937D68BF21 +45A1CFA44CA87DBCEC8EF7A309015EB883D14BFD9DC89DF814697740C100B0E2 +1A5DD11DEE47681B153C4CFA026451660213253618E16F5C3B2D590363786BF0 +83E23B438E0FE85597F74C40611C5D3BB944108416AE0960432B8E59D8B64197 +81DAC51D615971E976768826B90CE2C563E498B8EE3A2D28546814F3D7E6DA78 +217C56ABD4CD323029CDB3C01B1885A9E12D5F92E773F31B50E2DC680708B37A +F234AB215B75DE93E7912E20DC4937EBE1208B476DD8BCF68F115B72FA76AF8B +B14AAC4AC7097D55B469262970369AC25526BDF3EFA81563066A37A4A71C19C2 +27611CF279C483B6C0CDE8B302C531E8F776CD557D91F348494088D6AC9CBD93 +7D0935EB5CE4C558247EFE669A39C56DC5F683337235E405BDB83CCAC1EA995A +7E437ADB4B9576683D8E6776830D570699D696B0C233BDA475B1909197F57B04 +92A0A6F9D72F4E8A56A71CC7F4729C06A5C4F9915FBA4857276A50D2A4B857D5 +3F20433EB0098D714E526D288CB0F36B88B989FF98EAA2AC2FD44DE6E0159E98 +341459E97C035442EE8974C465ED07924FE76933E6C6B2D0D632EFE2FDCEDF92 +6D1B58D9266F961916E0B21C7EDA8533638DE541728C38225C8EDBA3DF56D9DF +7CEE29D9EF955215974AB20AC024439A3730BA9227B1DBDABAA2D83443CC2F57 +21F0ADCFB8C2AF6FC327F9AB05C646C7BBFF81F3C3DAD7840CB477A2584695AC +45BA0AB785FF4C993900136B6139E4D26B5EABF1BF17A80C6370CC2BC3540A0E +4A4914C8F61A9608DE06BC8DABAB1492482AE665460981F4258B05E8F3A197C5 +30350BEA2DC89BA16224E570290845A6C7096C0C7707DAECFC85F9C853B8D65A +616E3323082033D542C13FCB10BCBDA0BA71445145A511641BD12B35AB5D8E74 +11D5EFEDE88EF9392103EC087932CF217CB44935FC6F99353CEC68F814950518 +EF919470486379FD02265F766244436BD290C65600D964044989C7F6A9672EF7 +803021A9E4AA6818125000EAE5F90D382AAE0908A26FC6083A90B88FEEC0746A +9F008C010CA98EEA7AAEA307037D2CA7200CA9BB68916CCAAB05E57FE7164A7D +C3D820303340D49EB29E6EF22A023F2D42D67A664F38C4FBDFC9A31A28A02145 +E38CC211BC73DF5F661EE9A3CAA076E43EB233583865289F66A7ACBE315AF81B +AFA2CFDE8A20549941EAE2E73E33BD0EB8D075F492724BC444FE8953F5F77B2B +4E7378CE552F79C360EEBA56B64CAA47DF10D14402EBEDFFF7069444AE3EBE3A +E96201E14EF892868F9AA982E738DCFE7E8DBE41C8F43A227EFC9EED795F5D6B +40D3A08D867F363232B20C71CF2E44B884A8CF28D96A028BE7C67DE00765793A +B1C867F0DF3E1D578D96428CF1E66632EB746C4B71314D5D009BEC8CA52A7518 +89B9255BDF988262A4BAF717FAB90525C81C223D4936F0AEE0E40908CC9E0DF3 +17AD71C0F5009CA00E1E6F8CD308501356235F63CB112C6760963857B6B20A94 +7FC16C899A7EA6743267F889D070698554DECE912C6052E04DF59FC85E67561B +3C7345EA3E21DB7206A14EAC4F46F457A83C1E2877B56EC49EF87B9B363F4B77 +BB6F51C3F1454325010AD71E28E935E74924A6ADA4A08C6C723276CBD4DA333E +C3590B7FB914E25828CEAC502704BB4C8C0C64395EED986F91D8C940D3F0ADEF +1F2749400B4D9A8BEA50CF4732DCBE21A6BA4DC17762BABC34DFA16EBF988574 +6B6363A6075CD4784CB799E35D29425D55AF001F51E565FCF4D18E98EF3C94C8 +5B88BC96A9157BED2529803EDE8E42BB57FD504764175EAED257D6E62CF9A17F +3E08727A38A0A43221BD62CBC2818ED5DDABD2E2FA6141D986229528AAEE7C73 +532A8D78FB8FDF433022F0EA43B63EEC52D3829E84AF010A2A19742296D91415 +42F9E632FFB3F0D8457AF426F0CA3B9A1D56DABD0537C9B5A9CA82E42A647CF9 +BA8D38F49445387AC896F16D85708BD8CE4BAA625EA09621EC17FD1A1377807E +DD68854483E84C181532D3B70680773CFE5D580712FD948F5D34354394D4E502 +6AD35AB042519E82177E06284CCAE4AF2C6D918FB32DFF205E9D9C88E31143FC +66DC0572961089CD0F2AD2EF82CF204E8AAB1F0122130232ACE276B134A9BB0E +91FF8020FBF69B32C93F1C10026F6B2E1D40796313D974E066BF799311595012 +59886A161B669C22EFD773802ED9321BE23DFC3240D170BE8499E1735623A130 +054EB5EC958884699867E3C94FFE49CBC9AD6C3C935E56C0712CDEB13BA92E2A +AA843CD9A30BA3C01ECC284DA4AEE6689A1A9E3D7D0F6A144C658F9441E730FC +24831893520FB7D2C69104E56D5D49DD6A86152C9BFE88F6166104AEF80B992D +406205CEA63C31A7B46D6B8C9A1782A0A0A30DD52066642554735406851F863B +BF981B4C8DC4882A03BCB160A06D18D72E61A49A23163BF92D091C35CEE0CB85 +04E3D95F3E98CBCC53B0015AD136FC481078ECF65B62EDD8EA3EF1B938119D10 +36D6D85412D1104BFAD6A4589C17B40EEEC5C3FC90933D9095B49A6956CF9F61 +E54384137A39A509200B0E51C1625CB599A91B287744677E059E6BA039B6146E +791EAE2676D2E233F2659C92A10D32A055935A193D4480B4E7069D3DDEEAC166 +1D24FE041BDD02D1A84CD43C43331AFE821B4ACC22F165DC53890D66606FA10C +B83E2BBA03C826B958FA79C31E081B5396297013A70E1FE82E76C8512402EAE6 +840E5943B19623473FF8F215D6332EC26D1DD0760142E4296287F98A30CB2A82 +8A639137E8BB018AE16F54FFB9100F533587B4812B5A7EBB0C2DD22D20F1B55B +D241DAA8614240F2B528CD48CD2F71496F181A94F181F7E85D07E4180CEFAB87 +57090401893BD680891ED7E7C9218409DD4995F3DF56E77F79CD06B9207328C1 +1427488F5876672E3806D8B8E0BB95AABA421B6629EA9A5A5FC811D43209610B +F729AA30565DC4C4A2CA67721FF1F87A4C4B26BBFB2B68766840DD148024FB21 +F2750EFD0F31FE624CAC5D606B6C14C15B1FD7D4DFF182F436399C19F22C9F57 +F243086E319BFFD7412871031E5226D494B41EB70093103C606ACD02F6B2737A +31C6DC7E3617F617471C37861161C799646C1CF8B60E9A5366C3A9EA785ADFE5 +2AA75D252775300DDF7F463E15FF6EAD513BC042837243F8514AF04586F5E451 +AEAA68E3C96574415497576D010A6D68148DE883083070DAD871E8F151C1C1F2 +2E82F50EEDEE298EE66699BADAA6677586F59AE3DA5038F513FDCFD7978B2829 +794271AD63CA26EA8970DCA4F32B57C09799C9B8D78BFBC50FD36A3F3F254799 +B313915C9640A27AF3530C68FA3053AEF80B2659AD152CAC44BEFDCA211EFD6B +1DC6A25A08183879CDB74DD95EE2779416C0B3EA306720FABA153F3BD94B0DC2 +A429050A7D6B7B5A54C2AF4F45194667C3CF2EC4014444717DC6C7100035C504 +216661A97B632FA32FC1E021AFB75B395ABF844C558122C416F3CAB82B4ED56F +15589E9F34CCB7C0C7F7B5FBBF48169105355F6EFF2F41A212C24A81BB9A466C +598B921E0CF721A525187BC75CB3B2DE6A94205517B2CAA504F351BA0DC5C26A +28CF5AC9DF3C81B888AA3C930DE00DA50DB0422A0D85A00C7E2AE3061E1E17DA +55B3E3C998466DB8337E81059214406CC58CC1C204EB3D435C50B52E14B91905 +CC33F6D9C78342EBDD3033EB6A8D41530105CDB05B2E67606A022D366284CEC8 +6BB9FF090261A42EDE521B2BD2D955050F3BD2EDE7976A68F17F889943C369FD +564CC15CC19D082B2EF4FDCB95E835A0CA799B4F8B68215006ECC332955837F1 +9118D86E07EA5D7815F66D3907EFAC1A2B76845B90B1D385EB08434B5DB96FC0 +59A97A94E4C21015EE22E04BA4A962F5ED4BF157A6 +0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisb.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisb.ttf new file mode 100644 index 0000000000..1e1ee437da Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisb.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisbi.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisbi.ttf new file mode 100644 index 0000000000..c7072a7aba Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisbi.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisr.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisr.ttf new file mode 100644 index 0000000000..c47fd20bea Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisr.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisri.ttf b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisri.ttf new file mode 100644 index 0000000000..8a3b012135 Binary files /dev/null and b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/localization/ncep/fontFiles/luxisri.ttf differ diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/ConditionalColorBar.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/ConditionalColorBar.java new file mode 100644 index 0000000000..60e74d3e78 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/ConditionalColorBar.java @@ -0,0 +1,587 @@ +package gov.noaa.nws.ncep.viz.rsc.plotdata.advanced; + + +import java.util.ArrayList; +import javax.measure.unit.Unit; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; + +import gov.noaa.nws.ncep.viz.common.RGBColorAdapter; + +/** + * A ColorBar for use by Plot resources to specify conditional coloring (assigns colors to + * defined interval ranges). + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#     Engineer    Description
+ * ------------ ----------  ----------- --------------------------
+ * 07/23/12     #431        S. Gurung   Initial Creation.
+ * 
+ * 
+ * + * @author sgurung + * @version 1 + */ + +@XmlAccessorType(XmlAccessType.NONE) +@XmlRootElement(name = "conditionalColorBar") +public class ConditionalColorBar { + + @XmlElement(name = "label_Color") + @XmlJavaTypeAdapter(RGBColorAdapter.class) + private RGB labelColor = new RGB(255,255,255) ; + + @XmlElement(name = "Interval_Value") + private final ArrayList intervals = new ArrayList(); + + @XmlElement(name = "Interval_Color") + @XmlJavaTypeAdapter(RGBColorAdapter.class) + private final ArrayList intervalRGBs = new ArrayList(); + + private final ArrayList colors = new ArrayList(); + + private Unit dataUnits; + + @XmlElement(name = "show_Labels") + private Boolean showLabels = true; + + @XmlElement (name = "draw_ToScale") + private Boolean drawToScale = false; + + private static final Float defaultLength = .5f; + private static final int defaultWidth = 15; + + @XmlElement(name = "lengthRatio") + private Float lengthAsRatio = defaultLength; // as a ratio of the screen size + + @XmlElement(name = "widthPx") + private Integer widthInPixels = defaultWidth; // in pixels ? + + @XmlElement(name = "num_Decimals") + private int numDecimals=0; + + private Display display=null; // the Display used to create the Colors in the intervals + + public ConditionalColorBar() { + } + + // create from a list of intervals and colors. + // There should be 1 more interval than colors since this will start with the + // first interval as the lower end of the first interval. Float.NEGATIVE_INFINITY and + // POSITIVE_INFINITY can be used to create intervals below/above a given value. + // + + public ConditionalColorBar( ConditionalColorBar cbar ) { + if( cbar == null ) { + return; + } + drawToScale = cbar.drawToScale; + labelColor = cbar.labelColor; + dataUnits = cbar.dataUnits; + showLabels = cbar.showLabels; + lengthAsRatio = cbar.lengthAsRatio; + widthInPixels = cbar.widthInPixels; + numDecimals = cbar.numDecimals; + for( int i=0 ; i 255 ? 255 : rgbVal) ); + } + + public int getNumIntervals() { + return (intervals.isEmpty() ? 0 : intervals.size()-1); + } + + public void addColorBarInterval( Float min, Float max, RGB rgb ) { + if( min >= max ) { + System.out.println("addColorBarInterval : min >= max, "); + return; + } + + // if this is the first interval then create it + if( getNumIntervals() == 0 ) { + intervals.add( min ); + intervals.add( max ); + intervalRGBs.add( rgb ); + } + // if this interval is outside the current range then add one or more + // new intervals + else if( max <= intervals.get(0) ) { + if( max < intervals.get(0) ) { + intervals.add(0, max); + intervalRGBs.add( 0, rgb ); + } + intervals.add(0, min); + intervalRGBs.add( 0, rgb ); + } + else if( min >= intervals.get( getNumIntervals() ) ) { + if( min > intervals.get( getNumIntervals() ) ) { + intervals.add( min); + intervalRGBs.add( rgb ); + } + intervals.add( max); + intervalRGBs.add( rgb ); + } + else { + // first find the current interval that the new interval + // begins in and add an entry for it. If the new max equals + // an + int newIntIndx = -1; + + for( int i=0 ; newIntIndx == -1 && i intervals.get(i) && min <= intervals.get(i+1) ) { + + newIntIndx = i+1; + + if( min < intervals.get(newIntIndx) ) { + intervals.add( newIntIndx, min ); + intervalRGBs.add( newIntIndx, rgb ); + } + // if the new max interval doesn't match any of the existing + // intervals then add a new interval. Also if the max is + // greater than any of the current intervals then we will + // remove them. + newIntIndx++; + + while( newIntIndx <= getNumIntervals() && + max > intervals.get(newIntIndx) ) { + intervals.remove(newIntIndx); + intervalRGBs.remove(newIntIndx); + } + + if( max < intervals.get(newIntIndx) ) { + intervals.add( newIntIndx, min ); + intervalRGBs.add( newIntIndx, rgb ); + } + } + } + } + + recreateColorsFromRGB(); + } + + public RGB getLabelColor() { + return labelColor; + } + + public void setLabelColor(RGB labelColor) { + this.labelColor = labelColor; + } + + public Boolean getShowLabels() { + return showLabels; + } + + public void setShowLabels(Boolean showLabels) { + this.showLabels = showLabels; + } + + public Boolean getDrawToScale() { + return drawToScale; + } + + public void setDrawToScale(Boolean drawToScale) { + this.drawToScale = drawToScale; + } + + public Unit getDataUnits() { + return dataUnits; + } + + public void setDataUnits(Unit dataUnits) { + this.dataUnits = dataUnits; + } + + public int getNumDecimals() { + return numDecimals; + } + + public void setNumDecimals(int numDecimals) { + this.numDecimals = numDecimals; + } + + // + // Methods to get/set values for the colorBar intervals and colors + // + public boolean isValueInInterval( int c, Float value, Unit units ) { + if( c < 0 || c >= getNumIntervals() ) { + return false; + } + if( c == 0 && + value.equals( intervals.get(c) ) ) { + return true; + } + else { + // TODO : add support for units + return ( value > intervals.get(c) && + value <= intervals.get(c+1) ); + } + } + + public RGB getRGB( int c ) { + return ( c < getNumIntervals() ? intervalRGBs.get(c) : null ); + } + + public void setRGB( int c, RGB rgb ) { + if( c < 0 || c >= getNumIntervals() ) { + return; + } + intervalRGBs.set(c,rgb); + + if( display != null ) { + colors.get(c).dispose(); + colors.set(c, new Color( display, rgb ) ); + } + } + + public Float getIntervalMin( int c ) { + return ( c < getNumIntervals() ? intervals.get(c) : null ); + } + + public Float getIntervalMax( int c ) { + return ( c < getNumIntervals() ? intervals.get(c+1) : null ); + } + + // when setting the min and max interval values this will also update + // the min or max values of adjacent intervals + // + public void setIntervalMin( int c, Float min ) { + if( c >= getNumIntervals() ) { + return; + } + else if( min == Float.NEGATIVE_INFINITY && c != 0 ) { + System.out.println("Error setting min interval to -Inf."); + return; + } + else if( c != 0 && min <= getIntervalMin(c-1) ) { + System.out.println("Error setting min interval < prev min."); + return; + } + else if( min >= getIntervalMax(c) ) { + System.out.println("Error setting min interval > max."); + return; + } + else { + intervals.set(c,min ); + } + } + + // It is assumed that range checking was done before this method was called. + public void setIntervalMax( int c, Float max ) { + if( c >= getNumIntervals() ) { + return; + } + else if( max == Float.POSITIVE_INFINITY && c != 0 ) { + System.out.println("Error setting max interval to -Inf."); + return; + } + else if( max <= getIntervalMin(c) ) { + System.out.println("Error setting max interval < min."); + return; + } + else if( c != getNumIntervals()-1 && + max >= getIntervalMax(c+1) ) { + System.out.println("Error setting max interval > next max."); + return; + } + else { + intervals.set(c+1,max ); + } + } + + // if numIntervals is passed in we will return the max value of the last interval + // + public String getLabelString(int i) { + if( !showLabels || i > getNumIntervals() ) { + return null; + } + + double mult = Math.pow(10,numDecimals); + float intVal = intervals.get(i); + if( intVal == Float.NEGATIVE_INFINITY ) { + return "-Inf"; + } + else if( intVal == Float.POSITIVE_INFINITY ) { + return "Inf"; + } + else { + String lblStr = Float.toString( (float)(Math.round(intervals.get(i) * mult) / mult) ); + // really should use a Formatter here but since i'm not, clean this up for the case numDecimals = 0 and + // the Float keeps an '.0' at the end. + if( numDecimals == 0 && lblStr.endsWith(".0") ) { + lblStr = lblStr.substring(0, lblStr.length()-2); + } + return lblStr; + } + } + + public void createNewInterval( int c ) { + if( c >= getNumIntervals() ) { + return; + } + + // add another element to the lists + // copy the last interval to the ennd of the lists + intervals.add( null ); //intervals.get( intervals.size()-1 ) ); + intervalRGBs.add( null ); //intervalRGBs.get( intervalRGBs.size()-1 ) ); + + for( int i=getNumIntervals()-1 ; i>c ; i-- ) { + + intervalRGBs.set( i, intervalRGBs.get(i-1) ); + + intervals.set( i+1, intervals.get(i) ); + } + + recreateColorsFromRGB(); + + // now split the new interval. If the min or max is Inf then we will use the + // size of the adjacent interval as a default size. + if( intervals.get(c) == Float.NEGATIVE_INFINITY && + intervals.get(c+1) == Float.POSITIVE_INFINITY ) { + intervals.set( c+1, 0f ); + } + else if( intervals.get(c) == Float.NEGATIVE_INFINITY ) { + intervals.set( c+1, intervals.get(c+1)-1.0f ); + } + else if( intervals.get(c+1) == Float.POSITIVE_INFINITY ) { + intervals.set( c+1, intervals.get(c)+1.0f ); + } + else { + Float mult = (float) (Math.pow(10, numDecimals)); + + if( intervals.get(c+1) - intervals.get(c) < 2*1/mult ) { + System.out.println("Interval is too small to split"); + return; + } + Float newIntVal = (intervals.get(c+1)+intervals.get(c))/2f; + newIntVal = (float)(Math.round(newIntVal * mult) / mult); + + intervals.set( c+1, newIntVal ); + } + } + + public void removeInterval( int c ) { + if( c >= getNumIntervals() ) { + return; + } + // if removing the last interval + intervals.remove( c == getNumIntervals()-1 ? c : c+1); + intervalRGBs.remove(c); + + recreateColorsFromRGB(); + + } + + // need to set the Device before the colors are created. + public Color getColor( int c ) { + if( display == null ) { + return null; + } + + if( c < getNumIntervals() ) { + // if for some reason there are fewer colors than intervals then fill in the colors + // array from the rgb array + while( colors.size() < getNumIntervals() ) { + colors.add( new Color( display, getRGB( colors.size() ) ) ); + } + return colors.get(c); + } + else return null; + } + + // all the Colors in the intervals list will have this same device + public void setColorDevice( Display disp ) { + if( display != disp ) { + display = disp; + + recreateColorsFromRGB(); + } + } + + private void recreateColorsFromRGB() { + for( Color c : colors ) { + c.dispose(); + } + colors.clear(); + + if( display == null ) { + return; + } + + for( int i=0 ; i + * SOFTWARE HISTORY + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 07/24/12 #431 S. Gurung Initial Creation. + * + * + * + * @author sgurung + * @version 1 + */ + +public class ConditionalColorBarEditor extends Composite { + private final int CBAR_XOFF = 15; + private final int CBAR_YOFF = 50; + private ArrayList colorBarRects = null; + private ArrayList intrvlsToLabel = null; + private int seldIntrvl = 0; + + private int dragXvalue = 0; + + private final Canvas canvas; + private Font font; + private Color canvasColor; + private Color seldColor; + private Color labelColor; + + private ConditionalColorBar colorBar; + + private Point canvasSize = null; + + private Float pixPerUnit = 1.0f; + + final Spinner numDecimalsSpnr; + final Button showLabelsBtn; + + final Spinner intrvlMinSpnr; + final Spinner intrvlMaxSpnr; + final Text pixelNumTxt; + + final Button labelPixelBtn; + + private Button negInfIntrvlBtn; + private Button posInfIntrvlBtn; + private Text negInfIntrvlTxt; + private Text posInfIntrvlTxt; + + private Composite colorComp; + private Composite labelColorComp; + + final ColorButtonSelector intrvlColorSelector; + final ColorButtonSelector labelColorSelector; // also used for the border color + + private Cursor pointerCursor; + private Cursor dragIntrvlCursor; + + private Display colorDevice; + + private double scaleMult = 1.0; + + private final Listener mouseLstnr = new Listener() { + + @Override + public void handleEvent(Event e) { + canvas.redraw(); + switch (e.type) { + case SWT.MouseDoubleClick : + System.out.println("Double Click"); // doesn't work? + break; + case SWT.MouseDown: + if ( e.button != 1 ) { + return; + } + + for( Rectangle rect : colorBarRects ) { + int intrvlIndx = colorBarRects.indexOf( rect ); + + // if non-image and if drawing to scale then we + // first check to see if clicking on the edge of an interval + // (give them a little room for error) + // (can't drag the last interval) + if(colorBar.getDrawToScale() ) { + + if( intrvlIndx != colorBarRects.size()-1 && + Math.abs( e.x - rect.x-rect.width ) <= 1 ) { + + dragXvalue = rect.x+rect.width; + seldIntrvl = colorBarRects.indexOf( rect ); + // updateSelectedInterval(); + break; + } + } + + if( rect.contains(e.x, e.y) ) { + seldIntrvl = colorBarRects.indexOf( rect ); + updateSelectedInterval(); + } + } + + canvas.redraw(); + + break; + + case SWT.MouseMove: + // if not dragging, check if we on an interval and change the cursor + // + if( dragXvalue == 0 ) { + boolean crossingInterval = false; + + // it only makes sense for the user to be able to drag an interval if + // the colorbar is drawn to scale. + if( colorBar.getDrawToScale() ) { + // check to see if crossing the edge of an interval (but not the last interval) + for( int i=0 ; i= rect.y-2 && e.y < rect.y+rect.height+2 ) { + if( Math.abs( e.x - rect.x-rect.width ) <= 1 ) { + crossingInterval = true; + break; + } + } + } + } + + canvas.setCursor( (crossingInterval ? dragIntrvlCursor : pointerCursor) ); + } + else { + dragXvalue = e.x; + + // if the user drags the max value past the min value or past + // an max value for the next interval then we will remove it and + // stop dragging. + if( e.x <= colorBarRects.get(seldIntrvl).x ) { + colorBar.removeInterval(seldIntrvl); + dragXvalue = 0; + } + else { // note that we can't drag the last interval + Rectangle nextRect = colorBarRects.get(seldIntrvl+1); + + if( e.x >= nextRect.x + nextRect.width ) { + Float newMax = colorBar.getIntervalMax( seldIntrvl+1 ); + colorBar.removeInterval(seldIntrvl+1); + colorBar.setIntervalMax(seldIntrvl, newMax ); + dragXvalue = 0; + } + } + + computeColorBarRectangles(); + updateSelectedInterval(); + } + + break; + + case SWT.MouseUp: + if ( e.button != 1 ) { + return; + } + // if dragging, then interpolate the new max and update the interval + if( dragXvalue != 0 ) { + Float newMax = interpolateNewIntervalMax(); + if( newMax != Float.NaN ) { + colorBar.setIntervalMax( seldIntrvl, newMax ); + } + + computeColorBarRectangles(); + updateSelectedInterval(); + + dragXvalue = 0; + } + + canvas.redraw(); + break; + } + } + }; + + public ConditionalColorBarEditor( Composite parent, ConditionalColorBar cbar ) { + super( parent, SWT.NONE ); + + colorBar = cbar; + colorDevice = parent.getDisplay(); + + initialize( ); + + Composite topForm = this; + FormData fd = new FormData( 600, 260 ); + fd.top = new FormAttachment( 0, 0 ); + fd.left = new FormAttachment( 0, 0 ); + fd.right = new FormAttachment( 100, 0 ); + fd.bottom = new FormAttachment( 100, 0 ); + topForm.setLayoutData( fd ); + + topForm.setLayout( new FormLayout() ); + + numDecimalsSpnr = new Spinner( topForm, SWT.BORDER ); + numDecimalsSpnr.setToolTipText("Number of decimals"); + fd = new FormData( ); + fd.left = new FormAttachment( 10, 100 ); + fd.top = new FormAttachment( 0, 15 ); + numDecimalsSpnr.setLayoutData( fd ); + + Label numDecimalsLbl = new Label( topForm, SWT.NONE ); + numDecimalsLbl.setText( "Number of Decimals" ); + fd = new FormData( ); + fd.right = new FormAttachment( numDecimalsSpnr, -10, SWT.LEFT ); + fd.top = new FormAttachment( numDecimalsSpnr, 3, SWT.TOP ); + numDecimalsLbl.setLayoutData( fd ); + + Label lblColLbl = new Label( topForm, SWT.NONE ); + lblColLbl.setText( "Label Color" ); + fd = new FormData( ); + fd.top = new FormAttachment( numDecimalsSpnr, 4, SWT.TOP ); + fd.left = new FormAttachment( numDecimalsSpnr, 35, SWT.RIGHT ); + lblColLbl.setLayoutData( fd ); + + labelColorComp = new Composite( topForm, SWT.None ); + fd = new FormData(); + fd.top = new FormAttachment( lblColLbl, -2, SWT.TOP ); + fd.left = new FormAttachment( lblColLbl, 20, SWT.RIGHT ); + labelColorComp.setLayoutData( fd ); + + GridLayout gl = new GridLayout(); + gl.marginHeight = 0; + gl.marginWidth = 0; + labelColorComp.setLayout( gl ); + + labelColorSelector = new ColorButtonSelector( labelColorComp, 50, 25 ); + + showLabelsBtn = new Button( topForm, SWT.CHECK ); + showLabelsBtn.setText( "Show Labels"); + fd = new FormData( ); + fd.left = new FormAttachment( labelColorComp, 35, SWT.RIGHT ); + fd.top = new FormAttachment( labelColorComp, 0, SWT.TOP ); + showLabelsBtn.setLayoutData( fd ); + + canvas = new Canvas(topForm, SWT.BORDER); + + fd = new FormData( ); + fd.height = 100; + fd.top = new FormAttachment( numDecimalsSpnr, 25, SWT.BOTTOM ); + fd.left = new FormAttachment( 0, 20 ); + fd.right = new FormAttachment( 100, -20 ); + + canvas.setLayoutData( fd ); + + colorComp = new Composite( topForm, SWT.None ); + fd = new FormData(); + fd.top = new FormAttachment( canvas, 25, SWT.BOTTOM ); + fd.left = new FormAttachment( 50, -30 ); + fd.bottom = new FormAttachment( 100, -20 ); + colorComp.setLayoutData( fd ); + colorComp.setLayout( gl ); + + intrvlColorSelector = new ColorButtonSelector( colorComp, 50, 25 ); + + labelPixelBtn = null; + pixelNumTxt = null; + intrvlMinSpnr = new Spinner( topForm, SWT.BORDER | SWT.READ_ONLY); + intrvlMaxSpnr = new Spinner( topForm, SWT.BORDER | SWT.READ_ONLY); + negInfIntrvlBtn = new Button( topForm, SWT.CHECK ); + posInfIntrvlBtn = new Button( topForm, SWT.CHECK ); + negInfIntrvlTxt = new Text( topForm, SWT.BORDER | SWT.READ_ONLY ); + posInfIntrvlTxt = new Text( topForm, SWT.BORDER | SWT.READ_ONLY ); + createNonImageCbarWidgets(); + + initWidgets(); + + computeColorBarRectangles(); + + updateSelectedInterval(); + } + + private void createNonImageCbarWidgets() { + Composite topForm = this; + FormData fd; + + fd = new FormData(); + fd.width = 40; + fd.top = new FormAttachment( colorComp, 0, SWT.TOP ); + fd.right = new FormAttachment( colorComp, -25, SWT.LEFT ); + intrvlMinSpnr.setLayoutData( fd ); + + fd = new FormData(); + fd.top = new FormAttachment( intrvlMinSpnr, 0, SWT.TOP ); + fd.left = new FormAttachment( intrvlMinSpnr, 0, SWT.LEFT ); + fd.right = new FormAttachment( intrvlMinSpnr, 0, SWT.RIGHT ); + fd.bottom = new FormAttachment( intrvlMinSpnr, 0, SWT.BOTTOM ); + + negInfIntrvlTxt.setLayoutData( fd ); + negInfIntrvlTxt.setVisible( false ); + negInfIntrvlTxt.setBackground( negInfIntrvlTxt.getParent().getBackground()); + negInfIntrvlTxt.setText("-Inf"); + + Label intrvlMinLbl = new Label( topForm, SWT.NONE ); + intrvlMinLbl.setText( "Minimum" ); + fd = new FormData( ); + fd.left = new FormAttachment( intrvlMinSpnr, 0, SWT.LEFT ); + fd.bottom = new FormAttachment( intrvlMinSpnr, -2, SWT.TOP ); + intrvlMinLbl.setLayoutData( fd ); + + fd = new FormData(); + fd.width = 40; + fd.top = new FormAttachment( colorComp, 0, SWT.TOP ); + fd.left = new FormAttachment( colorComp, 20, SWT.RIGHT ); + intrvlMaxSpnr.setLayoutData( fd ); + + fd = new FormData(); + fd.top = new FormAttachment( intrvlMaxSpnr, 0, SWT.TOP ); + fd.left = new FormAttachment( intrvlMaxSpnr, 0, SWT.LEFT ); + fd.right = new FormAttachment( intrvlMaxSpnr, 0, SWT.RIGHT ); + fd.bottom = new FormAttachment( intrvlMaxSpnr, 0, SWT.BOTTOM ); + + posInfIntrvlTxt.setLayoutData( fd ); + posInfIntrvlTxt.setVisible( false ); + posInfIntrvlTxt.setBackground(posInfIntrvlTxt.getParent().getBackground()); + posInfIntrvlTxt.setText("Inf"); + posInfIntrvlTxt.setBounds( intrvlMaxSpnr.getBounds() ); + + Label intrvlMaxLbl = new Label( topForm, SWT.NONE ); + intrvlMaxLbl.setText( "Maximum" ); + fd = new FormData( ); + fd.left = new FormAttachment( intrvlMaxSpnr, 0, SWT.LEFT ); + fd.bottom = new FormAttachment( intrvlMaxSpnr, -2, SWT.TOP ); + intrvlMaxLbl.setLayoutData( fd ); + + Button addIntrvlBtn = new Button( topForm, SWT.PUSH ); + fd = new FormData(); + addIntrvlBtn.setText(" Insert "); + fd.top = new FormAttachment( colorComp, 0, SWT.TOP ); + fd.right = new FormAttachment( intrvlMinSpnr, -20, SWT.LEFT ); + addIntrvlBtn.setLayoutData( fd ); + + Button removeIntrvlBtn = new Button( topForm, SWT.PUSH ); + fd = new FormData(); + removeIntrvlBtn.setText(" Remove "); + fd.top = new FormAttachment( colorComp, 0, SWT.TOP ); + fd.left = new FormAttachment( intrvlMaxSpnr, 20, SWT.RIGHT ); + removeIntrvlBtn.setLayoutData( fd ); + + fd = new FormData(); + fd.top = new FormAttachment( addIntrvlBtn, 0, SWT.TOP ); + fd.right = new FormAttachment( addIntrvlBtn, -20, SWT.LEFT ); + negInfIntrvlBtn.setLayoutData( fd ); + + negInfIntrvlBtn.setText("-Inf"); + negInfIntrvlBtn.setVisible(false); + + negInfIntrvlBtn.addSelectionListener( new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if( negInfIntrvlBtn.getSelection() ) { + if( seldIntrvl == 0 ) { // should be 0 if this is visible + colorBar.addColorBarInterval(Float.NEGATIVE_INFINITY, colorBar.getIntervalMin(0), new RGB(100,100,100) ); + } + } + else { // + if( seldIntrvl == 0) { + // This will remove the first interval but will keep the Inf minimum so + // we will remove it an replace the min with the min of the next interval + Float saveMin = 0.0f; + if (colorBar.getNumIntervals() > 1) { + saveMin = colorBar.getIntervalMin(1); + colorBar.removeInterval(0); + } + colorBar.setIntervalMin(0, saveMin); + } + } + + computeColorBarRectangles(); + updateSelectedInterval(); + } + }); + + + fd = new FormData(); + fd.top = new FormAttachment( removeIntrvlBtn, 0, SWT.TOP ); + fd.left = new FormAttachment( removeIntrvlBtn, 20, SWT.RIGHT ); + posInfIntrvlBtn.setLayoutData( fd ); + + posInfIntrvlBtn.setText("Inf"); + posInfIntrvlBtn.setVisible(false); + + posInfIntrvlBtn.addSelectionListener( new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + int lastInt = colorBar.getNumIntervals()-1; + + if( posInfIntrvlBtn.getSelection() ) { + if( seldIntrvl == lastInt ) { // sanity check + colorBar.addColorBarInterval( colorBar.getIntervalMax(lastInt), Float.POSITIVE_INFINITY, new RGB(100,100,100) ); + seldIntrvl++; + } + } + else { // no infinite interval + if( seldIntrvl == lastInt) { + // This will remove the first interval but will keep the Inf minimum so + // we will remove it an replace the min with the min of the next interval + Float saveMax = 100.0f; + if (seldIntrvl != 0) { + saveMax = colorBar.getIntervalMax(seldIntrvl-1); + colorBar.removeInterval(lastInt); + seldIntrvl--; + } + colorBar.setIntervalMax(seldIntrvl, saveMax); + } + } + + computeColorBarRectangles(); + updateSelectedInterval(); + } + }); + + removeIntrvlBtn.addSelectionListener( new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if( colorBar.getNumIntervals() == 1 ) { + // popup a msg dialog + System.out.println("Can't remove last interval"); + return; + } + + colorBar.removeInterval( seldIntrvl ); + + if( seldIntrvl >= colorBar.getNumIntervals() ) { + seldIntrvl = colorBar.getNumIntervals()-1; + } + + computeColorBarRectangles(); + updateSelectedInterval(); + } + }); + + addIntrvlBtn.addSelectionListener( new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + colorBar.createNewInterval( seldIntrvl ); + computeColorBarRectangles(); + updateSelectedInterval(); + } + }); + + intrvlMinSpnr.addModifyListener( minSpnrListener); + + intrvlMaxSpnr.addModifyListener(maxSpnrListener); + + removeModifyListenersForSpinners(); + intrvlMinSpnr.setDigits( colorBar.getNumDecimals() ); + intrvlMinSpnr.setIncrement(1); + + intrvlMaxSpnr.setDigits( colorBar.getNumDecimals() ); + intrvlMaxSpnr.setIncrement(1); + + addModifyListenersForSpinners(); + + } + + private void initialize( ) { + + int numDecimals = colorBar.getNumDecimals(); + scaleMult = Math.pow(10,numDecimals); + + colorBar.setColorDevice( colorDevice ); + + pointerCursor = new Cursor( colorDevice, SWT.CURSOR_ARROW ); + dragIntrvlCursor = new Cursor( colorDevice, SWT.CURSOR_SIZEWE ); + + labelColor = new Color( colorDevice, colorBar.getLabelColor() ); + canvasColor = new Color( colorDevice, 0, 0, 0); + seldColor = new Color( colorDevice, 255, 255, 255 ); // white + + font = new Font( colorDevice, "Times", 10, SWT.BOLD ); + } + + // create listeners and init values and selections + // + private void initWidgets( ) { + seldIntrvl = 0; + + canvasSize = canvas.getSize(); + + numDecimalsSpnr.setSelection( colorBar.getNumDecimals() ); + + numDecimalsSpnr.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + colorBar.setNumDecimals( numDecimalsSpnr.getSelection() ); + + int numDecimals = colorBar.getNumDecimals(); + scaleMult = Math.pow(10,numDecimals); + + removeModifyListenersForSpinners(); + + intrvlMinSpnr.setDigits( colorBar.getNumDecimals() ); + intrvlMinSpnr.setIncrement(1); + + intrvlMaxSpnr.setDigits( colorBar.getNumDecimals() ); + intrvlMaxSpnr.setIncrement(1); + + addModifyListenersForSpinners(); + + computeColorBarRectangles(); + updateSelectedInterval(); + } + }); + + numDecimalsSpnr.setMinimum( 0 ); + numDecimalsSpnr.setMaximum( 2 ); + numDecimalsSpnr.setIncrement(1); + + showLabelsBtn.setSelection( colorBar.getShowLabels() ); + + showLabelsBtn.addSelectionListener( new SelectionAdapter() { + public void widgetSelected( SelectionEvent e ) { + colorBar.setShowLabels( showLabelsBtn.getSelection() ); + computeColorBarRectangles(); + } + }); + + canvas.setFont(font); + canvas.setBackground( canvasColor ); + + canvas.addPaintListener( new PaintListener () { + @Override + public void paintControl(PaintEvent e) { + drawColorBar( (Canvas)e.getSource(), e.gc ); + } + }); + + canvas.addControlListener(new ControlListener() { + @Override + public void controlMoved(ControlEvent e) { + canvasSize = canvas.getSize(); + computeColorBarRectangles(); + } + + @Override + public void controlResized(ControlEvent e) { + canvasSize = canvas.getSize(); + computeColorBarRectangles(); + } + + }); + + canvas.addListener( SWT.MouseDown, mouseLstnr ); + canvas.addListener( SWT.MouseMove, mouseLstnr ); + canvas.addListener( SWT.MouseUp, mouseLstnr ); + + labelColorSelector.setColorValue( colorBar.getLabelColor() ); + + intrvlColorSelector.addListener(new IPropertyChangeListener() { + public void propertyChange( PropertyChangeEvent event ) { + colorBar.setRGB(seldIntrvl, intrvlColorSelector.getColorValue() ); + canvas.redraw(); + } + }); + + labelColorSelector.addListener(new IPropertyChangeListener() { + public void propertyChange( PropertyChangeEvent event ) { + colorBar.setLabelColor( labelColorSelector.getColorValue() ); + if( labelColor != null ) { + labelColor.dispose(); + } + labelColor = new Color( colorDevice, labelColorSelector.getColorValue() ); + + canvas.redraw(); + } + }); + + } + + // update the values used to draw the colorBar + private void computeColorBarRectangles() { + + // if an interval has been removed or added then just start over with a new array + if( colorBarRects == null || + colorBarRects.size() != colorBar.getNumIntervals() ) { + colorBarRects = new ArrayList(); + + for( int c=0 ; c 0 ) { + barIntWidth = (canvasSize.x-2*CBAR_XOFF)/colorBarRects.size(); + } + + if( colorBar.getDrawToScale() ) { + int intCnt = colorBar.getNumIntervals(); + + // the size in pixels of an interval to +- infinity + int infIntSize = cbarPixWidth/intCnt; + + // a scale value by dividing the width in pixels by the + // range of actual values (not including infinite intervals) + Float rangeMin = ( colorBar.getIntervalMin(0) == Float.NEGATIVE_INFINITY ? + colorBar.getIntervalMax(0) : colorBar.getIntervalMin(0) ); + Float rangeMax = ( colorBar.getIntervalMax(intCnt-1) == Float.POSITIVE_INFINITY ? + colorBar.getIntervalMin(intCnt-1) : colorBar.getIntervalMax(intCnt-1) ); + + if( colorBar.getIntervalMin(0) == Float.NEGATIVE_INFINITY ) { + cbarPixWidth -= infIntSize; + } + if( colorBar.getIntervalMax(intCnt-1) == Float.POSITIVE_INFINITY ) { + cbarPixWidth -= infIntSize; + } + + pixPerUnit = cbarPixWidth/(rangeMax-rangeMin); + + for( int b=0 ; b + * SOFTWARE HISTORY + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * 07/2012 #431 S. Gurung Initial Creation. + * + * + * + * @author sgurung + * @version 1.0 + */ +public class EditConditionalColorbarComposite extends Composite { + + private PlotModelElement editedPlotModelElement = null; + + private Composite topComposite = null; + + public EditConditionalColorbarComposite( Composite parent, int style, PlotModelElement cf) { + super(parent, style); + editedPlotModelElement = cf; + + topComposite = this; + + GridLayout mainLayout = new GridLayout(1, true); + mainLayout.marginHeight = 1; + mainLayout.marginWidth = 1; + mainLayout.verticalSpacing = 5; + topComposite.setLayout(mainLayout); + + createControls(); + + initWidgets(); + } + + private void createControls() { + if( editedPlotModelElement == null ) { + System.out.println("PlotModelElement to Edit is not set???"); + return; + } + + Group colorBarGrp = new Group( topComposite, SWT.NONE ); + colorBarGrp.setText(" Conditional Color Bar"); + colorBarGrp.setLayout( new FormLayout() ); + + new ConditionalColorBarEditor( colorBarGrp, editedPlotModelElement.getConditionalColorBar() ); + + } + + public void initWidgets() { + + } + + public PlotModelElement getEditedPlotModelElement() { + return editedPlotModelElement; + } + + public ConditionalColorBar getEditedConditionalColorBar() { + return editedPlotModelElement.getConditionalColorBar(); + } + +} + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/EditPlotModelElementAdvancedDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/EditPlotModelElementAdvancedDialog.java new file mode 100644 index 0000000000..a67b28728d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/advanced/EditPlotModelElementAdvancedDialog.java @@ -0,0 +1,252 @@ +package gov.noaa.nws.ncep.viz.rsc.plotdata.advanced; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import gov.noaa.nws.ncep.viz.rsc.plotdata.conditionalfilter.ConditionalFilterMngr; +import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefn; +import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefns; +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModelElement; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Dialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +/** + * UI for temporarily editing advanced settings Plot Model Elements of Point Data Resources + * + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 07/2012      #431       S. Gurung   Initial Creation.
+ * 
+ * 
+ * + * @author sgurung + * @version 1.0 + */ +public class EditPlotModelElementAdvancedDialog extends Dialog { + + protected Shell shell; + protected String dlgTitle = "Edit Advanced Options"; + protected boolean ok=false; + + protected ConditionalColorBar editedColorBar = null; + protected PlotModelElement editedPlotModelElement = null; + protected String[] allParamNamesArray = null; + + private Combo paramNameCombo = null; + + public EditPlotModelElementAdvancedDialog(Shell parentShell, PlotModelElement pme, PlotParameterDefns plotParamDefns) { + super(parentShell); + dlgTitle = dlgTitle + " for " + pme.getParamName(); + editedPlotModelElement = pme; + + List plotParamNames = new ArrayList(); + for( PlotParameterDefn plotPrmDefn : plotParamDefns.getParameterDefns() ) { + if (!plotPrmDefn.getPlotMode().equalsIgnoreCase("table") && !plotPrmDefn.getPlotMode().equalsIgnoreCase("barb") && (plotPrmDefn.getPlotUnit() != null && !plotPrmDefn.getPlotUnit().isEmpty()) ) { + plotParamNames.add(plotPrmDefn.getPlotParamName()); + } + } + + allParamNamesArray = new String[plotParamNames.size()]; + for( int i=0; i + * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Jun 30, 2011 njensen Initial creation + * 09/2012 896 sgurung Refactored raytheon's class PlotDataThreadPool + * + * + * + * @author njensen + * @version 1.0 + */ + +public class NcPlotDataThreadPool { + + private static final int THREADS = 2; + + protected ConcurrentLinkedQueue> stationQueue = new ConcurrentLinkedQueue>(); + + protected List jobList = new ArrayList(); + + public NcPlotDataThreadPool(IGraphicsTarget aTarget, + IMapDescriptor mapDescriptor, PlotModel plotModel, String levelKey, + HashMap constraintMap, + ConditionalFilter condFilter, + IPlotModelGeneratorCaller caller) throws VizException { + for (int i = 0; i < THREADS; i++) { + jobList.add(new NcPlotModelDataRequestJob(aTarget, mapDescriptor, + plotModel, levelKey, plotModel.getPlugin(), constraintMap, condFilter, caller, + this)); + } + } + + /** + * Adds a batch of stations to the queue + * + * @param station + * + */ + public void queueStation(List stations) { + + Iterator itr = stations.iterator(); + while (itr.hasNext()) { + PlotInfo info = itr.next(); + boolean allQueued = true; + if (!info.plotQueued) { + allQueued = false; + info.plotQueued = true; + } + if (allQueued) { + itr.remove(); + } + } + + if (stations.size() > 0) { + stationQueue.add(stations); + int i = 0; + for (NcPlotModelDataRequestJob job : jobList) { + if (job.getState() != Job.RUNNING) { + job.schedule(); + } + i++; + } + } + } + + public void setPlotMissingData(boolean plotMissingData) { + for (NcPlotModelDataRequestJob job : jobList) { + job.setPlotMissingData(plotMissingData); + } + } + + public double getPlotModelWidth() { + return jobList.get(0).getPlotModelWidth(); + } + + public void setPlotModelSize(long round) { + for (NcPlotModelDataRequestJob job : jobList) { + job.setPlotModelSize(round); + } + } + + public void shutdown() { + stationQueue.clear(); + for (NcPlotModelDataRequestJob job : jobList) { + job.shutdown(); + } + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelDataRequestJob.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelDataRequestJob.java new file mode 100644 index 0000000000..e24cb8ed7b --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelDataRequestJob.java @@ -0,0 +1,1216 @@ +package gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels; + +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ + +import gov.noaa.nws.ncep.edex.common.metparameters.AbstractMetParameter; +import gov.noaa.nws.ncep.edex.common.metparameters.Amount; +import gov.noaa.nws.ncep.edex.common.metparameters.MetParameterFactory; +import gov.noaa.nws.ncep.edex.common.metparameters.StationElevation; +import gov.noaa.nws.ncep.edex.common.metparameters.StationID; +import gov.noaa.nws.ncep.edex.common.metparameters.StationLatitude; +import gov.noaa.nws.ncep.edex.common.metparameters.StationLongitude; +import gov.noaa.nws.ncep.edex.common.metparameters.StationNumber; +import gov.noaa.nws.ncep.edex.common.metparameters.MetParameterFactory.NotDerivableException; +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube; +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingLayer2; +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingProfile; +import gov.noaa.nws.ncep.edex.common.sounding.NcSoundingCube.QueryStatus; +import gov.noaa.nws.ncep.viz.common.soundingQuery.NcSoundingQuery2; +import gov.noaa.nws.ncep.viz.rsc.plotdata.conditionalfilter.ConditionalFilter; +import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefn; +import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefns; +import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefnsMngr; +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModel; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.measure.unit.NonSI; +import javax.measure.unit.Unit; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; + +import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; +import com.raytheon.uf.common.pointdata.ParameterDescription; +import com.raytheon.uf.common.pointdata.PointDataContainer; +import com.raytheon.uf.common.pointdata.PointDataView; +import com.raytheon.uf.common.pointdata.PointDataDescription.Type; +import com.raytheon.uf.common.serialization.adapters.UnitAdapter; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.common.time.TimeRange; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.datastructure.DataCubeContainer; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.map.IMapDescriptor; +import com.raytheon.viz.pointdata.IPlotModelGeneratorCaller; +import com.raytheon.viz.pointdata.PlotData; +import com.raytheon.viz.pointdata.PlotInfo; +import com.raytheon.viz.pointdata.PointDataRequest; + +/** + * Job separated from PlotModelGenerator2 that requests plot data and passes it + * on to the NcPlotModelGeneratorJob. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 22, 2011            njensen     Initial creation
+ * 09/2012      896        sgurung     Refactored raytheon's class PlotModelDataRequestJob and added
+ * 									   code from ncep's PlotModelGenerator2	
+ * 
+ * 
+ * + * @author njensen + * @version 1.0 + */ + +public class NcPlotModelDataRequestJob extends Job { + + private PlotModelFactory2 plotCreator; + + private Map constraintMap; + + private String plugin; + + private final String levelStr; + + private NcPlotModelGeneratorJob generatorJob; + + private NcPlotDataThreadPool parent; + + // map from the metParam name to an abstractMetParameter. The met parameter + // will have a value set either from the pointDataContainer query or derived + // from the db pointData. This map is passed to the PlotModelFactory. All the + // AbstractMetParameter are references to objects in either the dbParamsMap or + // the derivedParamsList. + // + private HashMap paramsToPlot = null; + + // a map from the dbParam name to a list of AbstractMetParameter objects used + // to hold the values from the pointDataContainer. This map is used to + // derive parameter values to be plotted. + // + private HashMap dbParamsMap = null; + + // A list of derivedParameters that need to be derived from the dbParamsMap. + // + private ArrayList derivedParamsList = null; + + // a map for those parameters that determine their value from an + // array of values from the DB. (this implements functionality previously done + // in the PlotModelFactory for the plotFunctionTable tag and now done with + // the arrayIndex tag in the plotParameterDefn) + // + private HashMap prioritySelectionsMap = null; + + // + private String latDbName = "latitude"; + private String lonDbName = "longitude"; + + private HashMap conditionalFilterMap = null; + + private HashMap allMetParamsMap = null; + + private PlotParameterDefns plotPrmDefns = null; + + private IPlotModelGeneratorCaller caller; + + private boolean applyAdvancedSettings = false; + + public class PlotImageInfo { + PlotInfo info; + + HashMap paramsToPlot; + + HashMap allMetParamsMap; + + protected PlotImageInfo(PlotInfo info, HashMap paramsToPlot, HashMap allMetParamsMap) { + this.info = info; + this.paramsToPlot = paramsToPlot; + this.allMetParamsMap = allMetParamsMap; + } + } + + public NcPlotModelDataRequestJob(IGraphicsTarget aTarget, + IMapDescriptor mapDescriptor, PlotModel plotModel, + String level, String plugin, + Map constraintMap, + ConditionalFilter condFilter, + IPlotModelGeneratorCaller caller, NcPlotDataThreadPool parent) + throws VizException { + super("Requesting Plot Data..."); + this.plugin = plugin; + this.levelStr = level; + this.constraintMap = constraintMap; + this.parent = parent; + this.caller = caller; + this.conditionalFilterMap = new HashMap(); + if (condFilter != null) + this.conditionalFilterMap = condFilter.getConditionalFilterMap(); + this.applyAdvancedSettings = plotModel.hasAdvancedSettings(); + + paramsToPlot = new HashMap(); + derivedParamsList = new ArrayList(); + dbParamsMap = new HashMap(); + prioritySelectionsMap = new HashMap(); + allMetParamsMap = new HashMap(); + + ArrayList toBeDerivedParamsList = new ArrayList(); + + // get the parameter definitions for this plugin. + // the definitions give the list of available nmap parameters as well + // as a mapping to the db param name an plot mode, units... + // + //PlotParameterDefns plotPrmDefns = + plotPrmDefns = PlotParameterDefnsMngr.getInstance().getPlotParamDefns( plotModel.getPlugin() ); + + for( PlotParameterDefn plotPrmDefn : plotPrmDefns.getParameterDefns() ) { + + // if this is a 'vector' parameter (ie windBarb or arrow) then get the 2 + // component metParameters and make sure they exist. + if( plotPrmDefn.isVectorParameter() ) { + String[] vectParamNames = plotPrmDefn.getMetParamNamesForVectorPlot(); + + if( vectParamNames == null ) { + throw new VizException("Error plotting WindBarb or Arrow: Can't get components metParameters for "+ + plotPrmDefn.getPlotParamName() ); + } + + for( String vectParam : vectParamNames ) { +// PlotParameterDefn vectPrmDefn = plotParamDefns.getPlotParamDefn( vectParam ); + +// if( vectPrmDefn == null ) { +// throw new VizException("Error plotting WindBarb or Arrow: Can't find parameter "+vectParam ); +// } +// else if( vectPrmDefn.getDbParamName().equals( "derived" ) ) { +// throw new VizException("Error plotting WindBarb or Arrow: Can't plot derived vector parameter "+vectParam ); +// } + // check that this metParam is + if( plotPrmDefns.getPlotParamDefnsForMetParam( vectParam ).isEmpty() ) { + throw new VizException("Error plotting WindBarb or Arrow : Can't find definition for component metParameter "+ + vectParam ); + } + } + } + else { // if not a vector parameter + String dbPrmName = plotPrmDefn.getDbParamName(); + String[] deriveArgs = plotPrmDefn.getDeriveParams(); + String plotPrmName = plotPrmDefn.getPlotParamName(); + + if( dbPrmName == null ) { // derived + //System.out.println("sanity check: can't find plotPrmDefn for :"+dbPrmName ); + if (deriveArgs != null && conditionalFilterMap != null && conditionalFilterMap.containsKey(plotPrmName)) + //needs to be derived so that it can be used when applying conditional filters + toBeDerivedParamsList.add(plotPrmDefn); + continue; + } + // if there is already a plot param mapped to this dbParam + else if( dbParamsMap.containsKey( dbPrmName ) ) { + continue; + } + else { //if( !dbPrmName.equals("derived" ) ) { + + // alias the db param name to the ncep param name. + // (This eliminates the need to have a direct mapping from the db name to + // the ncep param name.) + MetParameterFactory.getInstance().alias( plotPrmDefn.getMetParamName(), plotPrmDefn.getDbParamName() ); + + // create a metParam that will hold the value from the db and which will + // be used to plot the plotParameter and possibly derive other parameter values. + // + AbstractMetParameter dbParam = MetParameterFactory.getInstance(). + createParameter( plotPrmDefn.getMetParamName(), plotPrmDefn.getPlotUnit() ); + if( dbParam == null ) { + System.out.println("Error creating metParameter "+ plotPrmDefn.getMetParamName() ); + } + else { + // add this prm to a map to tell us which db params are needed + // when querying the db + dbParamsMap.put( plotPrmDefn.getDbParamName(), dbParam ); + + // for parameters that need to lookup their value from an + // array of values based on a priority. (ie for skyCover to + // determine the highest level of cloud cover at any level) + // + prioritySelectionsMap.put( dbPrmName, plotPrmDefn ); + + // else TODO : check for arrayIndex + } + } + } + } + + // if the station lat/long is not in the defns file, add them here since they + // are needed by the PlotModelFactory to plot the data + // + if( !dbParamsMap.containsKey( latDbName ) ) { + MetParameterFactory.getInstance().alias( StationLatitude.class.getSimpleName(), latDbName ); + AbstractMetParameter latPrm = MetParameterFactory.getInstance(). + createParameter( StationLatitude.class.getSimpleName(), NonSI.DEGREE_ANGLE ); + dbParamsMap.put( latDbName, latPrm ); + } + + if( !dbParamsMap.containsKey( lonDbName ) ) { + MetParameterFactory.getInstance().alias( StationLongitude.class.getSimpleName(), lonDbName ); + + AbstractMetParameter longPrm = MetParameterFactory.getInstance(). + createParameter( StationLongitude.class.getSimpleName(), NonSI.DEGREE_ANGLE ); + + dbParamsMap.put( lonDbName, longPrm ); + } + + paramsToPlot.put( StationLatitude.class.getSimpleName(), + dbParamsMap.get( latDbName ) ); + + paramsToPlot.put(StationLongitude.class.getSimpleName(), + dbParamsMap.get( lonDbName ) ); + + // loop thru the non-vector (ie center position windBarb) plotParameters in the plotModel and + // + // Once created this map will be (re)used to create each station plot. + // The parameter values will be either set or derived from the database parameters. + // + for( String pltPrmName : plotModel.getPlotParamNames( true ) ) { // don't include vector(ie windBarb) params + + // get the dbParamName and determine if derived parameter + // + PlotParameterDefn plotPrmDefn = plotPrmDefns.getPlotParamDefn( pltPrmName ); + + if( plotPrmDefn == null ) { + throw new VizException("Error creating plot metParameter "+ pltPrmName ); + } + else if( plotPrmDefn.isVectorParameter() ) { + // 'Vector' parameters for windBarbs and arrows are required to be in the center (WD) position + // Also, no plotDefns should have a plotMode of barb or arrow if not in the center position. + + // add the 2 metParameters to paramsToPlot. + String[] vectParamNames = plotPrmDefn.getMetParamNamesForVectorPlot(); + + for( String vectParam : vectParamNames ) { + // already sanity checked this... + PlotParameterDefn vectPrmDefn = plotPrmDefns.getPlotParamDefnsForMetParam( vectParam ).get(0); + addToParamsToPlot( vectPrmDefn ); + } + } + else { + addToParamsToPlot( plotPrmDefn ); + } + } + + // add the plotParams from conditional filter (that needs to be derived) to derivedParamsList + for (PlotParameterDefn plotPrmDefn: toBeDerivedParamsList) { + String[] deriveArgs = plotPrmDefn.getDeriveParams(); + addToDerivedParamsList(deriveArgs, plotPrmDefn); + } + + plotCreator = new PlotModelFactory2( mapDescriptor, plotModel, plotPrmDefns ); + this.generatorJob = new NcPlotModelGeneratorJob(plotCreator, caller, aTarget); + this.generatorJob.setSystem(false); + } + + private void addToParamsToPlot( PlotParameterDefn plotPrmDefn ) { + String dbParamName = plotPrmDefn.getDbParamName(); + String metParamName = plotPrmDefn.getMetParamName(); + String[] deriveParams = plotPrmDefn.getDeriveParams();// the input args to derive() + + // if this is a derived parameter, create a metParameter to hold the derived + // value to be computed and plotted. + // + if( deriveParams != null ) { //dbParamName.equals( "derived" ) ) { + + AbstractMetParameter derivedMetParam = addToDerivedParamsList(deriveParams, plotPrmDefn); + if (derivedMetParam == null) + return; + + paramsToPlot.put( metParamName, derivedMetParam ); + } + // if this is a dbParameter then save the metParameter from the dbParamsMap + // in the paramsToPlot map. + // + else if( dbParamName != null && + dbParamsMap.containsKey( dbParamName ) ) { + + // if it is already in the map then we don't need to save it twice. + if( !paramsToPlot.containsKey( dbParamName ) ) { + paramsToPlot.put( metParamName, + dbParamsMap.get( dbParamName ) ); + } + } + else { + System.out.println("Sanity check : dbParamName is not in dbParamsMap"); + } + } + + private AbstractMetParameter addToDerivedParamsList(String[] deriveParams, PlotParameterDefn plotPrmDefn ) { + + // if this is a derived parameter, create a metParameter to hold the derived + // value to be computed and plotted. + // + AbstractMetParameter derivedMetParam = MetParameterFactory.getInstance(). + createParameter( plotPrmDefn.getMetParamName(), plotPrmDefn.getPlotUnit() ); + + if( derivedMetParam == null ) { + System.out.println("Error creating derived metParameter "+ + plotPrmDefn.getMetParamName() ); + return null; + } + else { + // If all is set then all of the + // available metParameters from the db query are used + // when attempting to derive the parameter. + // Otherwise, we are expecting a comma separated list of parameters + // + if( //deriveParams.length > 1 && + !deriveParams[0].equalsIgnoreCase("all") ) { + + ArrayList preferedDeriveParameterNames = new ArrayList(); + ArrayList preferedDeriveParameters = new ArrayList(); + + for( String dPrm : deriveParams ) { + AbstractMetParameter deriveInputParam = + MetParameterFactory.getInstance().createParameter( dPrm ); + + if( deriveInputParam != null ) { + //MetParameterFactory.getInstance().isValidMetParameterName( dPrm ) ) { + preferedDeriveParameters.add( deriveInputParam ); + preferedDeriveParameterNames.add( dPrm ); + } + else { + System.out.println("Warning : '"+dPrm+" is not a valid metParameter name"); + return null; + } + } + + derivedMetParam.setPreferedDeriveParameters( preferedDeriveParameterNames ); + } + + if( derivedMetParam.getDeriveMethod( dbParamsMap.values() ) == null ) { + System.out.println("Unable to derive "+ derivedMetParam.getMetParamName() +" from available parameters."); + return null; + } + + if (!derivedParamsList.contains(derivedMetParam)) + derivedParamsList.add( derivedMetParam ); + + } + return derivedMetParam; + + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + + while (parent.stationQueue.size() > 0) { + List stationQuery = new ArrayList(); + + List batch = null; + synchronized (this) { + batch = parent.stationQueue.poll(); + if (batch == null) { + continue; + } + + for (PlotInfo infos : batch) { + stationQuery.add(infos); + } + } + + List stations = new ArrayList(); + + if( levelStr != null ) { + stations = requestUpperAirData(stationQuery); + } + else { + stations = requestData(stationQuery); + } + + if (stations == null) { + return Status.OK_STATUS; + } + + for (PlotImageInfo pm : stations) { + // schedule next work for other jobs + this.generatorJob.enqueue(pm); + } + } + + return Status.OK_STATUS; + } + + private List requestData(List stationQuery) { + + List toPlotImageStations = new ArrayList(); + + // key is a formatted lat/lon string + Map plotMap = new HashMap(); + Map timeMap = new HashMap(); + + List str = new ArrayList(stationQuery.size()); + + for( PlotInfo info : stationQuery ) { + str.add(info.dataURI); + plotMap.put( + formatLatLonKey(info.latitude, info.longitude ), info); + timeMap.put( info.dataURI, info.dataTime); + } + + // TODO : change to get all of the available prms for the plugin. + // OR call method on DerivedParams to determine which prms are needed to + // compute the set of params + // + List params = new ArrayList(); + + // TODO : is there a way to just tell the request to get all the parameters??? + // OR, we can determine the list of all the base parameters needed to + // compute all the derived parameters. Or we can specify the parameters needed + // to compute the derived parameter in the plotParameterDefn. + // Currently, besides likely requesting more data than is needed, this + // means that if a parameter is needed to derive another then the deriving + // parameter must also be in the PlotParamDefns (and available for display itself) + // (seems reasonable though) + for( String dbParam : dbParamsMap.keySet() ) { + params.add( dbParam ); + } + + if( !params.contains( latDbName ) ) { + params.add( latDbName ); // create MetParameter for dbParamsMap?? + } + if( !params.contains( lonDbName ) ) { + params.add( lonDbName ); + } + + Map map = new HashMap(); + setMapConstraints(map); + RequestConstraint rc = new RequestConstraint(); + rc.setConstraintType( ConstraintType.IN ); + + int index = 0; + int j = 0; + int numOfValues = 500; + PointDataContainer pdc = null; + long hdf5t001 = 0; + + while (index < str.size()) { + while (index < str.size() && j < numOfValues) { + if (j == 0) { + rc.setConstraintValue(str.get(index)); + } else { + rc.addToConstraintValueList(str.get(index)); + } + index++; + j++; + } + + map.put("dataURI", rc); + + try { + long t001 = System.currentTimeMillis(); + // Try and get data from datacube + PointDataContainer tempPdc = DataCubeContainer + .getPointData(this.plugin, params + .toArray(new String[params.size()]), + null, map); //levelKey + + if (tempPdc == null) { + // Datacube didn't have proper plugin; going directly + // to the data store + tempPdc = PointDataRequest.requestPointDataAllLevels( + null, this.plugin, + params.toArray( new String[params.size()] ), + null, map ); + } + long t002 = System.currentTimeMillis(); + + hdf5t001 = hdf5t001 + (t002-t001); + + // I think this happens when the data has been purged + // + if (tempPdc == null) { + System.out.println("PointDataRequest failed to find point data for known station ids. "+ + "Has data been purged?"); + return null; + } + + if (pdc == null) { + pdc = new PointDataContainer(); + pdc.setAllocatedSz(tempPdc.getAllocatedSz()); + pdc.setPointDataTypes(tempPdc.getPointDataTypes()); + } else { + pdc.combine(tempPdc); + } + } catch (VizException e1) { + e1.printStackTrace(); + return null; + } + + j = 0; + map.clear(); + setMapConstraints(map); + + if( pdc != null ) { + pdc.setCurrentSz(pdc.getAllocatedSz()); + } + } + //System.out.println("~~~ Total Time to get data from HDF5: " + (hdf5t001)); + + int counter = 0; + + for( int uriCounter = 0; uriCounter < pdc.getAllocatedSz(); uriCounter++ ) { + PointDataView pdv = pdc.readRandom(uriCounter); + if( pdv == null ) { // ??? + continue; + } + + // set all the paramsToPlot values to missing. (All the + // metParams in the paramsToPlot map are references into the + // derivedParamsMap and the dbParamsMap.) + // + for( AbstractMetParameter metPrm : derivedParamsList ) { + metPrm.setValueToMissing(); + metPrm.setValidTime( null ); + } + + for( String dbPrm : dbParamsMap.keySet() ) { + AbstractMetParameter metPrm = dbParamsMap.get(dbPrm); + metPrm.setValidTime( null ); + + // get the fillValue from the parameterDescription and use it to set the missingValue + // Sentinel for the metParameter + try { + ParameterDescription pDesc = pdc.getDescription(dbPrm); + if( pDesc != null ) { + if( pdv.getType( dbPrm ) == null ) { + continue; + } + if( pDesc.getFillValue() == null ) { + System.out.println("Sanity Check: ParameterDescription fill Value is null"); + System.out.println("Update the DataStoreFactory.py and H5pyDataStore.py files"); + continue; + } + switch( pdv.getType( dbPrm ) ) { + case FLOAT : + metPrm.setMissingDataSentinel( + pDesc.getFillValue().floatValue() ); + break; + case DOUBLE : + metPrm.setMissingDataSentinel( + pDesc.getFillValue() ); + break; + case INT : + metPrm.setMissingDataSentinel( + pDesc.getFillValue().intValue() ); + break; + case STRING : + break; + } + } + } catch ( Exception e ) { + System.out.println("param "+dbPrm +" not found."); + } + + metPrm.setValueToMissing(); + } + + // loop thru the dbparams from the point query + // + for( String dbParam : pdc.getParameters() ) { + + // find a metParam to hold the value for this dbParam + // + if( dbParamsMap.containsKey( dbParam ) ) { // id, lat, and longitude are not in the map. + + int dbid = pdv.getInt("id"); + DataTime dataTime = timeMap.get( dbid ); + + AbstractMetParameter metPrm = dbParamsMap.get( dbParam ); + + setMetParamFromPDV( metPrm, pdv, dbParam, dataTime ); + + allMetParamsMap.put(metPrm.getMetParamName(), metPrm); + } + } + + // loop thru the derived params, and derive the values using value in + // the dbParamsMap + // + for( AbstractMetParameter derivedParam : derivedParamsList ) { + + try { + derivedParam.derive( dbParamsMap.values() ); + allMetParamsMap.put(derivedParam.getMetParamName(), derivedParam); + + } catch( NotDerivableException e ) { + e.printStackTrace(); + } + } + + String latLonKey = formatLatLonKey( pdv.getFloat( latDbName ), + pdv.getFloat( lonDbName ) ); + PlotInfo pltInfo = plotMap.get( latLonKey ); + HashMap pltInfoParamsToPlot = null; + HashMap pltInfoAllMetParamsMap = null; + + if( pltInfo == null ) { // ??? + System.out.println("Error looking up plotInfo for map key:"+ latLonKey ); + } + else { + boolean toPlot = (conditionalFilterMap != null)? applyConditionalFilters(): true; + + if (toPlot) { + synchronized (pltInfo) { + /* if (pltInfo.pdv == null) { + pltInfo.pdv = new PlotData(); + } + pltInfo.pdv.addData(pdv);*/ + pltInfoParamsToPlot = new HashMap(); + pltInfoAllMetParamsMap = new HashMap(); + + + for (String key: paramsToPlot.keySet()) { + AbstractMetParameter origMetParam = paramsToPlot.get(key); + AbstractMetParameter metParam = MetParameterFactory.getInstance().createParameter( origMetParam.getClass().getSimpleName(), origMetParam.getUnit() ); + metParam.setDataTime(origMetParam.getDataTime()); + metParam.setMissing_data_value(origMetParam.getMissing_data_value()); + metParam.setPreferedDeriveParameters(origMetParam.getPreferedDeriveParameters()); + metParam.setUnitStr(origMetParam.getUnitStr()); + metParam.setUseStringValue(origMetParam.isUseStringValue()); + metParam.setValue(origMetParam.getValue()); + metParam.setValueString(origMetParam.getValueString()); + pltInfoParamsToPlot.put(key, metParam); + } + + if (applyAdvancedSettings) { + for (String key: allMetParamsMap.keySet()) { + AbstractMetParameter origMetParam = allMetParamsMap.get(key); + AbstractMetParameter metParam = MetParameterFactory.getInstance().createParameter( origMetParam.getClass().getSimpleName(), origMetParam.getUnit() ); + metParam.setDataTime(origMetParam.getDataTime()); + metParam.setMissing_data_value(origMetParam.getMissing_data_value()); + metParam.setPreferedDeriveParameters(origMetParam.getPreferedDeriveParameters()); + metParam.setUnitStr(origMetParam.getUnitStr()); + metParam.setUseStringValue(origMetParam.isUseStringValue()); + metParam.setValue(origMetParam.getValue()); + metParam.setValueString(origMetParam.getValueString()); + pltInfoAllMetParamsMap.put(key, metParam); + } + } + toPlotImageStations.add(new PlotImageInfo(pltInfo, pltInfoParamsToPlot, pltInfoAllMetParamsMap)); + } + } + } + + counter++; + + } + return toPlotImageStations; + } + + private List requestUpperAirData(List stationQuery) { + + List toPlotImageStations = new ArrayList(); + + long beginTime = 0; + long endTime = Long.MAX_VALUE; + Date refTime=null; + Map plotMap = new HashMap(); + + List stnIdLst = new ArrayList( stationQuery.size() ); + List rangeTimeLst = new ArrayList( stationQuery.size() ); + // get the start and end time for the query. And get a list of + // coordinates for the query. + for( PlotInfo stnInfo : stationQuery ) { + + plotMap.put(formatLatLonKey(stnInfo.latitude, stnInfo.longitude ), stnInfo ); + + refTime = stnInfo.dataTime.getRefTime(); + long stnTime = stnInfo.dataTime.getValidTime().getTimeInMillis(); + beginTime = ( beginTime < stnTime ? stnTime : beginTime ); + endTime = ( endTime > stnTime ? stnTime : endTime ); + + //chin use station id instead of lat/lon for query + String stnId = new String(stnInfo.stationId); + stnIdLst.add(stnId); + if(rangeTimeLst.contains(stnTime) == false){ + rangeTimeLst.add(stnTime); + } + } + + // TODO if this is an UpperAir FcstPlotResource then we will need to + // get the validTime and query for it. + NcSoundingQuery2 sndingQuery; + try { + sndingQuery = new NcSoundingQuery2( plugin, true, levelStr ); + } catch (Exception e1) { + System.out.println("Error creating NcSoundingQuery2: "+e1.getMessage() ); + return null; + } + //chin sndingQuery.setLatLonConstraints( latLonCoords ); + sndingQuery.setStationIdConstraints(stnIdLst); + sndingQuery.setRangeTimeList(rangeTimeLst); + sndingQuery.setRefTimeConstraint(refTime); + sndingQuery.setTimeRangeConstraint( + new TimeRange( beginTime, endTime ) ); + + // for modelsounding data we need to set the name of the model (ie the reportType) + if( plugin.equals("modelsounding") ) { + if( !constraintMap.containsKey( "reportType" ) ) { + System.out.println("Error creating NcSoundingQuery2: missing modelName (reportType) for modelsounding plugin" ); + return null; + } + sndingQuery.setModelName( + constraintMap.get("reportType" ).getConstraintValue() ); + } + long t004 = System.currentTimeMillis(); + NcSoundingCube sndingCube = sndingQuery.query(); + long t005 = System.currentTimeMillis(); + System.out.println("plotUpperAirData sndingQuery query took "+(t005-t004)+" ms"); + + // + //TODO -- This shouldn't be necessary, given Amount.getUnit() should now heal itself + // from a null unit by using the String. + // Repair the 'unit' in the met params, if damaged (as in, nulled) in transit. + //System.out.println("PlotModelGenerator2.plotUpperAirData() begin fixing returned data..."); + if( sndingCube != null && sndingCube.getRtnStatus() == QueryStatus.OK ) { + for(NcSoundingProfile sndingProfile : sndingCube.getSoundingProfileList() ) { + for(NcSoundingLayer2 sndingLayer : sndingProfile.getSoundingLyLst2()) { + for(AbstractMetParameter metPrm : sndingLayer.getMetParamsMap().values()) { + metPrm.syncUnits(); + } + } + } + } + //System.out.println("PlotModelGenerator2.plotUpperAirData() done fixing returned data"); + //TODO -- End + // + +// List sndingLayers = new ArrayList(0); + +// sndingCube = NcSoundingQuery.soundingQueryByLatLon( +// beginTime, endTime, latLonCoords, +// soundingType, DataType.ALLDATA, true, levelStr ); + + if( sndingCube != null && sndingCube.getRtnStatus() == QueryStatus.OK ) { + // Has to be just one Layer. + for(NcSoundingProfile sndingProfile : sndingCube.getSoundingProfileList() ) { + if( sndingProfile.getSoundingLyLst2().size() != 1 ) { +// System.out.println("Sanity Check : SoundingQuery return Profile with != 1 Layer " ); + if( sndingProfile.getSoundingLyLst2().isEmpty() ) { + continue; + } + } + + NcSoundingLayer2 sndingLayer = sndingProfile.getSoundingLyLst2().get(0); + +// if( sndingProfile.getStationLatitude() != -9999 || +// sndingProfile.getStationLongitude() != -9999 ) { +// System.out.println("Station latlon is "+ sndingProfile.getStationLatitude() + +// "/"+ sndingProfile.getStationLongitude() ); +// } + Map soundingParamsMap= sndingLayer.getMetParamsMap(); + + // set all the paramsToPlot values to missing. (All the + // metParams in the paramsToPlot map are references into the + // derivedParamsMap and the dbParamsMap.) + // + for( AbstractMetParameter metPrm : derivedParamsList ) { + metPrm.setValueToMissing(); + } + + // loop thru all of the db params and set the values from + // the sounding layer. + // + for( AbstractMetParameter metPrm : dbParamsMap.values() ) { + metPrm.setValueToMissing(); + + + // TODO : the station lat/lon, elev, name and id should be set in the sounding profile + // but currently isn't. So instead we will get the lat/lon and id from the DBQuery. + String key = metPrm.getMetParamName(); + + if ( soundingParamsMap.containsKey(key ) ){ + if ( metPrm.hasStringValue() ) + metPrm.setStringValue(soundingParamsMap.get(key).getStringValue() ); + else + metPrm.setValue(soundingParamsMap.get(key)); + } + else if( metPrm.getMetParamName().equals( StationLatitude.class.getSimpleName() ) ) { + metPrm.setValue( new Amount( + sndingProfile.getStationLatitude(), NonSI.DEGREE_ANGLE ) ); + } + else if( metPrm.getMetParamName().equals( StationLongitude.class.getSimpleName() ) ) { + metPrm.setValue( new Amount( + sndingProfile.getStationLongitude(), NonSI.DEGREE_ANGLE ) ); + } + else if( metPrm.getMetParamName().equals( StationElevation.class.getSimpleName() ) ) { + // metPrm.setValue( new Amount( + // sndingProfile.getStationElevation(), SI.METER ) ); + } + else if( metPrm.getMetParamName().equals( StationID.class.getSimpleName() ) ) { + if( !sndingProfile.getStationId().isEmpty() ) { + metPrm.setStringValue( sndingProfile.getStationId() ); + } + else { + metPrm.setValueToMissing(); + } + // if( stnInfo.stationId != null && !stnInfo.stationId.isEmpty() ) { + // metPrm.setStringValue( stnInfo.stationId ); + // } + } + else if( metPrm.getMetParamName().equals( StationNumber.class.getSimpleName() ) ) { + if( sndingProfile.getStationNum() != 0 ) { + metPrm.setStringValue( new Integer (sndingProfile.getStationNum()).toString() ); + } + else { + metPrm.setValueToMissing(); + } + + } + + + else{ +// System.out.println("Sanity check: " + metPrm.getMetParamName() + " is not available in the sounding data"); + } + // TODO : for modelsoundings. what are the units? +// else if( metPrm.getMetParamName().equals( VerticalVelocity.class.getSimpleName() ) ) { +// metPrm.setValue( new Amount( +// sndingLayer.getOmega(), ) ); +// } + + allMetParamsMap.put(metPrm.getMetParamName(), metPrm); + } + + // loop thru the derived params, and derive the values using value in + // the dbParamsMap + // + for( AbstractMetParameter derivedParam : derivedParamsList ) { + try { + derivedParam.derive( dbParamsMap.values() ); + allMetParamsMap.put(derivedParam.getMetParamName(), derivedParam); + + } catch( NotDerivableException e ) { + e.printStackTrace(); + } + } + + String latLonKey = formatLatLonKey( sndingProfile.getStationLatitude(), + sndingProfile.getStationLongitude() ); + PlotInfo pltInfo = plotMap.get( latLonKey ); + HashMap pltInfoParamsToPlot = null; + HashMap pltInfoAllMetParamsMap = null; + + if( pltInfo == null ) { // ??? + System.out.println("Error looking up plotInfo for map key:"+ latLonKey ); + } + else { + boolean toPlot = (conditionalFilterMap != null)? applyConditionalFilters(): true; + + if (toPlot) { + synchronized (pltInfo) { + /* if (pltInfo.pdv == null) { + pltInfo.pdv = new PlotData(); + } + pltInfo.pdv.addData(pdv);*/ + pltInfoParamsToPlot = new HashMap(); + pltInfoAllMetParamsMap = new HashMap(); + + for (String key: paramsToPlot.keySet()) { + AbstractMetParameter origMetParam = paramsToPlot.get(key); + AbstractMetParameter metParam = MetParameterFactory.getInstance().createParameter( origMetParam.getClass().getSimpleName(), origMetParam.getUnit() ); + metParam.setDataTime(origMetParam.getDataTime()); + metParam.setMissing_data_value(origMetParam.getMissing_data_value()); + metParam.setPreferedDeriveParameters(origMetParam.getPreferedDeriveParameters()); + metParam.setUnitStr(origMetParam.getUnitStr()); + metParam.setUseStringValue(origMetParam.isUseStringValue()); + metParam.setValue(origMetParam.getValue()); + metParam.setValueString(origMetParam.getValueString()); + pltInfoParamsToPlot.put(key, metParam); + } + + if (applyAdvancedSettings) { + for (String key: allMetParamsMap.keySet()) { + AbstractMetParameter origMetParam = allMetParamsMap.get(key); + AbstractMetParameter metParam = MetParameterFactory.getInstance().createParameter( origMetParam.getClass().getSimpleName(), origMetParam.getUnit() ); + metParam.setDataTime(origMetParam.getDataTime()); + metParam.setMissing_data_value(origMetParam.getMissing_data_value()); + metParam.setPreferedDeriveParameters(origMetParam.getPreferedDeriveParameters()); + metParam.setUnitStr(origMetParam.getUnitStr()); + metParam.setUseStringValue(origMetParam.isUseStringValue()); + metParam.setValue(origMetParam.getValue()); + metParam.setValueString(origMetParam.getValueString()); + pltInfoAllMetParamsMap.put(key, metParam); + } + } + toPlotImageStations.add(new PlotImageInfo(pltInfo, pltInfoParamsToPlot, pltInfoAllMetParamsMap)); + } + } + } + + } // end loop thru returned profiles + + } + + return toPlotImageStations; + } + + public int getPlotModelWidth() { + return this.plotCreator.getDefinedPlotModelWidth(); + } + + public void setPlotModelSize(long width) { + this.plotCreator.setPlotDimensions(width, width); + } + + public void setPlotMissingData(boolean b) { + this.plotCreator.setPlotMissingData(b); + } + + public void shutdown() { + this.cancel(); + this.generatorJob.shutdown(); + this.caller.clearImages(); + } + + private void setMetParamFromPDV( AbstractMetParameter metPrm, PointDataView pdv, String dbParam, DataTime dt) { + + Type pType = pdv.getType(dbParam); + + metPrm.setValidTime( dt ); + + // check that the types match. +// if( !metPrm.hasStringValue() && pType == Type.STRING || +// metPrm.hasStringValue() && pType != Type.STRING ) { +// System.out.println("The metParameter ("+metPrm.getMetParamName()+ +// ") type and db param ("+dbParam+") type don't match. String != Number"); +// metPrm.setValueToMissing(); +// return; +// } + + + // if this is an array then attempt to determine which + // value in the array to use to set the metParameter. + // + if( pdv.getDimensions( dbParam ) > 1 ) { + + PlotParameterDefn pltPrmDefn = prioritySelectionsMap.get( dbParam ); + if( pltPrmDefn == null ) { + return; // ????? + } + + // if there is a priority ranking for this parameter + // + if( pltPrmDefn.getPrioritySelector() != null ) { + + // S2N only for string lookups + if( metPrm.hasStringValue() ) { + String dbVals[] = pdv.getStringAllLevels( dbParam ); + + String rankedValue = + pltPrmDefn.getPrioritySelector().getRankedField( dbVals ); + + metPrm.setStringValue( rankedValue ); + return; + } + else { + System.out.println("Param "+dbParam+" must be a string to do a priority select from "+ + "the array of values."); + metPrm.setValueToMissing(); + return; + } + } + + // if no arrayIndex given, just get the first in the list + int arrayIndex = pltPrmDefn.getArrayIndex(); + + if( pType == Type.STRING ) { + String dbVals[] = pdv.getStringAllLevels( dbParam ); + + if( arrayIndex >= dbVals.length ) { + metPrm.setValueToMissing(); + return; + } + +// if( !dbVals[arrayIndex].isEmpty() ) { +// System.out.println( "index "+arrayIndex+ " is " + dbVals[arrayIndex] ); +// } + + if( metPrm.hasStringValue() ) { + metPrm.setStringValue( dbVals[arrayIndex] ); + } + else { // parse a number from the string + metPrm.setValueFromString( dbVals[arrayIndex].toString(), pdv.getUnit( dbParam ) ); + } + } + else { + Number dbVals[] = pdv.getNumberAllLevels( dbParam ); + + if( arrayIndex >= dbVals.length ) { + metPrm.setValueToMissing(); + return; + } + + // TODO : should we allow this? + if( metPrm.hasStringValue() ) { + metPrm.setStringValue( dbVals[arrayIndex].toString() ); + } + else { + metPrm.setValue( dbVals[arrayIndex], pdv.getUnit( dbParam ) ); + } + } + } + else { // set the metParam + + if( metPrm.hasStringValue() ) { + if( pType == Type.STRING ) { + metPrm.setStringValue( pdv.getString( dbParam ) ); + } + else { +// This could really be a sanity-check?? +// System.out.println("DB parameter "+dbParam+" of type is not compatible with "+ +// "metParameter "+metPrm.getClass().getSimpleName() ); + metPrm.setStringValue( pType.toString() ); + } + } + else { // metPrm is a number + if( pType == Type.STRING ) { + // parse a number from the string + metPrm.setValueFromString( pdv.getString( dbParam ), pdv.getUnit( dbParam ) ); + } + else { + metPrm.setValue( pdv.getNumber( dbParam ), pdv.getUnit( dbParam ) ); + } + } + } + } + + private void setMapConstraints(Map map){ + for (Entry constraint : + this.constraintMap.entrySet()) { + map.put(constraint.getKey(), constraint.getValue()); + } + } + + private String formatLatLonKey( Number lat, Number lon ) { +// Double dlat = lat.doubleValue(); +// Double dlon = lon.doubleValue(); +// + return new String( ""+Math.round(lat.doubleValue()*1000.0) + ","+ + Math.round(lon.doubleValue()*1000.0) ); + } + + public synchronized boolean applyConditionalFilters() { + if( conditionalFilterMap == null || + conditionalFilterMap.isEmpty() ) { + return true; + } + + try { + + List displayStationPlotBoolList = new ArrayList(); + + for( PlotParameterDefn plotPrmDefn : plotPrmDefns.getParameterDefns() ) { + String plotParamName = plotPrmDefn.getPlotParamName(); + String metParamName = plotPrmDefn.getMetParamName(); + + // apply filter conditions + if( conditionalFilterMap.containsKey(plotParamName) && conditionalFilterMap.get(plotParamName) != null){ + //if (conditionalFilterMap != null && conditionalFilterMap.containsKey(plotParamName) && conditionalFilterMap.get(plotParamName) != null) { + + RequestConstraint reqConstraint = conditionalFilterMap.get(plotParamName); + + AbstractMetParameter metParam = allMetParamsMap.get(metParamName); + + if (metParam == null) { + continue; + } + + if (plotPrmDefn.getPlotUnit() != null) { + Unit pltParamUnit = new UnitAdapter().unmarshal(plotPrmDefn.getPlotUnit().toString().trim()); + + // if the units are not same, convert value to desired unit + if( pltParamUnit != metParam.getUnit()) { + try { + metParam.setValue(metParam.getValueAs( pltParamUnit), pltParamUnit ); + } catch (Exception e) { + metParam.setValueToMissing(); + } + } + } + + if (reqConstraint != null) { + try { + String formattedPlotString = metParam.getFormattedString( + plotPrmDefn.getPlotFormat() ); + + int plotTrim = 0; + if( plotPrmDefn.getPlotTrim() == null ) { + plotTrim = 0; + } + else { + plotTrim = Integer.parseInt( plotPrmDefn.getPlotTrim() ); + } + + if( plotTrim != 0 ) { + formattedPlotString = formattedPlotString.substring(plotTrim ); + } + + boolean result = metParam.hasStringValue() ? reqConstraint.evaluate(formattedPlotString) : reqConstraint.evaluate(Double.parseDouble(formattedPlotString)); + if (result) { + displayStationPlotBoolList.add(true); + } else { + displayStationPlotBoolList.add(false); + } + } + catch (Exception e) { + displayStationPlotBoolList.add(false); + continue; + } + } + } + + } + + // AND the filter results + boolean displayStationPlot = true; + for (Boolean b: displayStationPlotBoolList) { + displayStationPlot = displayStationPlot && b; + } + + if (!displayStationPlot) { + return false; + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return true; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelGeneratorJob.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelGeneratorJob.java new file mode 100644 index 0000000000..3e03998e04 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/NcPlotModelGeneratorJob.java @@ -0,0 +1,130 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels; + +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.util.UUID; +import java.util.concurrent.ConcurrentLinkedQueue; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.data.prep.IODataPreparer; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.viz.pointdata.IPlotModelGeneratorCaller; +import com.raytheon.viz.pointdata.PlotInfo; + +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.NcPlotModelDataRequestJob.PlotImageInfo; +/** + * Job separated from PlotModelGenerator2 that creates the plot images. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Apr 22, 2011            njensen     Initial creation
+ * 09/2012      896        sgurung     Refactored raytheon's class PlotModelGeneratorJoband added
+ * 									   code from ncep's PlotModelGenerator2	
+ * 
+ * 
+ * + * @author njensen + * @version 1.0 + */ + +public class NcPlotModelGeneratorJob extends Job { + + private ConcurrentLinkedQueue taskQueue = new ConcurrentLinkedQueue(); + + private PlotModelFactory2 plotCreator; + + private IPlotModelGeneratorCaller caller; + + private IGraphicsTarget target; + + protected NcPlotModelGeneratorJob(PlotModelFactory2 plotCreator2, + IPlotModelGeneratorCaller caller, + IGraphicsTarget target) { + super("Creating plots..."); + this.plotCreator = plotCreator2; + this.caller = caller; + this.target = target; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime. + * IProgressMonitor) + */ + @Override + protected IStatus run(IProgressMonitor monitor) { + + long t0 = System.currentTimeMillis(); + + int i= 0 ; + while (!taskQueue.isEmpty()) { + try { + PlotImageInfo info = taskQueue.poll(); + ++i; + + BufferedImage bImage = plotCreator.getStationPlot( info.paramsToPlot, info.allMetParamsMap); + + IImage image = null; + if (bImage != null) { + image = target.initializeRaster(new IODataPreparer( + bImage, UUID.randomUUID().toString(), 0), null); + } + caller.modelGenerated(new PlotInfo[] {info.info}, image); + /* DataBuffer buff = bImage.getData().getDataBuffer(); + int bytes = buff.getSize() * DataBuffer.getDataTypeSize(buff.getDataType()) / 8; + System.out.println(" ~~~~~~~ bImage.memory usage: " + bytes);*/ + bImage.flush(); + } catch (Exception e) { + System.out.println("Error creating plot: " + e); + } + } + + System.out.println(" ~~~~~~ No. of stations: " +i +" ~~~ Time spent creating plots: "+ (System.currentTimeMillis() - t0)); + return Status.OK_STATUS; + } + + protected void enqueue(PlotImageInfo infos) { + this.taskQueue.add(infos); + if (this.getState() != Job.RUNNING) { + this.schedule(); + } + } + + protected int getQueueSize() { + return taskQueue.size(); + } + + protected void shutdown() { + cancel(); + taskQueue.clear(); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelFactory2.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelFactory2.java index a9f7ee672c..835bf88b35 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelFactory2.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/PlotModelFactory2.java @@ -31,8 +31,14 @@ import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefns; import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModel; import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModelElement; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics2D; +import java.awt.GraphicsEnvironment; +import java.awt.RenderingHints; import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -54,12 +60,15 @@ import org.apache.batik.bridge.UserAgentAdapter; import org.apache.batik.dom.svg.SAXSVGDocumentFactory; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.util.XMLResourceDescriptor; +import org.eclipse.swt.graphics.RGB; import org.geotools.referencing.GeodeticCalculator; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import com.raytheon.uf.common.serialization.adapters.UnitAdapter; +import com.raytheon.uf.viz.core.data.IRenderedImageCallback; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.map.IMapDescriptor; @@ -94,7 +103,9 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor; * 02/27/2012 #694 qzhou Fixed center symbol positions not overlap * 04/02/2012 #615 sgurung Fixed a NullPointerException bug in processTableDirective() * 05/30/2012 #654 sgurung Modified style in the constructor to construct FontFamily names that match SVG file names - * + * 10/18/2012 #431,#896sgurung Added method getStationPlot(... , ...) + * 02/26/2013 #936 asubramanian Updated getStationPlot() to use the system font files + * to render the text-based plot elements. * * * @author BRock97 @@ -102,6 +113,16 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor; */ public class PlotModelFactory2 { + private static final File COURIER_NORMAL_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "cour.pfa"); + private static final File SERIF_NORMAL_FONT =NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "VeraSe.ttf"); + private static final File SERIF_BOLD_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "l049016t.pfa"); + private static final File SERIF_ITALIC_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "l049033t.pfa"); + private static final File SERIF_BOLD_ITALIC_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "l049036t.pfa"); + + private static final File SANS_SERIF_NORMAL_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "luxisr.ttf"); + private static final File SANS_SERIF_ITALIC_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "luxisri.ttf"); + private static final File SANS_SERIF_BOLD_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "luxisb.ttf"); + private static final File SANS_SERIF_BOLD_ITALIC_FONT = NcPathManager.getInstance().getStaticFile (NcPathManager.NcPathConstants.FONT_FILES_DIR + "luxisbi.ttf"); private static final String SVG_PLOT_SYMBOL_ID = "plotData"; // name of main svg symbol element private Document document; @@ -127,6 +148,8 @@ public class PlotModelFactory2 { private final IMapDescriptor mapDescriptor; private final ArrayList plotElements; + private List listOfTextPlotElements = null; + private PlotParameterDefns plotParamDefns = null; // take this out unless we are going to use it..... // private StringBuffer sampleMessage = new StringBuffer(); @@ -175,6 +198,9 @@ public class PlotModelFactory2 { private PlotWindElement winds = null; private boolean required = false; + private String position = ""; + + public String formattedStringToPlot = ""; // mag/dir for barbs and/or arrows // private String vectorParm1=null, vectorParm2=null; @@ -194,9 +220,9 @@ public class PlotModelFactory2 { if( plotParamDefn.getPlotMode() == null ) { displayMode = DisplayMode.NULL; } - else if( plotParamDefn.getPlotMode().equals("text") ) { - displayMode = DisplayMode.TEXT; - } +// else if( plotParamDefn.getPlotMode().equals("text") ) { -T936 +// displayMode = DisplayMode.TEXT; +// } else if( plotParamDefn.getPlotMode().equals("barb") ) { displayMode = DisplayMode.BARB; @@ -275,6 +301,32 @@ public class PlotModelFactory2 { } } + //Overloaded constructor to handle only the text based plot parameters + public PlotElement(PlotParameterDefn prmDefn) { + plotParamDefn = prmDefn; + this.displayMode = DisplayMode.TEXT; + if( getUnit() == null ) { + System.out.println("Error with plotElement "+plotParamDefn.getPlotParamName()+ + " : Invalid units "+ getUnitString() ); + displayMode = DisplayMode.NULL; + } + + try { + if( plotParamDefn.getPlotTrim() == null ) { + plotTrim = 0; + } + else { + plotTrim = Integer.parseInt( plotParamDefn.getPlotTrim() ); + } + } + catch ( NumberFormatException nfex ) { + System.out.println("Error parsing trim value("+plotParamDefn.getPlotTrim()+ + ") for plotParam : " + plotParamDefn.getPlotParamName() ); + plotTrim = 0; + } + } + + public String getPlotParamName() { return plotParamDefn.getPlotParamName(); } @@ -341,6 +393,24 @@ public class PlotModelFactory2 { // String gustX = null, gustY = null; } + + class PlotImageCallback implements IRenderedImageCallback { + private HashMap paramsToPlot; + private HashMap allMetParamsMap; + + public PlotImageCallback(HashMap paramsToPlot, HashMap allMetParamsMap) { + super(); + this.paramsToPlot = paramsToPlot; + this.allMetParamsMap = allMetParamsMap; + } + + @Override + public RenderedImage getImage() throws VizException { + return getStationPlot(paramsToPlot, allMetParamsMap); + } + + } + public PlotModelFactory2( IMapDescriptor mapDescriptor, PlotModel pltMdl, PlotParameterDefns plotParamDefns) { @@ -353,6 +423,9 @@ public class PlotModelFactory2 { } this.plotElements = new ArrayList(); + listOfTextPlotElements = new ArrayList();//T936 + this.plotParamDefns = plotParamDefns; + // this.rawMessageMap = new TreeMap(); this.gc = new GeodeticCalculator(mapDescriptor.getCRS()); @@ -376,6 +449,8 @@ public class PlotModelFactory2 { null, "height")); this.plotModelWidth = this.originalPlotModelWidth; this.plotModelHeight = this.originalPlotModelHeight; +// svgRoot.setAttribute( "width","300"); +// svgRoot.setAttribute( "height","300"); Element svgPlotSymbol = document.getElementById( SVG_PLOT_SYMBOL_ID ); // NodeList nodeList2 = svgPlotSymbol.getChildNodes(); @@ -385,7 +460,7 @@ public class PlotModelFactory2 { // PlotModelElement scPme = plotModel.getSkyCoverageElement(); PlotModelElement wdPme = plotModel.getWindBarbElement(); - if( wdPme != null ) { +// if( wdPme != null ) { // if(mcPme == null ) { // Node mcNode = null; // for (int i2 = 0; i2 < nodeList2.getLength(); i2++) { @@ -407,9 +482,9 @@ public class PlotModelFactory2 { // } // } // } - } +// } // if there is no wind symbol, remove the svg group in the template used to display it. - else { + if (wdPme == null) { NodeList n = document.getElementsByTagName("g"); if( n != null && n.getLength() > 0 ) { @@ -438,6 +513,7 @@ public class PlotModelFactory2 { if( pme == null ) { // may need to put a PlotElement in here to 'blank' out the svg element. Or blank it out here... Node domNode = domElement.getChildNodes().item(0); + if(domNode != null) domNode.setNodeValue(" "); continue; } @@ -492,6 +568,20 @@ public class PlotModelFactory2 { // } // Set textSize, font, style, color ,etc. attributes // domElement = setParamAttributes( pme, domElement); + boolean isTextBasedPlotParameter = prmDefn.getPlotMode().equals("text"); + + if (isTextBasedPlotParameter ) {//T936 - add the text based plot parameters in a separate list + + PlotElement plotElement = new PlotElement(prmDefn); + plotElement.position = new String ( pme.getPosition()); + + //add the text-based plot parameters to a separate list + listOfTextPlotElements.add(plotElement); + continue; + + } + + if (pme.getConditionalParameter() == null || "".equals(pme.getConditionalParameter()) ) { String style = domElement.getAttribute("style"); String color = "RGB("+pme.getColor().getRed()+"," + @@ -502,30 +592,34 @@ public class PlotModelFactory2 { // TODO : adjust the position of symbol parameters to align them correctly - if( prmDefn.getPlotMode().equals("text" ) ) { - fontFamily = pme.getTextFont() + ("Standard".equals(pme.getTextFont())? "":pme.getTextStyle()) + "Font"; - - style = style + "stroke: "+color+";fill: "+("Standard".equals(pme.getTextFont())? "none":color) - +";font-size: "+pme.getTextSize() - +";font-family: "+fontFamily - + ";letter-spacing: 1" //(fontFamily.startsWith("Courier")? "":";letter-spacing: 1") - +";font-style: "+(pme.getTextStyle().endsWith("Italic")? "italic":"normal")+";"; - } - else if( prmDefn.getPlotMode().equals("barb" ) ) { +// if( prmDefn.getPlotMode().equals("text" ) ) { +// fontFamily = pme.getTextFont() + ("Standard".equals(pme.getTextFont())? "":pme.getTextStyle()) + "Font"; +// +// style = style + "stroke: "+color+";fill: "+("Standard".equals(pme.getTextFont())? "none":color) +// +";font-size: "+pme.getTextSize() +// +";font-family: "+fontFamily +// + ";letter-spacing: 1" //(fontFamily.startsWith("Courier")? "":";letter-spacing: 1") +// +";font-style: "+(pme.getTextStyle().endsWith("Italic")? "italic":"normal")+";"; +// +// } +// else + if( prmDefn.getPlotMode().equals("barb" ) ) { style = "fill: none; "+"stroke: "+color +";font-size:"+pme.getSymbolSize()+"em" +";stroke-width: 1px" +";font-family:"+fontFamily+";"; + } else if( prmDefn.getPlotMode().equals("table" ) ){ style = style + "fill: none; "+"stroke: "+color +";stroke-width: 1px"//+pme.getSymbolSize()+"px" +";font-size:"+pme.getSymbolSize()+"em" +";font-family:"+fontFamily+";"; + } - else { + else if( !prmDefn.getPlotMode().equals("text" ) ){ style = style + "stroke: "+color - +";stroke-width: 1px"//+pme.getSymbolSize()+"px" + +";stroke-width: 1px" +";font-size:"+pme.getSymbolSize()+"em" +";font-family:"+fontFamily+";"; System.out.println("prmDefn missing/unrecognized plotMode: " + @@ -533,7 +627,9 @@ public class PlotModelFactory2 { continue; } - domElement.setAttribute("style", style); + + domElement.setAttribute("style", style);//"stroke: "+color); + } PlotElement plotElement = new PlotElement( prmDefn, domElement ); @@ -675,11 +771,32 @@ public class PlotModelFactory2 { // else { //// System.out.println("adding "+thisElement.parameter); // } - + plotElement.position = new String(pme.getPosition());//T-936 redundant for non-text plot parameters. But added it for consistency this.plotElements.add(plotElement); } } + +// List listOfAllPlotModelElements = this.plotModel.getAllPlotModelElements(); +// +// if ( listOfAllPlotModelElements != null && !listOfAllPlotModelElements.isEmpty() ){ +// listOfTextPlotElements = new ArrayList(0); +// for ( PlotModelElement pme : listOfAllPlotModelElements ){ +// PlotParameterDefn prmDefn = plotParamDefns.getPlotParamDefn( pme.getParamName() ); +// if( prmDefn == null ) { +// System.out.println("Unable to find PlotParameterDefn for :"+pme.getParamName() ); +// continue; +// } +// String plotMode = prmDefn.getPlotMode(); +// if( plotMode.compareTo("text" ) == 0 ) { +// PlotElement plotElement = new PlotElement ( prmDefn ); +// plotElement.position = new String(pme.getPosition()); +// listOfTextPlotElements.add(plotElement); +// } +// } +// } + + UserAgentAdapter userAgentAdapter = new UserAgentAdapter(); this.bridgeContext = new BridgeContext(userAgentAdapter); this.builder = new GVTBuilder(); @@ -822,6 +939,383 @@ public class PlotModelFactory2 { return null; } + /** + * Takes a collection of metParameters and produces a buffered + * image. + */ + public synchronized BufferedImage getStationPlot( + HashMap metParams, HashMap allMetParamsMap) { + + if( !metParams.containsKey( StationLatitude.class.getSimpleName() ) || + !metParams.containsKey( StationLongitude.class.getSimpleName() ) ) { + return null; + } + AbstractMetParameter latLonPrm = metParams.get( StationLongitude.class.getSimpleName() ); + stationLoc[0] = latLonPrm.getValueAs( NonSI.DEGREE_ANGLE ).doubleValue(); + + latLonPrm = metParams.get( StationLatitude.class.getSimpleName() ); + stationLoc[1] = latLonPrm.getValueAs( NonSI.DEGREE_ANGLE ).doubleValue(); + + double[] stationPixelLoc = this.mapDescriptor.worldToPixel(stationLoc); + + if (stationPixelLoc != null) { + stationPixelLoc[1]--; + double[] newWorldLoc = this.mapDescriptor.pixelToWorld(stationPixelLoc); + + this.gc.setStartingGeographicPoint(stationLoc[0], stationLoc[1]); + + this.gc.setDestinationGeographicPoint(newWorldLoc[0], newWorldLoc[1]); + } + + try { + boolean discard = false; + for( PlotElement pltMdlElmt : this.plotElements ) { + boolean valid = true; + boolean required = pltMdlElmt.required; + + PlotParameterDefn prmDefn = pltMdlElmt.plotParamDefn; + +// if (prmDefn.getPlotMode().equals("text")) +// continue; + + String metParamName = prmDefn.getMetParamName(); + + PlotModelElement pme = plotModel.getPlotModelElement(pltMdlElmt.domElement.getAttribute("position").toUpperCase() ); + + String style = pltMdlElmt.domElement.getAttribute("style"); + String color = "RGB("+pme.getColor().getRed()+"," + + pme.getColor().getGreen()+"," + + pme.getColor().getBlue()+")"; + String fontFamily = prmDefn.getSymbolFont(); + + boolean applyAdvancedSettings = false; + String condParmValue = ""; + + if (pme.getConditionalParameter() != null && !pme.getConditionalParameter().trim().equals("")) { + applyAdvancedSettings = true; + + PlotParameterDefn condPrmDefn = plotParamDefns.getPlotParamDefn( pme.getConditionalParameter().trim() ); + condParmValue = getConditionalParameterValue(condPrmDefn, allMetParamsMap.get(condPrmDefn.getMetParamName())); + } + + switch( pltMdlElmt.getDisplayMode() ) { +// case TEXT : + case TABLE : + if( !metParams.containsKey( metParamName ) ) { + System.out.println("??sanity check: parameter "+metParamName + + " not found in displayParam map" ); + continue; + } + break; + case BARB : // case ARROW : + if( !metParams.containsKey( pltMdlElmt.getVectorParamNames()[0] ) || + !metParams.containsKey( pltMdlElmt.getVectorParamNames()[0] ) ) { + + System.out.println("??sanity check: parameter "+metParamName + + " not found in displayParam map" ); + continue; + } + } + + + if (applyAdvancedSettings) { + try { + float value = Float.parseFloat(condParmValue); + RGB rgb = pme.getConditionalColorBar().getRGBForInterval(value); + color = "RGB("+rgb.red+"," +rgb.green+"," +rgb.blue+")"; + } + catch (Exception e) { + //System.out.println(" Error while getting style settings from Advanced: " + e.getMessage() + " Error: " + e.toString()); + } + } + + + switch ( pltMdlElmt.getDisplayMode() ) { +// case TEXT: +// this.processTextDirective( +// metParams.get( pltMdlElmt.getMetParamName() ), pltMdlElmt ); +// +// fontFamily = pme.getTextFont() + ("Standard".equals(pme.getTextFont())? "":pme.getTextStyle()) + "Font"; +// style = style + "stroke: "+color+";fill: "+("Standard".equals(pme.getTextFont())? "none":color) +// +";font-size: "+pme.getTextSize() +// +";font-family: "+fontFamily +// + ";letter-spacing: 1" +// +";font-style: "+(pme.getTextStyle().endsWith("Italic")? "italic":"normal")+";"; +// +// break; + // the WindBarb parameter should be the only case for a 'barb' plotMode, + // so we will check for this here. + case BARB: + style = "fill: none; "+"stroke: "+color + +";font-size:"+pme.getSymbolSize()+"em" + +";stroke-width: 1px" + +";font-family:"+fontFamily+";"; + + valid = this.processBarbDirective( + metParams.get( pltMdlElmt.getVectorParamNames()[0] ), + metParams.get( pltMdlElmt.getVectorParamNames()[1] ), + pltMdlElmt); + break; + // case ARROW: + // this.processArrowDirective( + // metParams.get( element.plotParamName ), element); + // break; + case TABLE: + style = style + "fill: none; "+"stroke: "+color + +";stroke-width: 1px" + +";font-size:"+pme.getSymbolSize()+"em" + +";font-family:"+fontFamily+";"; + + this.processTableDirective( + metParams.get( pltMdlElmt.getMetParamName() ), pltMdlElmt); + break; + // case RANGE: + // this.processRangeDirective( + // metParams.get( element.plotParamName ), element); + // break; +// case NULL: +// style = style + "stroke: "+color +";stroke-width: 1px" +// +";font-size:"+pme.getSymbolSize()+"em" +// +";font-family:"+fontFamily+";"; +// +// pltMdlElmt.domNode.setNodeValue(" "); +// +// break; + // case SAMPLE: + // this.processSampleDirective(stationData, element); + // break; + } + + if (applyAdvancedSettings) { + pltMdlElmt.domElement.setAttribute("style", style); + } + + if (!valid && required) { + discard = true; + } + + } + + + BufferedImage bufferedImage = new BufferedImage( + this.plotModelWidth, this.plotModelHeight, + BufferedImage.TYPE_4BYTE_ABGR ); + int x = bufferedImage.getWidth() /2 ; + int y = bufferedImage.getHeight() /2; + Graphics2D g2d = bufferedImage.createGraphics(); + GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + + + //T936 - process the text-based plot parameters + if ( this.listOfTextPlotElements != null && + !this.listOfTextPlotElements.isEmpty()){ + + for ( PlotElement thisTextPlotElement : this.listOfTextPlotElements ){ + boolean valid = true; + boolean required = thisTextPlotElement.required; + String metParamName = thisTextPlotElement.getMetParamName(); + if( !metParams.containsKey( metParamName ) ) { + System.out.println("??sanity check: parameter "+metParamName + + " not found in displayParam map" ); + continue; + } + + this.processTextDirective( metParams.get( metParamName ), thisTextPlotElement ); + if (!valid && required) { + discard = true; + } + + boolean applyAdvancedSettings = false; + String condParmValue = ""; + String position = thisTextPlotElement.position.toUpperCase(); + PlotModelElement pme = plotModel.getPlotModelElement( position ); + + if (pme.getConditionalParameter() != null && !pme.getConditionalParameter().trim().equals("")) { + applyAdvancedSettings = true; + + PlotParameterDefn condPrmDefn = plotParamDefns.getPlotParamDefn( pme.getConditionalParameter().trim() ); + condParmValue = getConditionalParameterValue(condPrmDefn, allMetParamsMap.get(condPrmDefn.getMetParamName())); + } + + Color pmeColor = null; + if (applyAdvancedSettings) { + try { + float value = Float.parseFloat(condParmValue); + RGB rgb = pme.getConditionalColorBar().getRGBForInterval(value); + pmeColor = new Color(rgb.red,rgb.green,rgb.blue); + } + catch (Exception e) { + //System.out.println(" Error while getting style settings from Advanced: " + e.getMessage() + " Error: " + e.toString()); + } + } + else{//no conditional coloring + int red = pme.getColor().getRed(); + int green = pme.getColor().getGreen(); + int blue = pme.getColor().getBlue(); + pmeColor = new Color(red, green, blue); + + } + + + g2d.setColor( pmeColor ); + + String fontName = pme.getTextFont(); + + float fontSize = (float) Integer.parseInt( pme.getTextSize() ); + String pmeFontStyle = pme.getTextStyle(); + Font derivedFont = null; + Font createdFont = null; + int fontStyle = Font.PLAIN; + if ( pmeFontStyle.compareTo("Italic") == 0 ) + fontStyle = Font.ITALIC; + else if ( pmeFontStyle.compareTo("Bold") == 0) + fontStyle = Font.BOLD; + else if (pmeFontStyle.compareTo("Bold-Italic") == 0) { + fontStyle = Font.BOLD | Font.ITALIC; + } + + switch(fontStyle){ + + case ( Font.BOLD | Font.ITALIC ): + if ( fontName.compareTo("Courier") == 0 ){ + derivedFont =Font.createFont(Font.TYPE1_FONT, COURIER_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Times") == 0 ){ + derivedFont = Font.createFont(Font.TYPE1_FONT, SERIF_BOLD_ITALIC_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Helvetica") == 0 ){ + derivedFont = Font.createFont(Font.TRUETYPE_FONT, SANS_SERIF_BOLD_ITALIC_FONT).deriveFont( fontStyle, fontSize); + } + + break; + + case Font.BOLD: + + if ( fontName.compareTo("Courier") == 0 ){ + derivedFont =Font.createFont(Font.TYPE1_FONT, COURIER_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Times") == 0 ){ + derivedFont = Font.createFont(Font.TYPE1_FONT, SERIF_BOLD_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Helvetica") == 0 ){ + derivedFont = Font.createFont(Font.TRUETYPE_FONT, SANS_SERIF_BOLD_FONT).deriveFont( fontStyle, fontSize); + } + + break; + + case Font.ITALIC: + if ( fontName.compareTo("Courier") == 0 ){ + derivedFont =Font.createFont(Font.TYPE1_FONT, COURIER_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Times") == 0 ){ + derivedFont = Font.createFont(Font.TYPE1_FONT, SERIF_ITALIC_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Helvetica") == 0 ){ + derivedFont = Font.createFont(Font.TRUETYPE_FONT, SANS_SERIF_ITALIC_FONT).deriveFont( fontStyle, fontSize); + } + break; + + default: //Font.PLAIN + if ( fontName.compareTo("Courier") == 0 ){ + derivedFont = Font.createFont(Font.TYPE1_FONT, COURIER_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Times") == 0 ){ + derivedFont = Font.createFont(Font.TRUETYPE_FONT, SERIF_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + else if ( fontName.compareTo("Helvetica") == 0 ){ + derivedFont = Font.createFont(Font.TRUETYPE_FONT, SANS_SERIF_NORMAL_FONT).deriveFont( fontStyle, fontSize); + } + + break; + } + + graphicsEnvironment.registerFont(derivedFont); + g2d.setFont(derivedFont); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + FontMetrics fm = g2d.getFontMetrics(); + int colSpacing = ( derivedFont.getFontName().contains("Courier") ? fm.getMaxAdvance()*2 : fm.getMaxAdvance() ); + int rowSpacing = fm.getMaxAscent(); + + int middleX = bufferedImage.getWidth()/2; + int middleY = bufferedImage.getHeight()/2; + String strToDraw = thisTextPlotElement.formattedStringToPlot; + if(position.contains("MC")){ + x = middleX; + y = middleY; + } + else if (position.contains("ML")){ + x = middleX - colSpacing; + y = middleY; + } + else if (position.contains("MR")){ + x = middleX + colSpacing ; + y = middleY; + } + else if (position.contains("TC")){ + x = middleX ; + y = middleY - rowSpacing*2; + } + + else if (position.contains("BC")){ + x = middleX ; + y = middleY + rowSpacing*2; + } + else if (position.contains("LC")){ + x = middleX ; + y = middleY +rowSpacing; + } + + else if (position.contains("UC")){ + x = middleX ; + y = middleY - rowSpacing; + } + else if (position.contains("UR")){ + x = middleX + colSpacing; + y = middleY - rowSpacing; + } + + else if (position.contains("UL")){ + x = middleX - colSpacing; + y = middleY - rowSpacing; + } + + else if (position.contains("LR")){ + x = middleX+colSpacing; + y = middleY + rowSpacing; + } + + else if (position.contains("LL")){ + x = middleX-colSpacing; + y = middleY + rowSpacing; + } + g2d.drawString(strToDraw, x, y); + + + + } + } + + + + this.theGraphicsNode = builder.build(this.bridgeContext, + this.document).getRoot(); + this.theGraphicsNode.primitivePaint(g2d); + // Cleanup and return image + //bufferedImage.flush(); + g2d.dispose(); + + if (discard) { + return null; + } + + return bufferedImage; + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } // TODO : rm PointDataView when upper air is implemented with the VerticalSounding private void processTextDirective( @@ -829,7 +1323,8 @@ public class PlotModelFactory2 { PlotElement element) throws VizException { if( !metParam.hasValidValue() ) { - element.domNode.setNodeValue( ( plotMissingData ? "m" : "" ) ); + //element.domNode.setNodeValue( ( plotMissingData ? "m" : "" ) ); //T936 - text based plot parameters don't use the domnode now + element.formattedStringToPlot = ( plotMissingData ? "m" : "" ); } else { // change the units @@ -845,7 +1340,8 @@ public class PlotModelFactory2 { formattedPlotString = formattedPlotString.substring( element.getPlotTrim() ); } - element.domNode.setNodeValue( formattedPlotString ); +// element.domNode.setNodeValue( formattedPlotString );//T936 - text-based plot parameters no longer use the domnode + element.formattedStringToPlot = new String( formattedPlotString ); } // String sValue = null; //// String dbParam = element.dbParamName; @@ -1233,4 +1729,34 @@ public class PlotModelFactory2 { // return element; // } + private String getConditionalParameterValue(PlotParameterDefn plotPrmDefn, AbstractMetParameter metParam) throws VizException { + + String formattedPlotString = null; + + if (metParam == null) { + return null; + } + + try { + if (plotPrmDefn.getPlotUnit() != null) { + Unit pltParamUnit = new UnitAdapter().unmarshal(plotPrmDefn.getPlotUnit().toString().trim()); + + // if the units are not same, convert value to desired unit + if( pltParamUnit != metParam.getUnit()) { + try { + metParam.setValue(metParam.getValueAs( pltParamUnit), pltParamUnit ); + } catch (Exception e) { + metParam.setValueToMissing(); + } + } + formattedPlotString = metParam.getFormattedString(plotPrmDefn.getPlotFormat() ); + + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return formattedPlotString; + } + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModel.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModel.java index 7162e44526..15a0675019 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModel.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModel.java @@ -27,6 +27,8 @@ import com.raytheon.uf.common.localization.LocalizationFile; * * 08/21/11 450 G. Hull add LocalizationFile * 05/02/12 778 Q. Zhou Changed symbol size form int to double + * 10/18/2012 431 S. Gurung Added support for ConditionalParameter and ConditionalColorBar + * * * * @author mli @@ -229,10 +231,26 @@ public class PlotModel { newColor.setBlue(pme.getColor().getBlue()); newPlotModelElement.setColor( newColor ); } + if( pme.getConditionalParameter() != null ) { + newPlotModelElement.setConditionalParameter( pme.getConditionalParameter() ); + } + if( pme.getConditionalColorBar() != null ) { + newPlotModelElement.setConditionalColorBar( pme.getConditionalColorBar() ); + } plotModelElement.add( newPlotModelElement ); } lFile = pm.lFile; } + + public boolean hasAdvancedSettings() { + + for( PlotModelElement pme : plotModelElement ) { + if (pme.hasAdvancedSettings()) + return true; + } + + return false; + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModelElement.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModelElement.java index cbc248ec1b..33a8831f1a 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModelElement.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/plotModels/elements/PlotModelElement.java @@ -8,6 +8,8 @@ package gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements; +import gov.noaa.nws.ncep.viz.rsc.plotdata.advanced.ConditionalColorBar; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -27,6 +29,8 @@ import org.eclipse.swt.graphics.RGB; * 05/02/12 778 Q. Zhou Changed symbol size form int to double * 06/11/12 654 S. Gurung Changed default textSize to 14 * 08/23/12 844 S. Gurung Changed default textFont to Standard + * 10/18/2012 431 S. Gurung Added support for ConditionalParameter and ConditionalColorBar + * 02/26/2013 936 A.Subramanian Changed the font defaults to match legacy * * */ @@ -34,7 +38,9 @@ import org.eclipse.swt.graphics.RGB; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "position", - "color" + "color", + "conditionalParameter", + "conditionalColorBar" }) @XmlRootElement(name = "PlotModelElement") public class PlotModelElement { @@ -55,14 +61,20 @@ public class PlotModelElement { protected String textSize = "14"; // defaults @XmlAttribute - protected String textFont = "Standard"; + protected String textFont = "Courier"; @XmlAttribute - protected String textStyle = "Normal"; + protected String textStyle = "Bold"; @XmlAttribute protected double symbolSize = 1.0; + @XmlElement(name = "conditionalColorBar") + protected ConditionalColorBar conditionalColorBar; + + @XmlElement(name = "conditionalParameter") + protected String conditionalParameter; + // @XmlAttribute // protected Boolean enable=true; @@ -135,4 +147,49 @@ public class PlotModelElement { // public void setEnable(Boolean enable) { // this.enable = enable; // } + + public ConditionalColorBar getConditionalColorBar() { + return conditionalColorBar; + } + + public void setConditionalColorBar(ConditionalColorBar value) { + + if (value.getNumIntervals() == 0 ) { + value.addColorBarInterval(Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY, new RGB(getColor().red, getColor().green, getColor().blue)); + } + this.conditionalColorBar = value; + } + + public String getConditionalParameter() { + return conditionalParameter; + } + + public void setConditionalParameter(String value) { + this.conditionalParameter = value; + } + + public boolean hasAdvancedSettings() { + + if (this.conditionalParameter ==null || "".equals(this.conditionalParameter) || this.conditionalColorBar == null) { + return false; + } + + if (this.conditionalParameter.equals(this.paramName) && this.conditionalColorBar.getNumIntervals() == 1 + && this.conditionalColorBar.getIntervalMin(0) == Float.NEGATIVE_INFINITY + && this.conditionalColorBar.getIntervalMax(0) == Float.POSITIVE_INFINITY) { + + if (this.conditionalColorBar.getColor(0) == null) { + return false; + } + + if (this.color.getRed() == this.conditionalColorBar.getColor(0).getRed() + && this.color.getGreen() == this.conditionalColorBar.getColor(0).getGreen() + && this.color.getBlue() == this.conditionalColorBar.getColor(0).getBlue() + ) { + return false; + } + } + + return true; + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotDataAttrsDialog.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotDataAttrsDialog.java index ed7d1133dd..06ddb9dcea 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotDataAttrsDialog.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotDataAttrsDialog.java @@ -54,6 +54,7 @@ import org.eclipse.swt.widgets.Text; * 02/16/2012 #639 Q. Zhou Changed density text listener. Changed density duration to 30. Adjusted field size. * 04/02/2012 #615 S. Gurung Added code related to Conditional Filtering * 02/05/2012 #606 Greg Hull Don't get level attr for non-sounding resources + * 10/18/2012 #431 S. Gurung Enable "Edit" for conditional filter when opened from Resource Manager * 12/25/2012 #947 Greg Hull Allow pre-load conditional filter editing. * 12/29/2012 #947 Greg Hull Add unimplemented level type * diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotModelComposite.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotModelComposite.java index 3897de0d01..0bac23fea9 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotModelComposite.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/EditPlotModelComposite.java @@ -1,13 +1,19 @@ package gov.noaa.nws.ncep.viz.rsc.plotdata.rsc; import gov.noaa.nws.ncep.viz.common.ui.color.ColorMatrixSelector; +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.localization.NcPathManager.NcPathConstants; import gov.noaa.nws.ncep.viz.resources.INatlCntrsResourceData; +import gov.noaa.nws.ncep.viz.rsc.plotdata.advanced.ConditionalColorBar; +import gov.noaa.nws.ncep.viz.rsc.plotdata.advanced.EditPlotModelElementAdvancedDialog; +import gov.noaa.nws.ncep.viz.rsc.plotdata.conditionalfilter.EditConditionalFilterAttrDialog; import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefn; import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefns; import gov.noaa.nws.ncep.viz.rsc.plotdata.parameters.PlotParameterDefnsMngr; import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModel; import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.elements.PlotModelElement; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -17,13 +23,16 @@ import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; @@ -58,6 +67,8 @@ import org.eclipse.swt.widgets.Scale; * 05/29/2012 654 S. Gurung Added option "Apply to All" to apply text changes to all parameters; * Added additional options to textFontOptions and textStyleOptions; * Fixed the issue of Sky Coverage parameters not appearing in the Sky Coverage drop-down list. + * 07/24/2012 431 S. Gurung Added code for editing advanced settings + * 02/26/2013 936 Archana Removed references to the 'Standard' font. * * * @@ -77,9 +88,10 @@ public class EditPlotModelComposite extends Composite { private Combo textFontCombo = null; private Combo textStyleCombo = null; private Button applyToAllBtn = null; + private Button advancedBtn = null; - private final String[] textSizeOptions = {"6", "8", "10", "12", "14", "16", "18"}; - private final String[] textFontOptions = {"Courier", "Helvetica", "Times", "Standard"}; + private final String[] textSizeOptions = {"10", "12", "14", "16", "18","20","22","24","32"}; + private final String[] textFontOptions = {"Courier", "Helvetica", "Times"}; private final String[] textStyleOptions = {"Normal", "Italic", "Bold", "Bold-Italic"}; private final String[] plotModelElementPositions = { @@ -121,6 +133,8 @@ public class EditPlotModelComposite extends Composite { private Label skycLbl = null; private Label wndBrbLbl = null; + private File advancedIconFile = NcPathManager.getInstance().getStaticFile(NcPathConstants.ADVANCED_ICON_IMG ); ; + public EditPlotModelComposite( Composite parent, int style, PlotModel pm, INatlCntrsResourceData rscData ) { super(parent, style); editedPlotModel = pm; @@ -186,13 +200,13 @@ public class EditPlotModelComposite extends Composite { if( seldPlotModelElemButton != null ) { seldPlotModelElemButton.getPlotModelElement().setTextFont(textFontCombo.getText() ); - if ("Standard".equals(textFontCombo.getText())) { - textStyleCombo.select(0); - textStyleCombo.setEnabled(false); - } else { +// if ("Standard".equals(textFontCombo.getText())) { +// textStyleCombo.select(0); +// textStyleCombo.setEnabled(false); +// } else { +// textStyleCombo.setEnabled(true); +// } textStyleCombo.setEnabled(true); - } - if (applyToAllBtn.getSelection()) { applyTextChangesToAllParameters(); } @@ -396,12 +410,39 @@ public class EditPlotModelComposite extends Composite { // Create Bottom position button comp = new Composite(topComposite, SWT.NONE); - gl = new GridLayout(1, true); + gl = new GridLayout(3, true); gl.horizontalSpacing = 0; gl.verticalSpacing = 0; gl.marginHeight = 0; comp.setLayout(gl); + // create "Advanced..." button + advancedBtn = new Button(comp, SWT.NONE); + advancedBtn.setText("Advanced..."); + advancedBtn.setToolTipText("Edit Advanced Settings"); + gd = new GridData(); + gd.horizontalAlignment = GridData.BEGINNING; + gd.grabExcessHorizontalSpace = true; + advancedBtn.setLayoutData( gd ); + if (seldPlotModelElemButton == null) + advancedBtn.setEnabled(false); + else if (!seldPlotModelElemButton.isParamNameSelected()) + advancedBtn.setEnabled(false); + + advancedBtn.addSelectionListener(new SelectionListener() + { + public void widgetSelected(SelectionEvent event) + { + if (seldPlotModelElemButton != null) { + editAdvancedSettings(); + } + } + public void widgetDefaultSelected(SelectionEvent event) + { + } + }); + + gd = new GridData(); gd.horizontalAlignment = GridData.CENTER; gd.grabExcessHorizontalSpace = true; @@ -418,6 +459,7 @@ public class EditPlotModelComposite extends Composite { pmeBtn.init(); plotModelElementsUIMap.put( plotModelElementPositions[10], pmeBtn ); + } @@ -426,6 +468,8 @@ public class EditPlotModelComposite extends Composite { final PlotModelElemButton thisButton = this; protected Group grp = null; + protected Group advGrp = null; + protected Group parmGrp = null; protected Button parmBtn = null;; protected Button checkBtn = null; @@ -445,6 +489,15 @@ public class EditPlotModelComposite extends Composite { grp.setLayoutData( gd ); + if(advancedIconFile != null && advancedIconFile.exists() && pltMdlElmt.hasAdvancedSettings()) { + Image image = new Image(Display.getCurrent(), advancedIconFile.getAbsolutePath()); + grp.setBackgroundImage(image); + grp.setToolTipText("Advanced Settings Applied."); + } else { + grp.setBackgroundImage(null); + grp.setToolTipText(""); + } + checkBtn = new Button(grp, SWT.CHECK | SWT.SHADOW_ETCHED_OUT); checkBtn.setLayoutData(new GridData(15, 12)); @@ -520,6 +573,7 @@ public class EditPlotModelComposite extends Composite { plotModelElementsUIMap.get(pos).unselectButton(); } } + } else { // Turn the parm button OFF seldPlotModelElemButton = null; @@ -557,7 +611,6 @@ public class EditPlotModelComposite extends Composite { grp.setBackground( new Color(getParent().getDisplay(), cms.getColorValue() )); - seldPlotModelElemButton.parmBtn.setForeground( new Color(getParent().getDisplay(), rgb ) ); seldPlotModelElemButton.parmBtn.setBackground( @@ -713,6 +766,16 @@ public class EditPlotModelComposite extends Composite { wndBrbElmt.setPosition("WD"); } + if(advancedIconFile != null && advancedIconFile.exists() + && (skyCovElmt.hasAdvancedSettings() || wndBrbElmt.hasAdvancedSettings())) { + Image image = new Image(Display.getCurrent(), advancedIconFile.getAbsolutePath()); + grp.setBackgroundImage(image); + grp.setToolTipText("Advanced Settings Applied."); + } else { + grp.setBackgroundImage(null); + grp.setToolTipText(""); + } + setColor( getColor() ); // sync the color for all the elements even if not initially set } @@ -1072,6 +1135,8 @@ public class EditPlotModelComposite extends Composite { if( seldPlotModelElemButton != null && seldPlotModelElemButton.isParamNameSelected() ) { + advancedBtn.setEnabled(true); + // if( seldPlotModelElemButton.getPlotModelElement().getParamName() != null ) { prmDefn = plotParamDefns.getPlotParamDefn( seldPlotModelElemButton.getPlotModelElement().getParamName() ); @@ -1093,8 +1158,13 @@ public class EditPlotModelComposite extends Composite { isTextApplicable = false; isSymbApplicable = true; //(prmDefn != null); } + + //if (cntrBtn.getSkyCovParamName() != null && cntrBtn.getWindBarbParamName() != null) { + //advancedBtn.setEnabled(false); + //} } // } + } if( isTextApplicable ) { @@ -1127,10 +1197,10 @@ public class EditPlotModelComposite extends Composite { } } - if ("Standard".equals(textFontCombo.getText())) { - textStyleCombo.select(0); - textStyleCombo.setEnabled(false); - } +// if ("Standard".equals(textFontCombo.getText())) { +// textStyleCombo.select(0); +// textStyleCombo.setEnabled(false); +// } if (applyToAllBtn.getSelection()) { applyTextChangesToAllParameters(); @@ -1144,7 +1214,7 @@ public class EditPlotModelComposite extends Composite { textStyleCombo.deselectAll(); textStyleCombo.setEnabled(false); applyToAllBtn.setEnabled(false); - + //advancedBtn.setEnabled(false); } // Set symbol size if applicable @@ -1170,7 +1240,6 @@ public class EditPlotModelComposite extends Composite { } private void enableCenterParamWidgets( boolean enable ) { -// ctrGrp.setEnabled( enable ); skycLbl.setEnabled( enable ); comboSky.setEnabled( enable ); wndBrbLbl.setEnabled( enable ); @@ -1198,4 +1267,75 @@ public class EditPlotModelComposite extends Composite { } } } + + private void editAdvancedSettings() { + + PlotModelElement pltMdlElmt = null; + PlotModelElement skycPltMdlElmt = null; + PlotModelElement wbPltMdlElmt = null; + + if( seldPlotModelElemButton instanceof PlotModelElemCenterButton ) { + PlotModelElemCenterButton cntrBtn = (PlotModelElemCenterButton)seldPlotModelElemButton; + + skycPltMdlElmt = cntrBtn.getSkyCoveragePlotModelElement(); + wbPltMdlElmt = cntrBtn.getWindBarbPlotModelElement(); + + if (skycPltMdlElmt != null) { + pltMdlElmt = skycPltMdlElmt; + } + else if (wbPltMdlElmt != null) { + pltMdlElmt = skycPltMdlElmt; + + } else { + return; + } + } else { + pltMdlElmt = seldPlotModelElemButton.pltMdlElmt; + } + + if ( pltMdlElmt.getConditionalColorBar() == null) { + ConditionalColorBar newColorBar = new ConditionalColorBar(); + pltMdlElmt.setConditionalColorBar(newColorBar); + pltMdlElmt.setConditionalParameter(pltMdlElmt.getParamName()); + } + + String prevCondParam = pltMdlElmt.getConditionalParameter(); + ConditionalColorBar prevCondColorBar = new ConditionalColorBar(pltMdlElmt.getConditionalColorBar()); + + EditPlotModelElementAdvancedDialog editConditionalFilterDlg = new EditPlotModelElementAdvancedDialog(topComposite.getShell(), pltMdlElmt, plotParamDefns); + + PlotModelElement newPme = (PlotModelElement)editConditionalFilterDlg.open( + topComposite.getShell().getLocation().x + topComposite.getShell().getSize().x + 10, + topComposite.getShell().getLocation().y ); + + if( newPme != null) { + pltMdlElmt = newPme; + } + else { + pltMdlElmt.setConditionalParameter(prevCondParam); + pltMdlElmt.setConditionalColorBar(prevCondColorBar); + } + + if (pltMdlElmt.hasAdvancedSettings()) { + if(advancedIconFile != null && advancedIconFile.exists()) { + Image image = new Image(Display.getCurrent(), advancedIconFile.getAbsolutePath()); + seldPlotModelElemButton.grp.setBackgroundImage(image); + } + seldPlotModelElemButton.grp.setToolTipText("Advanced Settings Applied."); + } + else { + seldPlotModelElemButton.grp.setBackgroundImage(null); + seldPlotModelElemButton.grp.setToolTipText(""); + } + + + if (skycPltMdlElmt != null && wbPltMdlElmt != null) { + skycPltMdlElmt.setConditionalParameter(pltMdlElmt.getConditionalParameter()); + skycPltMdlElmt.setConditionalColorBar(pltMdlElmt.getConditionalColorBar()); + wbPltMdlElmt.setConditionalParameter(pltMdlElmt.getConditionalParameter()); + wbPltMdlElmt.setConditionalColorBar(pltMdlElmt.getConditionalColorBar()); + } + + } + } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/NcPlotResource2.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/NcPlotResource2.java new file mode 100644 index 0000000000..e38f611624 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/NcPlotResource2.java @@ -0,0 +1,1313 @@ +/***************************************************************************************** + * COPYRIGHT (c), 2006-2007, RAYTHEON COMPANY + * ALL RIGHTS RESERVED, An Unpublished Work + * + * RAYTHEON PROPRIETARY + * If the end user is not the U.S. Government or any agency thereof, use + * or disclosure of data contained in this source code file is subject to + * the proprietary restrictions set forth in the Master Rights File. + * + * U.S. GOVERNMENT PURPOSE RIGHTS NOTICE + * If the end user is the U.S. Government or any agency thereof, this source + * code is provided to the U.S. Government with Government Purpose Rights. + * Use or disclosure of data contained in this source code file is subject to + * the "Government Purpose Rights" restriction in the Master Rights File. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * Use or disclosure of data contained in this source code file is subject to + * the export restrictions set forth in the Master Rights File. + ******************************************************************************************/ + +package gov.noaa.nws.ncep.viz.rsc.plotdata.rsc; + +import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsResource; +import gov.noaa.nws.ncep.viz.resources.INatlCntrsResource; +import gov.noaa.nws.ncep.viz.resources.manager.ResourceName; +import gov.noaa.nws.ncep.viz.common.preferences.GraphicsAreaPreferences; +import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.NcPlotDataThreadPool; +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.StaticPlotInfoPV; +import gov.noaa.nws.ncep.viz.rsc.plotdata.plotModels.StaticPlotInfoPV.SPIEntry; + +import java.awt.image.DataBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.preference.IPreferenceStore; +import org.geotools.geometry.DirectPosition2D; +import org.geotools.geometry.GeneralEnvelope; +import org.opengis.geometry.DirectPosition; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; + +import com.raytheon.uf.common.dataquery.requests.RequestConstraint; +import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; +import com.raytheon.uf.common.geospatial.MapUtil; +import com.raytheon.uf.common.pointdata.vadriver.VA_Advanced; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.IExtent; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode; +import com.raytheon.uf.viz.core.IView; +import com.raytheon.uf.viz.core.PixelCoverage; +import com.raytheon.uf.viz.core.PixelExtent; +import com.raytheon.uf.viz.core.VizApp; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.map.MapDescriptor; +import com.raytheon.uf.viz.core.rsc.IResourceDataChanged; +import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.viz.pointdata.IPlotModelGeneratorCaller; +import com.raytheon.viz.pointdata.PlotAlertParser; +import com.raytheon.viz.pointdata.PlotInfo; +import com.raytheon.viz.pointdata.rsc.retrieve.PointDataPlotInfoRetriever; +import com.vividsolutions.jts.geom.Coordinate; +import gov.noaa.nws.ncep.gempak.parameters.core.marshaller.garea.GraphicsAreaCoordinates; + +import static java.lang.System.out; +/** + * Provides a resource that will display plot data for a given reference time. + * + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ *  11/20/2006             brockwoo    Initial creation.
+ *  02/17/2009             njensen     Refactored to new rsc architecture.
+ *  03/17/2009      2105   jsanchez    Plot goessounding/poessounding availability.
+ *  03/30/2009      2169   jsanchez    Updated initNewFrame.
+ *  04/09/2009       952   jsanchez    Plot acars.   
+ *  04/13/2009      2251   jsanchez    Plot profilers. 
+ *  04/21/2009             chammack    Refactor to common pointData model
+ *  04/28/2010     #275    ghull       Refactor raytheon's class to work with 
+ *                                     AbstractNatlCntrsResource
+ *  07/28/2010	   #291	   gzhang	   corrected Plot position in paintFrame()   
+ *  10/04/2010     #307    ghull       PlotInfoRscDataObj wrapper for PlotInfo            
+ *  03/07/2011     migration ghull     use AbstractDbPlotInfoRetriever; for now we are not 
+ *                                     using the resourceChanged version of getStations.
+ *  04/25/2011     n/a     bhebbard    Check for null station.distValue in run()
+ *  04/27/2001	   #361    xguo        Display parameter list
+ *  09/14/2011     #457    sgurung     Renamed H5 to nc
+ *  09/20/2011     #459    ghull       use lat,lon as map key instead of stationId since
+ *                                     the stationId is no longer uniq in all cases.
+ *  10/19/2011             ghull       remove special ncuair PlotInfoRetriever and AlertParsers.                                 
+ *  11/01/2011     #482    ghull       progressive disclosure fixes, rm mesowest/metar enabled. 
+ *  12/05/2011             sgurung     Added method isStationMapEmpty
+ *  12/07/2011     #529    bhebbard    Change "plotAll" criteria for new user "Plot All" option
+ *  12/16/2011     #529    bhebbard    Suppress (for now) pre-draw check for non-timematching
+ *                                     stations, due to undesirable "blinking" effect
+ *  02/16/2012     #555    sgurung     Changed setPopulated() to setPopulated(true) in populateFrame().
+ *  02/16/2012     #639    Q.Zhou      Changed maxDensity to 3.0(Could do 4 or 5 if needed)
+ *  04/02/2012     #615    sgurung     Use modified version of PlotModelGenerator2 constructor
+ *  05/18/2012     #809    sgurung     Use a separate PlotModelGenerator2 thread to create plots for stations
+ *  								   within a predefined Data Area (from Preferences) but outside
+ *  								   of the current display area to improve panning performance
+ *  05/23/2012     785     Q. Zhou     Added getName for legend.
+ *  08/22/2012     #809    sgurung     For bgGenerator thread, add stations to queue only when zoomLevel > 0.10
+ *  								   (this fixes the issue of slow performance when zooming all the way in, when Data Area is set)
+ *  10/18/2012     896     sgurung     Refactored PlotResource2 to use new generator class: NcPlotDataThreadPool. Added FrameLoaderJob to populate all frames.
+ *  								   Added code to plot stations within 25% of the area outside of the current display area.	
+ * 
+ * + * @author brockwoo + * @version 1.0 + */ +public class NcPlotResource2 extends AbstractNatlCntrsResource + implements IResourceDataChanged, IPlotModelGeneratorCaller, INatlCntrsResource { + + protected PlotResourceData plotRscData = null; + + // + protected class PlotInfoRscDataObj implements IRscDataObject { + private PlotInfo plotInfo; + + public PlotInfoRscDataObj( PlotInfo pltInfo ) { + plotInfo = pltInfo; + } + + @Override + public DataTime getDataTime() { + return plotInfo.dataTime; + } + + public PlotInfo getPlotInfo() { + return plotInfo; + } + } + + private class ProgDisc extends Job { + + private boolean isRunning = false; + + private boolean newData = false; + + private List lastComputed = new ArrayList(); + + public ProgDisc() { + super("progressive disclosure"); + this.setSystem(true); + } + + public void update() { + if (isRunning == false) { + VizApp.runAsync(new Runnable() { + @Override + public void run() { + schedule(); + } + }); + } else { + newData = true; + } + } + + boolean cleared = false; + + public List getLastComputed() { + if (cleared) { + lastComputed.clear(); + cleared = false; + } + return lastComputed; + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + isRunning = true; + do { + newData = false; + FrameData frameData = (FrameData) getCurrentFrame(); + + PaintProperties theseProps = new PaintProperties(lastProps); + IExtent extent = theseProps.getView().getExtent(); + PixelExtent expandedExtent = getExpandedExtent((PixelExtent)extent); + + int displayWidth = (int) (descriptor.getMapWidth() * theseProps + .getZoomLevel()); + double kmPerPixel = (displayWidth / canvasWidth) / 1000.0; + + // currently should not happen since the generator is currently determining the plotWidth and + // NatlCntrs doesn't use the magnification. + if (plotWidth != actualPlotWidth * magnification) { + plotWidth = actualPlotWidth * magnification; + generator.setPlotModelSize(Math.round(plotWidth)); + } + double displayHintSize = plotRscData.getPixelSizeHint() * magnification; + + double threshold = (displayHintSize * kmPerPixel) / density; + + boolean plotAll = ( density > MAX_DENSITY || threshold < distFloor ); + + LinkedList stationList = new LinkedList(); + LinkedList bgStationList = new LinkedList(); + List toRemove = new ArrayList(); + + for (Iterator iterator = frameData.stnLocList.iterator(); iterator.hasNext();) {//String s : frameData.stnLocList) { + Station station = frameData.stationMap.get(iterator.next()); + Coordinate location = station.pixelLocation; + + if (station.info != null) { + DirectPosition stnPos = getStationPosition(station); + + if ((dataAreaEnvelope == null || stnPos == null) && !expandedExtent.contains(new double[] { location.x,location.y })) { + continue; + } + else if (dataAreaEnvelope != null && stnPos != null && !dataAreaEnvelope.contains(stnPos) && !expandedExtent.contains(new double[] { location.x,location.y })) { + continue; + } + + // the distValues will be null for autoUpdated stations from the PlotAlertParser. + // + if( station.distValue == null ) { + //numAutoUpdateStations++; + //out.println("station.distValue = null for stn "+station.info.stationId ); + } + else if( plotAll || station.distValue >= threshold ) { + if (extent.contains(new double[] { location.x, location.y })) { + stationList.addLast(station); + } + else if (expandedExtent.contains(new double[] { location.x, location.y })) { + bgStationList.addLast(station); + } + } + } + else { // why would this be null ??? also remove from stn map? + toRemove.add(station.info.stationId); } + } + + if( !toRemove.isEmpty() ) { + //System.out.println("removing "+ toRemove.size() + " stations from list"); + } + +// frameData.stnLocList.removeAll(toRemove); +// for( String rmStn : toRemove ) { +// frameData.stationMap. +// } + +// if (runtimeProgDisc) { +// frameData.calculateProgDiscRuntime(stationList, threshold); +// } + + List imageStations = new ArrayList(); + List newStations = new ArrayList(); + + // stations within the current display area + for (Station station : stationList) { + if (station.plotImage == null) { + if (station.info.plotQueued == false) { + newStations.add(station.info); + } + } else { + imageStations.add(station); + } + } + + if (newStations.size() > 0) { + generator.queueStation(newStations); + } + + // stations within 25% of the area outside of the current display area + newStations = new ArrayList(); + for (Station station : bgStationList) { + if (station.plotImage == null) { + if (station.info.plotQueued == false) { + newStations.add(station.info); + } + } else { + imageStations.add(station); + } + } + + if (newStations.size() > 0) { + generator.queueStation(newStations); + } + + synchronized (this) { + lastComputed.clear(); + lastComputed.addAll(imageStations); + issueRefresh(); + } + } while (newData); + isRunning = false; + return Status.OK_STATUS; + } + } + + private boolean imagesArrived = false; + +// private boolean runtimeProgDisc = false; + + private ProgDisc disclosureThread = null; + + private PixelExtent worldExtent; + + private NcPlotDataThreadPool generator; + + private VA_Advanced progDisc; + + private double actualPlotWidth; + + private double plotWidth; + + private MathTransform transform = null; + + private int canvasWidth; + + private double magnification; + + private double zoomLevel; + + private double density; + static final float MAX_DENSITY = 3.0f; + + private PaintProperties lastProps; + private FrameData lastFrameData; + + private StaticPlotInfoPV spi; + + private double distFloor; + + private double screenToWorldRatio; + + private boolean needsUpdate = false; + + private MathTransform WGS84toPROJCRS = null; + + private GeneralEnvelope dataAreaEnvelope = null; + + private static final double EXPANSION_FACTOR = 0.25; + + private FrameLoaderJob frameLoader; + + protected class FrameLoaderJob extends Job { + + private boolean cancel = false; + public FrameLoaderJob(String name) { + super(name); + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + + // loop thru all of the times in the frameDataMap and populate the frames + ArrayList frameTimesInMap = new ArrayList( frameDataMap.keySet() ); + int frameTimesInMapSize = (frameTimesInMap!=null)?frameTimesInMap.size():0; + + // init backwards + for (int i = frameTimesInMapSize - 1; i > -1; i--) { + long frameTimeMs = frameTimesInMap.get(i); + + FrameData frameData = (FrameData)frameDataMap.get(frameTimeMs); + + try { + frameData.setFrameData(); + } catch (VizException e) { + System.out.println("Error retrieving frame information for time: " + frameData.getFrameTime() + ". Error: " + e); + } + + if ( cancel ) return Status.CANCEL_STATUS; + + issueRefresh(); + } + + return Status.OK_STATUS; + } + + public void loadFrameData() { + if (this.getState() != Job.RUNNING) { + this.schedule(); + } + } + + public void setCancelFlag ( boolean cl ){ + cancel = cl; + } + } + + public class Station { + public PlotInfo info; + + public IImage plotImage; + + public Double distValue; + + public Double origDistValue; + + public Coordinate pixelLocation; + + public Integer goodnessValue; + + public double[] projCoords; + } + + public class FrameData extends AbstractFrameData { + // map from the station Id to the station info (plotInfo and image) + private Map stationMap = new HashMap(); + + // list of key values in the stationMap representing the lat/lons of the Station. + private List stnLocList = new ArrayList(); + + private List plotInfoObjs = new ArrayList(); + + +// private IWireframeShape stnLocWF=null; + + private int uniqueueStations; + private int dynStations; + private boolean progDiscCalculated; + + protected FrameData( DataTime time, int interval ) { + super(time, interval); + uniqueueStations = 0; + dynStations = 0; + } + + @Override + public boolean updateFrameData( IRscDataObject rscDataObj ) { + if( !(rscDataObj instanceof PlotInfoRscDataObj) ) { // sanity check + return false; + } + + PlotInfo plotInfo = ((PlotInfoRscDataObj)rscDataObj).getPlotInfo(); + + // TODO : If the dataTime doesn't get set in the data query. + // (Don't think this should happen anymore) + if( plotInfo.dataTime == null ) { + plotInfo.dataTime = getFrameTime(); + out.println("dataTime from plotInfo is null. Setting to FrameTime"); + } + + String stnMapKey = getStationMapKey( plotInfo.latitude, + plotInfo.longitude ); + + Station stn = stationMap.get( stnMapKey );// plotInfo.stationId ); + + // This can happen during an auto update or if there are multiple reports for this frame. + // + if( stn != null ) { +// if( stn.info.latitude != plotInfo.latitude || +// stn.info.longitude != plotInfo.longitude ) { +// out.println("??Updating PlotInfo for station " + stn.info.stationId + +// " with different lat/lon???" + stn.info.latitude +"," + stn.info.longitude + "and " + +// plotInfo.latitude + "," + plotInfo.longitude ); +// } + if( stn.info == null ) { // shouldn't happen + out.println("Sanity check: Found existing Station in stationMap with a null plotInfo???"); + } + else { + //out.println(" updating station info "+stn.info.dataURI+ " with " + plotInfo.dataURI ); + + if( !stn.info.stationId.equals( plotInfo.stationId ) ) { + /*out.println("2 stations "+ stn.info.stationId +" and " + + plotInfo.stationId + " have the same location?" );*/ + } + // if these are the same time, should we check which one should be used, + // (or combine them?) How to determine which to use? + // + else if( stn.info.dataTime.getValidTime().getTimeInMillis() != + plotInfo.dataTime.getValidTime().getTimeInMillis() ) { +// out.println(" station "+ plotInfo.stationId+ " has 2 times in same frame"); +// out.println(stn.info.dataTime+ " and " + plotInfo.dataTime ); + + // determine the best time match. + if( timeMatch( plotInfo.dataTime ) < timeMatch( stn.info.dataTime ) ) { + stn.info = plotInfo; + /*out.println("Replacing Station: "+ + stn.info.stationId+ ". at "+ stn.info.dataTime.getRefTime() + + " with "+ plotInfo.dataTime.getRefTime() );*/ + + if( stn.plotImage != null ) { + //out.println( " Replacing image "); + stn.plotImage.dispose(); + stn.plotImage = null; + } + } + } + } + + } else { + stn = new Station(); + + if( plotInfo.stationId == null ) { + plotInfo.stationId = plotInfo.latitude + "#" + plotInfo.longitude; + } + stn.info = plotInfo; + + calcStaticStationInfo( stn ); + } + + return true; + } + + + protected void setFrameData() throws VizException { +// RequestConstraint time = new RequestConstraint(); +// String[] constraintList = { startTime.toString(), endTime.toString() }; +// time.setBetweenValueList(constraintList); +// time.setConstraintType(RequestConstraint.ConstraintType.BETWEEN); +// +// HashMap metadataMap = new HashMap( +// plotRscData.getMetadataMap() ); +// metadataMap.put("dataTime", time); +// long t0 = System.currentTimeMillis(); +// +// plotInfoObjs = plotRscData.getPlotInfoRetriever().getStations( +// metadataMap); +// +// long t1 = System.currentTimeMillis(); +// out.println("InitFrame Took: " + (t1 - t0) + " To find "+ +// plotInfoObjs.size() + " Stations ( entries in metadata DB.)" ); + HashMap metadataMap = + new HashMap( + plotRscData.getMetadataMap() ); + RequestConstraint timeConstraint = new RequestConstraint(); + + ResourceName rscName = getResourceData().getResourceName(); + boolean isFcst = plotRscData.isForecastResource() && + !plotRscData.getPluginName().equals("nctaf"); + + // set the constraints for the query. + // for forecast resources we need to match the cycle time and + // create a range constraint on the forecast hour. + if( isFcst ) { + String[] dts = rscName.getCycleTime().toString().split(" "); + String cycleTimeStr = dts[0] + " " + dts[1].substring(0, dts[1].length()-2); + System.out.println("reftime constraint is:"+cycleTimeStr ); + + timeConstraint = new RequestConstraint( cycleTimeStr ); + metadataMap.put("dataTime.refTime", timeConstraint ); + + // determine the fcst hr range for the frame span + long refTimeMs = rscName.getCycleTime().getRefTime().getTime(); + long frmStartMs = getFrameStartTime().getRefTime().getTime(); + long frmEndMs = getFrameEndTime().getRefTime().getTime(); + + long beginFcstHr = (frmStartMs - refTimeMs) / 1000; + long endFcstHr = (frmEndMs - refTimeMs) / 1000; + + timeConstraint = new RequestConstraint( ); + timeConstraint.setBetweenValueList( + new String[] { Long.toString( beginFcstHr ), + Long.toString( endFcstHr ) } ); + + timeConstraint.setConstraintType( ConstraintType.BETWEEN ); + metadataMap.put( "dataTime.fcstTime", timeConstraint ); + } + else { + String[] constraintList = { startTime.toString(), endTime.toString() }; + timeConstraint.setBetweenValueList( constraintList ); + timeConstraint.setConstraintType( RequestConstraint.ConstraintType.BETWEEN ); + + metadataMap.put("dataTime", timeConstraint ); + } + + long t0 = System.currentTimeMillis(); + + plotInfoObjs = plotRscData.getPlotInfoRetriever().getStations( + metadataMap); + + long t1 = System.currentTimeMillis(); + out.println("InitFrame Took: " + (t1 - t0) + " To find "+ + plotInfoObjs.size() + " Stations ( entries in metadata DB.)" ); + + } + + // if we are painting a frame which has not yet been loaded with data then we + // need to request data for this frame and then + // update the frames with + protected boolean populateFrame() throws VizException { + + dynStations = 0; + uniqueueStations = 0; + +// HashMap metadataMap = +// new HashMap( +// plotRscData.getMetadataMap() ); +// +// RequestConstraint timeConstraint = new RequestConstraint(); +// +// ResourceName rscName = getResourceData().getResourceName(); +// boolean isFcst = plotRscData.isForecastResource() && +// !plotRscData.getPluginName().equals("nctaf"); +// +// // set the constraints for the query. +// // for forecast resources we need to match the cycle time and +// // create a range constraint on the forecast hour. +// if( isFcst ) { +// String[] dts = rscName.getCycleTime().toString().split(" "); +// String cycleTimeStr = dts[0] + " " + dts[1].substring(0, dts[1].length()-2); +// System.out.println("reftime constraint is:"+cycleTimeStr ); +// +// timeConstraint = new RequestConstraint( cycleTimeStr ); +// metadataMap.put("dataTime.refTime", timeConstraint ); +// +// // determine the fcst hr range for the frame span +// long refTimeMs = rscName.getCycleTime().getRefTime().getTime(); +// long frmStartMs = getFrameStartTime().getRefTime().getTime(); +// long frmEndMs = getFrameEndTime().getRefTime().getTime(); +// +// long beginFcstHr = (frmStartMs - refTimeMs) / 1000; +// long endFcstHr = (frmEndMs - refTimeMs) / 1000; +// +// timeConstraint = new RequestConstraint( ); +// timeConstraint.setBetweenValueList( +// new String[] { Long.toString( beginFcstHr ), +// Long.toString( endFcstHr ) } ); +// +// timeConstraint.setConstraintType( ConstraintType.BETWEEN ); +// metadataMap.put( "dataTime.fcstTime", timeConstraint ); +// } +// else { +// String[] constraintList = { startTime.toString(), endTime.toString() }; +// timeConstraint.setBetweenValueList( constraintList ); +// timeConstraint.setConstraintType( RequestConstraint.ConstraintType.BETWEEN ); +// +// metadataMap.put("dataTime", timeConstraint ); +// } +// +// long t0 = System.currentTimeMillis(); +// +// List plotInfoObjs = plotRscData.getPlotInfoRetriever().getStations( +// metadataMap); +// +// long t1 = System.currentTimeMillis(); +// out.println("InitFrame Took: " + (t1 - t0) + " To find "+ +// plotInfoObjs.size() + " Stations ( entries in metadata DB.)" ); + if ( plotInfoObjs == null || plotInfoObjs.isEmpty() ) + setFrameData(); + + for( PlotInfo pltInfo : plotInfoObjs ) { + + // have to add this since the dataTime is not always getting set by the + // plotInfoRetriever? + if( pltInfo.dataTime == null ) { + if( plotRscData.isSurfaceOnly() ) { + pltInfo.dataTime = getFrameTime(); + } + else { // upper air data uses the NcSoundingQuery which needs a start and stop time for + // the query which needs to be correct. + out.println("Error getting dataTime from Plot Query"); + } + } + + for( IRscDataObject rscDataObj : processRecord( pltInfo )) { + // sanity check: this should always be true since we constrained the + // query with the start/end frame times. + if( isRscDataObjInFrame( rscDataObj ) ) { + updateFrameData( rscDataObj ); + } + else { + // if we don't change the plotInfoRetriever to set the dataTime, then this + // really is a serious sanity check..... + // This happens when the dataTime is the same as the startTime. This satisfies the query constraint + // the not the time matching. + if( plotRscData.isForecastResource() ) { + out.println("plotInfo obj doesn't time match to the frame which queried it???"); + } + // else this is possible when the time is equal to one of the start/end times + } + } + } + +// out.println( "Number of dynamic stations is " + dynStations ); +// out.println( "Number of uniq stations is " + stationMap.size() ); + + if( stnLocList.size() != stationMap.keySet().size() ) { + out.println("Sanity check: station lists out of sync???"); + } + + calculateProgDisc(); + + setPopulated( true ); + + return true; + } + + // + private boolean calcStaticStationInfo(Station station ) { + SPIEntry obsStation = null; + Coordinate thisLocation = null; + Coordinate thisPixelLocation = null; + if (spi != null) { + obsStation = spi.getSPIEntry(station.info.stationId); + } + if (obsStation != null) { + thisLocation = obsStation.latlon; + double[] thisLocationLatLon = { thisLocation.x, thisLocation.y }; + double[] thisLocationPixel = descriptor + .worldToPixel(thisLocationLatLon); + if (!worldExtent.contains(thisLocationPixel[0], + thisLocationPixel[1])) { + return false; + } + thisPixelLocation = new Coordinate(thisLocationPixel[0], + thisLocationPixel[1]); + if (obsStation.distance < distFloor) { + station.origDistValue = distFloor; // minDist; + } else { + station.origDistValue = obsStation.distance; + } + } + else { + thisLocation = new Coordinate(station.info.longitude, + station.info.latitude); + double[] thisLocationLatLon = { thisLocation.x, thisLocation.y }; + double[] thisLocationPixel = descriptor + .worldToPixel(thisLocationLatLon); + if (thisLocationPixel == null + || !worldExtent.contains(thisLocationPixel[0], + thisLocationPixel[1])) { + return false; + } + thisPixelLocation = new Coordinate(thisLocationPixel[0], + thisLocationPixel[1]); + station.origDistValue = -1.0; + dynStations++; + } + + station.goodnessValue = 0; + station.pixelLocation = thisPixelLocation; + + String stnMapKey = getStationMapKey( station.info.latitude, + station.info.longitude ); + + if( stationMap.put( stnMapKey, station) == null ) { + stnLocList.add( stnMapKey ); + uniqueueStations++; + } + else { + out.println("Updating StationMap with " +stnMapKey ); + } + return true; + } + + // if it turns out that we need this, see raytheon's new DynamicProgDisclosure class + +// private void calculateProgDiscRuntime(List stations, double threshold) { +// +// double kmPerPixel = threshold * density +// / (plotRscData.getPixelSizeHint() * magnification); +// +// // get meters per pixel +// double mPerPixel = kmPerPixel * 1000; +// double pixelDist = mPerPixel * plotRscData.getPixelSizeHint() / 2; +// +// pixelDist /= density; +// +// List toUse = new ArrayList(); +// for (Station a : stations) { +// +// boolean use = true; +// +// if( a.projCoords == null || +// a.projCoords.length < 3 ) { +// continue; +// } +// +// for (Station b : toUse) { +// // Make sure a does not overlap with b +// +// double deltaX = a.projCoords[0] - b.projCoords[0]; +// double deltaY = a.projCoords[1] - b.projCoords[1]; +// // Absolute value logic inlined for performance +// deltaX = (deltaX <= 0.0D) ? 0.0D - deltaX : deltaX; +// deltaY = (deltaY <= 0.0D) ? 0.0D - deltaY : deltaY; +// +// if (deltaX < pixelDist && deltaY < pixelDist) { +// use = false; +// break; +// } +// } +// +// if (use) { +// toUse.add(a); +// } +// } +// +// stations.clear(); +// stations.addAll(toUse); +// } + + // set the distValues in the stationMap. + // called from populateFrame. + // TODO what about stations that come in through auto update? + protected void calculateProgDisc() { + if( stnLocList.isEmpty() ) { + return; + } + + int size = stnLocList.size(); + Coordinate[] latLonArray = new Coordinate[size]; + Integer[] goodnessArray = new Integer[size]; + Double[] distArray = new Double[size]; + int i = 0; + for (String s : stnLocList ) { + Station station = stationMap.get(s); + latLonArray[i] = new Coordinate( + station.info.longitude, station.info.latitude); + goodnessArray[i] = station.goodnessValue; + distArray[i] = station.origDistValue; + + ++i; + } + progDisc.setVaJustGoodness(false); + progDisc.setVaDistPass( dynStations * dynStations / size < 3000.0 ); + progDisc.getVaAdvanced( latLonArray, goodnessArray, distArray ); + + for (i = 0; i < size; ++i) { + stationMap.get( stnLocList.get(i) ).distValue = distArray[i]; + } + + setProgDiscCalculated(true); + +// if it turns out that we need this, see raytheon's new DynamicProgDisclosure class +// } else { +// if (stnLocList.size() == 0) { +// return; +// } +// for (Station s : stationMap.values()) { +// s.distValue = -1.0; +// if (s.projCoords == null) { +// double[] in = new double[] { s.info.longitude, s.info.latitude, 0 }; +// double[] out = new double[3]; +// +// try { +// transform.transform(in, 0, out, 0, 1); +// } catch (TransformException e) { +// e.printStackTrace(); +// } +// s.projCoords = out; +// } +// } +// +// runtimeProgDisc = true; +// } +// computeProgDisc = false; + } + + public void modelGenerated(PlotInfo key, IImage image) { + String stnMapKey = getStationMapKey(key.latitude, key.longitude); + Station stn = stationMap.get( stnMapKey ); + if( image == null || stn == null ) { + return; + } + + // I think this might happen if a prog disclosure is run twice before + // the image is generated + if( stn.plotImage != null ) { + /*out.println("modelGenerated image for existing Station?"+ + key.stationId );*/ + stn.plotImage.dispose(); + stn.plotImage = null; + } + stn.plotImage = image; + } + + public void dispose() { + super.dispose(); + + for (String stnLoc : stnLocList ) { + Station s = stationMap.get( stnLoc ); + if (s != null && s.plotImage != null) { + s.plotImage.dispose(); + s.plotImage = null; + } + stationMap.remove( stnLoc ); + } + stationMap.clear(); + stnLocList.clear(); + populated = false; + + dynStations = 0; + uniqueueStations = 0; + } + + public boolean isStationMapEmpty() { + if (stationMap.isEmpty()) + return true; + else + return false; + } + + public boolean isProgDiscCalculated() { + return progDiscCalculated; + } + + public void setProgDiscCalculated(boolean p) { + progDiscCalculated = p; + } + } + + /** + * Create a surface plot resource. + * + * @param target + * The graphic target to draw to + * @param refTime + * The reference time to request data against + * @throws VizException + */ + public NcPlotResource2(PlotResourceData data, LoadProperties props) { + super(data, props); + plotRscData = (PlotResourceData) resourceData; + + // The object which is called by the NcAutoUpdater to get a PlotInfo + // object from the alert uri. + if( data.getAlertParser() == null ) { + data.setAlertParser( new PlotAlertParser() ); + } + + if( data.getPlotInfoRetriever() == null ) { + data.setPlotInfoRetriever( + new PointDataPlotInfoRetriever()); + } + + this.dataTimes = new ArrayList(); + this.progDisc = new VA_Advanced(); + +// data.addChangeListener(this); + + // allow for no SPI file to be given + if (plotRscData.getSpiFile() != null && !plotRscData.getSpiFile().isEmpty() ) { + this.spi = StaticPlotInfoPV.readStaticPlotInfoPV(plotRscData + .getSpiFile()); + } + } + + @Override + public String getName() { + String legendString = super.getName(); + FrameData fd = (FrameData) getCurrentFrame(); + + if (fd == null || fd.getFrameTime() == null || fd.isStationMapEmpty()) { + return legendString + "-No Data"; + } + + if (legendString == null || legendString.equalsIgnoreCase("")) { + return "Plot Data"; + } + else { + return legendString + " "+ NmapCommon.getTimeStringFromDataTime( fd.getFrameTime(), "/"); + } + } + + + // override to process PlotInfoRscDataObj instead of PlotInfo + @Override + protected IRscDataObject[] processRecord( Object pltInfo ) { + if( !(pltInfo instanceof PlotInfo) ) { + out.println( "NcPlotResource22.processRecord method expecting PlotInfoRscData objects "+ + "instead of: " + pltInfo.getClass().getName() ); + return new PlotInfoRscDataObj[0]; + } + + return new PlotInfoRscDataObj[]{ new PlotInfoRscDataObj( (PlotInfo)pltInfo ) }; + } + + protected void populateFrame( FrameData frameData ) throws VizException { + if( !frameData.isPopulated() ) { + frameData.populateFrame(); + } + } + + public void paintFrame( AbstractFrameData fd, + IGraphicsTarget aTarget, PaintProperties paintProps ) + throws VizException { + + if( needsUpdate ) { + needsUpdate = false; + initResource(aTarget); + } + + if (disclosureThread == null) { + disclosureThread = new ProgDisc(); + disclosureThread.update(); + } + + // if zooming out, clear the stations to avoid the flickr + // + if( paintProps.isZooming() ) { + //out.println("Zooming"); + return; + } + + FrameData frameData = (FrameData) fd; + populateFrame( frameData ); + + boolean update = false; + + if( lastProps == null || frameData != lastFrameData || + imagesArrived || lastProps.getView().getExtent().equals( + paintProps.getView().getExtent()) == false ) { + update = true; + } +// a wireframe to show locations of stations with available data that arent plotted +// if( frameData.stnLocWF == null ) { +// frameData.stnLocWF = aTarget.createWireframeShape( true, this.descriptor ); +// } + + + lastProps = new PaintProperties(paintProps, (IView) paintProps.getView().clone()); + lastFrameData = frameData; + canvasWidth = paintProps.getCanvasBounds().width; + + List stationList = null; + + if (disclosureThread == null) { + disclosureThread = new ProgDisc(); + disclosureThread.update(); + } else if (update) { + disclosureThread.update(); + imagesArrived = false; + } + synchronized (disclosureThread) { + stationList = new LinkedList(disclosureThread + .getLastComputed()); + } + + this.screenToWorldRatio = paintProps.getCanvasBounds().width + / paintProps.getView().getExtent().getWidth(); + double scaleValue = this.plotWidth / screenToWorldRatio; + + for (Station station : stationList) { + + if (station.plotImage == null) { + imagesArrived = true; + continue; + } + // this happens briefly when a frame is changed and + // the progressive disclosure hasn't finished +// ...but unfortunately that happens on first paint after *every* frame +// change (...disclosureThread.update() above causes a schedule() of the +// ProgDisc job, but it won't run until after triggering paint is finished...), +// resulting in blanking of the display. Subsequent paint of same frame +// (after ProgDisc.run() completes) will show correct data for the frame, +// bug this can lag -- esp. with high station density -- due to long times +// to execute all those drawRaster's (or even newer drawRasters for whole +// array of images). This results in "blinking", which gets worse (longer +// 'dark' time) as number of stations increases. For now, we conclude it's +// better to eliminate the "blinking" (Task#529), and so comment out this +// check -- the downside being that there will be a momentary mismatch +// between the indicated frame time on the status bar (which changes very +// quickly when frame change is initiated) and the displayed data (which +// will still be for the previous frame). Still, this is a more generic +// problem which also affects other resources with slow draw times, so a +// more general solution is needed. (Apologies for long essay; feel free +// to remove once decision is firmed up on this...) +// +// if( frameData.timeMatch( station.info.dataTime ) == -1) { +// out.println("********non timematching station being plotted????!!!!!"); +// } +// else { + PixelCoverage pc = new PixelCoverage( station.pixelLocation, scaleValue, scaleValue ); + aTarget.drawRaster(station.plotImage, pc, paintProps, RasterMode.SYNCHRONOUS); +// } + } + + } + + + public void initResource( IGraphicsTarget aTarget ) throws VizException { + + // we may want to implement this as an attribute + magnification = 1.0;//paintProps.getMagnification(); + + density = plotRscData.getPlotDensity() / 10.0; + + dataAreaEnvelope = getDataAreaEnvelope(); + + if( generator != null ) { + generator.shutdown(); + } + + // generator for creating plots + generator = new NcPlotDataThreadPool(aTarget, descriptor, + plotRscData.getPlotModel(), + (plotRscData.isSurfaceOnly() ? null : plotRscData.getLevelKey() ), + plotRscData.getMetadataMap(), plotRscData.getConditionalFilter(), this); + this.generator.setPlotMissingData(plotRscData.isPlotMissingData() ); + + this.actualPlotWidth = this.plotWidth = generator.getPlotModelWidth(); + + this.distFloor = ( descriptor.getMapWidth() / 1000.0) + * plotRscData.getPixelSizeHint() / 32000.0; + // not sure where this calculation comes from but the above value yield + distFloor /= 3; // + + this.worldExtent = new PixelExtent(0, descriptor.getGridGeometry() + .getGridRange().getHigh(0), 0, descriptor.getGridGeometry() + .getGridRange().getHigh(1)); + + try { + transform = MapUtil.getTransformFromLatLon(descriptor.getCRS()); + } catch (FactoryException e) { + throw new VizException("Error retrieving MathTransform", e); + } + + // Most resources call queryRecords() here to populate the frames + // but since this query may take a while whe postpone until a frame is + // painted and then populate just that frame. + + // load/populate all the frames in the frameDataMap + frameLoader = new FrameLoaderJob("Loading frames..."); + if (!plotRscData.isForecastResource()) + frameLoader.loadFrameData(); + } + + @Override + public void disposeInternal() { + if( generator != null ) { + generator.shutdown(); + } + if ( frameLoader != null ) { + frameLoader.setCancelFlag(true); + frameLoader.cancel(); + } + initialized = false; + disclosureThread.cancel(); + clearImages(); + frameDataMap.clear(); + } + + protected AbstractFrameData createNewFrame( DataTime frameTime, int timeInt ) { + FrameData newFrame = new FrameData( frameTime, timeInt ); + return newFrame; + } + + @Override + public void clearImages() { + if (disclosureThread != null) { + disclosureThread.cleared = true; + } + + for( AbstractFrameData frameData : frameDataMap.values() ) { + for( Station station : ((FrameData)frameData).stationMap.values()) { + if (station.plotImage != null) { + station.plotImage.dispose(); + station.plotImage = null; + } + + if (station.info != null) { + station.info.plotQueued = false; + } + } + } + + imagesArrived = true; + } + + @Override + public void modelGenerated(PlotInfo[] keys, IImage image) { + for ( PlotInfo key : keys ) { + for( AbstractFrameData frameData : frameDataMap.values() ) { + if( frameData.isRscDataObjInFrame( new PlotInfoRscDataObj( key ) ) ) { + ((FrameData)frameData).modelGenerated(key, image); + } + } + } + imagesArrived = true; + issueRefresh(); + } + + @Override + public void project(CoordinateReferenceSystem crs) throws VizException { + // TODO : we shouldn't have to requery everything but this is the + // easiest thing to do for now... + clearFrames(); + clearImages(); + + this.distFloor = (descriptor.getMapWidth() / 1000.0) + * this.plotRscData.getPixelSizeHint() / 32000.0; + this.worldExtent = new PixelExtent(0, descriptor.getGridGeometry() + .getGridRange().getHigh(0), 0, descriptor.getGridGeometry() + .getGridRange().getHigh(1)); + try { + transform = MapUtil.getTransformFromLatLon(descriptor.getCRS()); + } catch (FactoryException e) { + throw new VizException("Error retrieving MathTransform", e); + } + } + + @Override + public void resourceAttrsModified() { + // Repaint the data + needsUpdate = true; + issueRefresh(); + } + + // + @Override + public void resourceChanged(ChangeType type, Object object) { + // TODO Raytheon's NcPlotResource2 is implementing this and calling + // different version of getStations to call resourceChanged.... + } + + @Override + public void messageGenerated(String dataURI, String message) { + } + + // generate a string used as the key for the StationMap + // + private String getStationMapKey( Double lat, Double lon ) { + return new String( ""+Math.round(lat*1000.0) + ","+ + Math.round(lon*1000.0) ); + + } + + private DirectPosition getStationPosition(Station station) { + try { + if (WGS84toPROJCRS != null && station != null) { + DirectPosition stnPos = WGS84toPROJCRS.transform(new DirectPosition2D(station.info.longitude, station.info.latitude), null); + return stnPos; + } + + } catch (Exception e) { + out.println("Error while getting station position: " + e.getMessage()); + } + + return null; + } + + /* + * Gets the data area (from File -> Preferences) in the form of latitudes and longitudes + * and returns a GeneralEnvelope based on it + */ + private GeneralEnvelope getDataAreaEnvelope () { + + //expression + String expr = "((-|\\+)?[0-9]+(\\.[0-9]+)?)+"; + + IPreferenceStore prefs = NmapCommon.getNcepPreferenceStore(); + String llLat = prefs.getString(GraphicsAreaPreferences.LLLAT); + String llLon = prefs.getString(GraphicsAreaPreferences.LLLON); + String urLat = prefs.getString(GraphicsAreaPreferences.URLAT); + String urLon = prefs.getString(GraphicsAreaPreferences.URLON); + + if ( llLat == null || llLon == null || urLat == null || urLon == null ) + return null; + + if ( llLat == "" || llLon == "" || urLat == "" || urLon == "" ) + return null; + + String garea = llLat+";"+llLon+";"+urLat+";"+urLon; + + if ( !llLat.matches(expr) || !llLon.matches(expr) || + !urLat.matches(expr) || !urLon.matches(expr)) return null; + + GraphicsAreaCoordinates gareaCoordObj = new GraphicsAreaCoordinates( garea ); + if ( ! gareaCoordObj.parseGraphicsAreaString(garea)) + return null; + + try { + + WGS84toPROJCRS = MapUtil.getTransformFromLatLon(MapUtil.LATLON_PROJECTION); + + GeneralEnvelope dataAreaEnvelope = new GeneralEnvelope(2); + + DirectPosition ll = WGS84toPROJCRS.transform(new DirectPosition2D( + Double.parseDouble(llLon), Double.parseDouble(llLat)), null); + + DirectPosition ur = WGS84toPROJCRS.transform(new DirectPosition2D( + Double.parseDouble(urLon), Double.parseDouble(urLat)), null); + + dataAreaEnvelope.setRange(0, + Math.min(ll.getOrdinate(0), ur.getOrdinate(0)), + Math.max(ll.getOrdinate(0), ur.getOrdinate(0))); + dataAreaEnvelope.setRange(1, + Math.min(ll.getOrdinate(1), ur.getOrdinate(1)), + Math.max(ll.getOrdinate(1), ur.getOrdinate(1))); + + dataAreaEnvelope.setCoordinateReferenceSystem(MapUtil.LATLON_PROJECTION); + + return dataAreaEnvelope; + + } catch (Exception e) { + out.println("Error while getting data area from Preferences: " + e.getMessage()); + return null; + } + } + + /** + * @param screenExtent + * @return + */ + protected PixelExtent getExpandedExtent(PixelExtent screenExtent) { + PixelExtent expandedExtent = screenExtent.clone(); + expandedExtent.getEnvelope().expandBy( + expandedExtent.getWidth() * EXPANSION_FACTOR, + expandedExtent.getHeight() * EXPANSION_FACTOR); + return expandedExtent; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResourceData.java index 01e883910b..c5c05729e2 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResourceData.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/PlotResourceData.java @@ -48,6 +48,7 @@ import com.raytheon.viz.pointdata.rsc.retrieve.AbstractDbPlotInfoRetriever; * 11/01/2011 #482 ghull added plotDensity, comment out unimplemented plugins * 04/09/2012 #615 sgurung Added conditionalFilterName and conditionalFilter * 02/05/2012 #606 ghull rm reportType as member variable + * 10/19/2012 #896 sgurung Use NcPlotResource2 * 11/04/2012 #944 ghull rm FcsPlotResource * 12/19/2012 #947 ghull save ConditionalFilter object to the RBD. * @@ -193,7 +194,7 @@ INatlCntrsResourceData { String pluginName = this.metadataMap.get("pluginName").getConstraintValue(); if (pluginNames.contains(pluginName)) { - return new PlotResource2(this, loadProperties); + return new NcPlotResource2(this, loadProperties); } else { System.out.println("Plugin "+ pluginName + " not supported by PlotResource2"); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/TafPlotResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/TafPlotResource.java index 7751c7333c..e263184a30 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/TafPlotResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.plotdata/src/gov/noaa/nws/ncep/viz/rsc/plotdata/rsc/TafPlotResource.java @@ -35,19 +35,20 @@ import com.raytheon.viz.pointdata.rsc.retrieve.PointDataPlotInfoRetriever; * 12/05/2011 sgurung Modify populateFrame() to fix a bug (calculateProgDisc being called multiple times) * 02/12/2012 #555 sgurung Removed method populateFrame() * 05/23/2012 785 Q. Zhou Added getName for legend. + * 10/18/2012 896 sgurung Extend NcPlotResource2. Comment out initResource() and getName(). * * * @author ghull * @version 1.0 */ -public class TafPlotResource extends PlotResource2 { +public class TafPlotResource extends NcPlotResource2 { public TafPlotResource(PlotResourceData data, LoadProperties props) { super(data, props); data.setPlotInfoRetriever( new TafPlotInfoRetriever() ); } - @Override + /*@Override public void initResource( IGraphicsTarget aTarget ) throws VizException { super.initResource(aTarget); @@ -80,9 +81,9 @@ public class TafPlotResource extends PlotResource2 { } //processNewRscDataList(); - } + }*/ - @Override + /*@Override public String getName() { String legendString = super.getName(); FrameData fd = (FrameData) getCurrentFrame(); @@ -97,5 +98,5 @@ public class TafPlotResource extends PlotResource2 { else { return legendString + " "+NmapCommon.getTimeStringFromDataTime( fd.getFrameTime(), "/"); } - } + }*/ } diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.classpath b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.classpath new file mode 100644 index 0000000000..ad32c83a78 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.project b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.project new file mode 100644 index 0000000000..2121402c05 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.project @@ -0,0 +1,28 @@ + + + gov.noaa.nws.ncep.viz.rsc.solarimage + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/ncep/gov.noaa.nws.ncep.metParameters/.settings/org.eclipse.jdt.core.prefs b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.settings/org.eclipse.jdt.core.prefs similarity index 92% rename from ncep/gov.noaa.nws.ncep.metParameters/.settings/org.eclipse.jdt.core.prefs rename to ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.settings/org.eclipse.jdt.core.prefs index 0184cb7847..f5d125b415 100644 --- a/ncep/gov.noaa.nws.ncep.metParameters/.settings/org.eclipse.jdt.core.prefs +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Tue May 03 17:10:42 EDT 2011 +#Mon Feb 13 16:11:02 EST 2012 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..a07262bb10 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/MANIFEST.MF @@ -0,0 +1,33 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: solarimage +Bundle-SymbolicName: gov.noaa.nws.ncep.viz.rsc.solarimage;singleton:=true +Eclipse-RegisterBuddy: com.raytheon.viz.core, com.raytheon.uf.viz.core, com.raytheon.viz.ui, com.raytheon.edex.common, com.raytheon.uf.common.serialization +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: gov.noaa.nws.ncep.viz.rsc.solarimage.Activator +Require-Bundle: gov.nasa.gsfc.fits, + org.eclipse.ui, + org.eclipse.core.runtime, + gov.noaa.nws.ncep.common.dataplugin.solarimage;bundle-version="1.0.0", + com.raytheon.uf.viz.core;bundle-version="1.12.1174", + com.raytheon.uf.common.dataplugin;bundle-version="1.12.1174", + com.raytheon.uf.common.time;bundle-version="1.12.1174", + org.apache.commons.lang;bundle-version="2.3.0", + org.geotools;bundle-version="2.6.4", + com.raytheon.uf.common.geospatial;bundle-version="1.12.1174", + com.raytheon.uf.viz.xy;bundle-version="1.12.1174", + com.raytheon.viz.ui;bundle-version="1.12.1174", + gov.noaa.nws.ncep.viz.localization;bundle-version="1.0.0", + com.raytheon.viz.core.graphing;bundle-version="1.12.1174", + com.raytheon.uf.viz.d2d.ui;bundle-version="1.12.1174", + com.raytheon.uf.viz.d2d.core;bundle-version="1.12.1174", + com.raytheon.uf.common.datastorage;bundle-version="1.12.1174", + com.raytheon.uf.common.colormap;bundle-version="1.12.1174", + com.raytheon.viz.core;bundle-version="1.12.1174", + javax.measure;bundle-version="1.0.0", + com.raytheon.uf.viz.xy.timeseries;bundle-version="1.12.1174", + gov.noaa.nws.ncep.viz.common +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Import-Package: gov.noaa.nws.ncep.viz.ui.display + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject new file mode 100644 index 0000000000..7d6fdc43a5 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject @@ -0,0 +1,3 @@ +gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResourceData +gov.noaa.nws.ncep.viz.rsc.solarimage.display.DefaultNonMapDisplay +gov.noaa.nws.ncep.viz.rsc.solarimage.display.SolarImageMatchCriteria \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/build.properties b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/build.properties new file mode 100644 index 0000000000..6e2f847b66 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/build.properties @@ -0,0 +1,6 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + localization/ diff --git a/ncep/gov.noaa.nws.ncep.metParameters/gov.noaa.nws.ncep.metParameters.ecl b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/gov.noaa.nws.ncep.viz.rsc.solarimage.ecl similarity index 100% rename from ncep/gov.noaa.nws.ncep.metParameters/gov.noaa.nws.ncep.metParameters.ecl rename to ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/gov.noaa.nws.ncep.viz.rsc.solarimage.ecl diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/localization/styleRules/solarImageryStyleRules.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/localization/styleRules/solarImageryStyleRules.xml new file mode 100644 index 0000000000..d23624f6ad --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/localization/styleRules/solarImageryStyleRules.xml @@ -0,0 +1,604 @@ + + + + + + + + SXI-FM3 + BE12A + 0.99--1.01 + + + + 0. + 3.6122 + + solar/Blue + + + + + + + + + + + + + SXI-FM3 + BE12A + 0.04--0.06 + + + + 0. + 4.9133 + + solar/Blue + + + + + + + + + + + + + SXI-FM3 + PTHK + 0.39--0.41 + + + DN/sec + + 0. + 4.0102 + + solar/Green + + + + + + + + + + + + + SXI-FM3 + PTHK + 0.04--0.06 + + + DN/sec + + 0. + 4.9133 + + solar/Green + + + + + + + + + + + + + SXI-FM3 + PTHNA + 0.39--0.41 + + + DN/sec + + 0. + 4.0102 + + solar/Green + + + + + + + + + + + + + SXI-FM3 + PTHNA + 0.02--0.03 + + + DN/sec + + 0. + 5.1973 + + solar/Green + + + + + + + + + + + + + SXI-FM3 + TM + 2.59--2.61 + + + DN/sec + + 0. + 3.1973 + + solar/Yellow + + + + + + + + + + + + + SXI-FM3 + TM + 0.49--0.51 + + + DN/sec + + 0. + 3.9133 + + solar/Yellow + + + + + + + + + + + + + SXI-FM3 + TM + 0.02--0.03 + + + DN/sec + + 0. + 5.1973 + + solar/Yellow + + + + + + + + + + + + + + AIA-4 + 94 + + + + 0 + 4.2144 + + solar/SDO_AIA_94 + + 1 2 3 4 + + + + + + AIA-1 + 131 + + + + 0 + 4.2144 + + solar/SDO_AIA_131 + + 1 2 3 4 + + + + + + AIA-3 + 171 + + + + 0 + 4.2144 + + solar/SDO_AIA_171 + + 1 2 3 4 + + + + + + AIA-2 + 193 + + + + 0 + 4.2144 + + solar/SDO_AIA_193 + + 1 2 3 4 + + + + + + AIA-2 + 211 + + + + 0 + 4.2144 + + solar/SDO_AIA_211 + + 1 2 3 4 + + + + + + AIA-4 + 304 + + + + 0 + 4.2144 + + solar/SDO_AIA_304 + + 1 2 3 4 + + + + + + AIA-1 + 335 + + + + 0 + 4.2144 + + solar/SDO_AIA_335 + + 1 2 3 4 + + + + + + AIA-3 + 1600 + + + + 0 + 4.2144 + + solar/SDO_AIA_1600 + + 1 2 3 4 + + + + + + AIA-3 + 1700 + + + + 0 + 4.2144 + + solar/SDO_AIA_1700 + + 1 2 3 4 + + + + + + AIA-3 + 4500 + + + + 0 + 4.2144 + + solar/SDO_AIA_4500 + + 1 2 3 4 + + + + + + HMI-SIDE1 + + + + -1500 + 1500 + + solar/Gray + + -1000 -500 0 500 1000 + + + + + + AIA-3 + THEMATIC + + + + 0 + 7 + + solar/SDO_Thematic + + + + + + + + + + + + + + + + EIT + 171 + + + + 0 + 4.2144 + + solar/SOHO_EIT_171 + + 1 2 3 4 + + + + + + EIT + 195 + + + + 0 + 4.2144 + + + 1 2 3 4 + + solar/SOHO_EIT_195 + + + + + EIT + 284 + + + + 0 + 4.2144 + + solar/SOHO_EIT_284 + + 1 2 3 4 + + + + + + EIT + 304 + + + + 0 + 4.2144 + + solar/SOHO_EIT_304 + + 1 2 3 4 + + + + + + + LASCO-C2 + + + + 400 + 16000 + + solar/Gray + + 2000 6000 10000 14000 + + + + + + + LASCO-C3 + + + + 400 + 16000 + + solar/Gray + + 2000 6000 10000 14000 + + + + + + + SECCHI + 195 + + + + 0 + 4.2144 + + + 1 2 3 4 + + solar/SOHO_EIT_195 + + + + + SECCHI-COR2 + + + + 0 + 4.2144 + + + 1 2 3 4 + + solar/Gray + + + + + SECCHI-HI1 + + + + 0 + 4.2144 + + + 1 2 3 4 + + solar/Gray + + + + + SECCHI-HI2 + + + + 0 + 4.2144 + + + 1 2 3 4 + + solar/Gray + + + + + + 6562.808 + + + + 0 + 8000 + + + 2000 4000 6000 + + solar/Gray + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/plugin.xml b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/plugin.xml new file mode 100644 index 0000000000..5b32394ba8 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/plugin.xml @@ -0,0 +1,783 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/Activator.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/Activator.java new file mode 100644 index 0000000000..31b852707b --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/Activator.java @@ -0,0 +1,85 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.SolarImagePreferences; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer         Description
+ * ------------ ---------- -----------      --------------------------
+ * 02/21/2013   958        qzhou, sgurung   Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "gov.noaa.nws.ncep.viz.rsc.solarimage"; //$NON-NLS-1$ + + private IPreferenceStore myprefs = null; + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext + * ) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext + * ) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + + @Override + public IPreferenceStore getPreferenceStore() { + + /* + * First time, set defaults for the SolarImage preference store + */ + if ( myprefs == null ) { + myprefs = super.getPreferenceStore(); + myprefs.setDefault( SolarImagePreferences.NUM_FRAMES, SolarImagePreferences.DEFAULT_NUM_FRAMES); + } + + return myprefs; + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/LogSolarImageDataCallback.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/LogSolarImageDataCallback.java new file mode 100644 index 0000000000..01dea8b80c --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/LogSolarImageDataCallback.java @@ -0,0 +1,45 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +import java.nio.FloatBuffer; + +import com.raytheon.uf.viz.core.exception.VizException; + + +public class LogSolarImageDataCallback extends SolarImageDataCallback { + + /** + * @param record + * @throws VizException + */ + public LogSolarImageDataCallback(SolarImageRecord record) throws VizException { + super(record); + } + + @Override + public ColorMapData getColorMapData() throws VizException { + System.out.println("Retrieving SolarImage data from HDF5..."); + + int[] dimensions = new int[] { imgData.getNx(), imgData.getNy() }; + + float[] vals = imgData.getImageValues(); + float[] logVals = new float[vals.length]; + + for (int n = 0; n < vals.length; n++) { + if (vals[n] <= 0) + logVals[n] = Float.NEGATIVE_INFINITY; + else + logVals[n] = (float) (Math.log10(vals[n])); + } + + FloatBuffer buffer = FloatBuffer.wrap(logVals); + + return new ColorMapData(buffer, dimensions, ColorMapDataType.FLOAT); + } + + @Override + public double getOriginalValue(double val) { + return Math.pow(10.0, val); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageBundleLoader.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageBundleLoader.java new file mode 100644 index 0000000000..7ef93f78bb --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageBundleLoader.java @@ -0,0 +1,69 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage; + +import gov.noaa.nws.ncep.viz.common.ui.NmapCommon; +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.SolarImagePreferences; +import gov.noaa.nws.ncep.viz.ui.display.NCLoopProperties; + +import java.io.File; +import java.util.Map; + +import org.eclipse.jface.preference.IPreferenceStore; + +import com.raytheon.uf.viz.core.DescriptorMap; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.procedures.Bundle; +import com.raytheon.uf.viz.d2d.core.time.D2DTimeMatcher; +import com.raytheon.uf.viz.d2d.core.time.LoadMode; +import com.raytheon.viz.ui.UiUtil; +import com.raytheon.viz.ui.actions.LoadSerializedXml; +import com.raytheon.viz.ui.editor.AbstractEditor; + +public class SolarImageBundleLoader { + /** + * Load a bundle from a file into a container + * + * @param editor + * the container to load to + * @param f + * the file containing the bundle + * @param descriptor + * Optional: A descriptor that should be used for time matching + * @throws VizException + */ + public static void loadTo(File f, Map variables) + throws VizException { + Bundle b = Bundle.unmarshalBundle(f, variables); + + IRenderableDisplay renderableDisplay = b.getDisplays()[0]; + IDescriptor bundleDescriptor = renderableDisplay.getDescriptor(); + bundleDescriptor.setNumberOfFrames(getMaxFrameNum()); + + ((D2DTimeMatcher) bundleDescriptor.getTimeMatcher()).setLoadMode(LoadMode.VALID_TIME_SEQ); + + String bundleEditorId = DescriptorMap.getEditorId(bundleDescriptor + .getClass().getName()); + // AbstractEditor editor = UiUtil.createOrOpenEditor(bundleEditorId, + AbstractEditor editor = UiUtil.createEditor(bundleEditorId, + b.getDisplays()); + editor.setLoopProperties(new NCLoopProperties()); + try { + LoadSerializedXml.loadTo(editor, b); + } + catch (Exception e) { + System.out.println(" Error loading bundle" ); + } + } + + public static int getMaxFrameNum() { + int maxFrameNum = 0; + IPreferenceStore prefs = NmapCommon.getNcepPreferenceStore(); + maxFrameNum = prefs.getInt(SolarImagePreferences.NUM_FRAMES); + + if (maxFrameNum == 0) + maxFrameNum = SolarImagePreferences.DEFAULT_NUM_FRAMES; + + return maxFrameNum; + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageDataCallback.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageDataCallback.java new file mode 100644 index 0000000000..4179619833 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/SolarImageDataCallback.java @@ -0,0 +1,98 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.ImageData; + +import java.io.File; +import java.nio.FloatBuffer; + +import com.raytheon.uf.common.datastorage.DataStoreFactory; +import com.raytheon.uf.common.datastorage.IDataStore; +import com.raytheon.uf.common.datastorage.records.ByteDataRecord; +import com.raytheon.uf.common.datastorage.records.IDataRecord; +import com.raytheon.uf.viz.core.HDF5Util; +import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; +import com.raytheon.uf.viz.core.exception.VizException; + +public class SolarImageDataCallback implements IColorMapDataRetrievalCallback { + + protected SolarImageRecord record; + + public ImageData imgData; + + /** + * @param record + * @throws VizException + */ + public SolarImageDataCallback(SolarImageRecord record) throws VizException { + this.record = record; + this.imgData = new ImageData(record); + } + + @Override + public ColorMapData getColorMapData() throws VizException { + System.out.println("Retrieving solarimage data from HDF5..."); + + int[] dimensions = new int[] { imgData.getNx(), imgData.getNy() }; + FloatBuffer buffer = FloatBuffer.wrap(imgData.getImageValues()); + + return new ColorMapData(buffer, dimensions, ColorMapDataType.FLOAT); + } + + protected float[] getRawData() { + float[] values = null; + byte[] rawData = null; + File loc = HDF5Util.findHDF5Location(record); + IDataStore dataStore = DataStoreFactory.getDataStore(loc); + + try { + IDataRecord[] dataRecs = dataStore.retrieve(record.getDataURI()); + for (IDataRecord rec : dataRecs) { + + if (rec.getName().equals(SolarImageRecord.RAW_DATA) + && rec instanceof ByteDataRecord) { + rawData = (((ByteDataRecord) rec).getByteData()); + } + } + + } catch (Exception se) { + se.printStackTrace(); + } + + return values; + } + + public double getOriginalValue(double val) { + return val; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime + * result + + ((record.getDataURI() == null) ? 0 : record.getDataURI() + .hashCode()); + result = prime * result + this.getClass().getCanonicalName().hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SolarImageDataCallback other = (SolarImageDataCallback) obj; + if (record.getDataURI() == null) { + if (other.record.getDataURI() != null) + return false; + } else if (!record.getDataURI().equals(other.record.getDataURI())) + return false; + return true; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonAction.java new file mode 100644 index 0000000000..8acf3bae1d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonAction.java @@ -0,0 +1,176 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResource; + +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; + +/** + * + * Enable/Disable Carrington LatLon Overlay for SolarImageResource + * + *
+ * 
+ *  SOFTWARE HISTORY
+ * 
+ *  Date         Ticket#     Engineer    Description
+ *  ------------ ----------  ----------- --------------------------
+ * Feb 21, 2013  958         qzhou     Initial Creation.
+ * 
+ * 
+ * + * @author qzhou + * @version 1 + */ + +public class CarrLatLonAction extends AbstractRightClickAction + implements IMenuCreator { + + private Menu menu; + + private static String[] latLonIntervals = {"No Overlay", "10", "15", "30", "45", "60"}; + + /** + * Default constructor. + */ + public CarrLatLonAction() { + super(Action.AS_DROP_DOWN_MENU); + this.setChecked(false); + setMenuCreator(this); + } + + @Override + public IMenuCreator getMenuCreator() { + this.setChecked(false); + return this; + } + + + @Override + public void dispose() { + if (menu != null) { + menu.dispose(); + menu = null; + } + } + + @Override + public Menu getMenu(Control parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + + return menu; + } + + @Override + public Menu getMenu(Menu parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + + return menu; + } + + public void fillMenu(Menu menu, Display d) { + + AbstractVizResource rsc = getSelectedRsc(); + if (rsc instanceof SolarImageResource) { + + boolean found = false; + String currentInterval = getTopMostSelectedResource().getCapability( + CarrLatLonCapability.class).getInterval(); + + for (String intvl : latLonIntervals) { + boolean selected = intvl.equals(currentInterval); + found |= selected; + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, intvl, d, selected)); + actionItem.fill(menu, -1); + + } + + if (!found) { + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, currentInterval, d, true)); + actionItem.fill(menu, -1); + } + } + } + + private class ChangeLatLonIntervalInternalAction extends Action { + private String interval; + AbstractVizResource resource = null; + + public ChangeLatLonIntervalInternalAction(AbstractVizResource resource, String intvl, Display d, boolean selected) { + super(intvl); + this.resource = resource; + this.interval = intvl; + this.setChecked(false); + + if (selected) { + this.setChecked(true); + } + + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return super.getText(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + + if (interval != null) { + + if (this.getText().equals("No Overlay")) { + ((SolarImageResource) resource).setLatLonOverlay(false); + ((SolarImageResource) resource).isCarrington = false; + } + else { + ((SolarImageResource) resource).setLatLonOverlay(true); + ((SolarImageResource) resource).isCarrington = true; + } + + getTopMostSelectedResource().getCapability(CarrLatLonCapability.class).setInterval(interval); + getTopMostSelectedResource().getCapability(StonyLatLonCapability.class).setInterval("No Overlay"); + } + getContainer().refresh(); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return "Carrington LatLon Overlay"; + } + +} + + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonCapability.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonCapability.java new file mode 100644 index 0000000000..adb416c258 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/CarrLatLonCapability.java @@ -0,0 +1,73 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; + +import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; + +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer             Description
+ * ------------ ---------- -----------          --------------------------
+ * 02/21/2013   958        qzhou, sgurung       Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ +@XmlAccessorType(XmlAccessType.NONE) +public class CarrLatLonCapability extends AbstractCapability { + + private String interval = "No Overlay"; + + /** + * @return the outlineWidth + */ + public String getInterval() { + return interval; + } + + /** + * @param outlineWidth + * the outlineWidth to set + */ + public void setInterval(String interval) { + if (this.interval != interval) { + this.interval = interval; + this.capabilityChanged(); + } + } + + + @Override + public AbstractCapability clone() { + CarrLatLonCapability oc = new CarrLatLonCapability(); + oc.interval = interval; + return oc; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableLatLonAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableLatLonAction.java new file mode 100644 index 0000000000..de02917bb2 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableLatLonAction.java @@ -0,0 +1,169 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResource; + +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; + +/** + * + * Enable/Disable LatLon Overlay for SolarImageResource + * + *
+ * 
+ *  SOFTWARE HISTORY
+ * 
+ *  Date         Ticket#     Engineer    Description
+ *  ------------ ----------  ----------- --------------------------
+ * Feb 21, 2013  958         qzhou     Initial Creation.
+ * 
+ * 
+ * + * @author qzhou + * @version 1 + */ + +public class EnableDisableLatLonAction extends AbstractRightClickAction + implements IMenuCreator { + + private Menu menu; + + private static String[] latLonIntervals = {"No Overlay", "10", "15", "30", "45", "60"}; + + /** + * Default constructor. + */ + public EnableDisableLatLonAction() { + super(Action.AS_DROP_DOWN_MENU); + setMenuCreator(this); + } + + @Override + public IMenuCreator getMenuCreator() { + return this; + } + + + @Override + public void dispose() { + if (menu != null) { + menu.dispose(); + menu = null; + } + } + + @Override + public Menu getMenu(Control parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + return menu; + } + + @Override + public Menu getMenu(Menu parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + return menu; + } + + public void fillMenu(Menu menu, Display d) { + + AbstractVizResource rsc = getSelectedRsc(); + if (rsc instanceof SolarImageResource) { + + boolean found = false; + String currentInterval = getTopMostSelectedResource().getCapability( + LatLonIntervalCapability.class).getInterval(); + + for (String intvl : latLonIntervals) { + boolean selected = intvl.equals(currentInterval); + found |= selected; + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, intvl, d, selected)); + actionItem.fill(menu, -1); + + } + + if (!found) { + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, currentInterval, d, true)); + actionItem.fill(menu, -1); + } + } + } + + private class ChangeLatLonIntervalInternalAction extends Action { + private String interval; + AbstractVizResource resource = null; + + public ChangeLatLonIntervalInternalAction(AbstractVizResource resource, String intvl, Display d, boolean selected) { + super(intvl); + this.resource = resource; + this.interval = intvl; + this.setChecked(false); + + if (selected) { + this.setChecked(true); + } + + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return super.getText(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + + if (interval != null) { + + if (this.getText().equals("No Overlay")) { + ((SolarImageResource) resource).setLatLonOverlay(false); + } + else { + ((SolarImageResource) resource).setLatLonOverlay(true); + } + + getTopMostSelectedResource().getCapability(LatLonIntervalCapability.class).setInterval(interval); + + } + getContainer().refresh(); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return "Stonyhurst LatLon Overlay"; + } + +} + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableSamplingAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableSamplingAction.java new file mode 100644 index 0000000000..886694f215 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/EnableDisableSamplingAction.java @@ -0,0 +1,73 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResource; + +import com.raytheon.uf.viz.core.drawables.ResourcePair; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; + +/** + * + * Enable/Disable Sampling for SolarImageResource + * + *
+ * 
+ *  SOFTWARE HISTORY
+ * 
+ *  Date         Ticket#     Engineer    Description
+ *  ------------ ----------  ----------- --------------------------
+ * Feb 13, 2013  958         sgurung     Initial Creation.
+ * 
+ * 
+ * + * @author sgurung + * @version 1 + */ + +public class EnableDisableSamplingAction extends AbstractRightClickAction { + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + AbstractVizResource rsc = getSelectedRsc(); + if (rsc instanceof SolarImageResource) { + boolean isEnabled = ((SolarImageResource) rsc).isSampling(); + ((SolarImageResource) rsc).setSampling(!isEnabled); + ((SolarImageResource) rsc).issueRefresh(); + this.setChecked(!isEnabled); + } + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.ui.cmenu.AbstractRightClickAction#setSelectedRsc(com + * .raytheon.uf.viz.core.rsc.AbstractVizResource) + */ + @Override + public void setSelectedRsc(ResourcePair selectedRsc) { + super.setSelectedRsc(selectedRsc); + AbstractVizResource rsc = getSelectedRsc(); + if (rsc instanceof SolarImageResource) { + boolean isEnabled = ((SolarImageResource) rsc).isSampling(); + this.setChecked(isEnabled); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return "Sample"; + } + +} + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/HalphaImageAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/HalphaImageAction.java new file mode 100644 index 0000000000..891e4dab01 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/HalphaImageAction.java @@ -0,0 +1,63 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageBundleLoader; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * + * @version 1.0 + */ +public class HalphaImageAction extends AbstractHandler { + + public static final String INSTRUMENT = "instrument"; + + public static final String SITE = "site"; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands + * .ExecutionEvent) + */ + @Override + public Object execute(final ExecutionEvent arg0) throws ExecutionException { + + if (arg0.getCommand() == null) { + return null; + } + + String instrument = arg0.getParameter(INSTRUMENT); + String site = arg0.getParameter(SITE); + if (instrument == null || site == null) { + return null; + } + + File bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/HalphaImage.xml"); + + Map vars = new HashMap(); + vars.put(INSTRUMENT, instrument); + vars.put(SITE, site); + + try { + SolarImageBundleLoader.loadTo(bundle, vars); + } catch (VizException e) { + e.printStackTrace(); + // statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + // e); + } + + return null; + } +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/LatLonIntervalCapability.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/LatLonIntervalCapability.java new file mode 100644 index 0000000000..62aef46fc3 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/LatLonIntervalCapability.java @@ -0,0 +1,75 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; + +import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; +import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; + +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer             Description
+ * ------------ ---------- -----------          --------------------------
+ * 02/21/2013   958        qzhou, sgurung       Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ +@XmlAccessorType(XmlAccessType.NONE) +public class LatLonIntervalCapability extends AbstractCapability { + + private String interval = "No Overlay"; + + /** + * @return the outlineWidth + */ + public String getInterval() { + return interval; + } + + /** + * @param outlineWidth + * the outlineWidth to set + */ + public void setInterval(String interval) { + if (this.interval != interval) { + this.interval = interval; + this.capabilityChanged(); + } + } + + + @Override + public AbstractCapability clone() { + LatLonIntervalCapability oc = new LatLonIntervalCapability(); + oc.interval = interval; + return oc; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SDOImageAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SDOImageAction.java new file mode 100644 index 0000000000..583dd07f13 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SDOImageAction.java @@ -0,0 +1,79 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageBundleLoader; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * + * @version 1.0 + */ +public class SDOImageAction extends AbstractHandler { + + public static final String WAVELENGTH = "wavelength"; + + public static final String INSTRUMENT = "instrument"; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands + * .ExecutionEvent) + */ + @Override + public Object execute(final ExecutionEvent arg0) throws ExecutionException { + + if (arg0.getCommand() == null) { + return null; + } + + String wavelength = arg0.getParameter(WAVELENGTH); + String instrument = arg0.getParameter(INSTRUMENT); + if (wavelength == null || instrument == null) { + return null; + } + + File bundle = null; + Map vars = new HashMap(); + if (wavelength.equals("Multi")) { + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/SDO_AIA_MultiImage.xml"); + + } else if (instrument.startsWith("HMI")) { + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/SDO_HMIImage.xml"); + vars.put(INSTRUMENT, instrument); + } else { + + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/SDO_AIAImage.xml"); + System.out.println("GOTIT!!!!!!!!!!!!!! " + + bundle.getAbsolutePath() + " for " + wavelength); + + vars.put(WAVELENGTH, wavelength); + vars.put(INSTRUMENT, instrument); + } + + try { + // LoadSerializedXml.loadTo(bundle, vars); + SolarImageBundleLoader.loadTo(bundle, vars); + } catch (VizException e) { + e.printStackTrace(); + // statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + // e); + } + + + return null; + } +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SOHOImageAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SOHOImageAction.java new file mode 100644 index 0000000000..8c48285287 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SOHOImageAction.java @@ -0,0 +1,77 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageBundleLoader; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * + * @version 1.0 + */ +public class SOHOImageAction extends AbstractHandler { + + public static final String WAVELENGTH = "wavelength"; + + public static final String INSTRUMENT = "instrument"; + + public static final String DETECTOR = "detector"; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands + * .ExecutionEvent) + */ + @Override + public Object execute(final ExecutionEvent arg0) throws ExecutionException { + + if (arg0.getCommand() == null) { + return null; + } + + String instrument = arg0.getParameter(INSTRUMENT); + if (instrument == null) { + return null; + } + + Map vars = new HashMap(); + File bundle = null; + + if (instrument.equals("EIT")) { + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/SOHOEitImage.xml"); + String wavelength = arg0.getParameter(WAVELENGTH); + + vars.put(WAVELENGTH, wavelength); + vars.put(INSTRUMENT, instrument); + } else { //if (instrument.equals("LASCO")) { + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/SOHOLascoImage.xml"); + + vars.put(INSTRUMENT, instrument); + + } + + + try { + // LoadSerializedXml.loadTo(bundle, vars); + SolarImageBundleLoader.loadTo(bundle, vars); + } catch (VizException e) { + e.printStackTrace(); + // statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + // e); + } + + return null; + } +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/STEREOImageAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/STEREOImageAction.java new file mode 100644 index 0000000000..bda3726d73 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/STEREOImageAction.java @@ -0,0 +1,70 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageBundleLoader; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * + * @version 1.0 + */ +public class STEREOImageAction extends AbstractHandler { + + public static final String WAVELENGTH = "wavelength"; + + public static final String INSTRUMENT = "instrument"; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands + * .ExecutionEvent) + */ + @Override + public Object execute(final ExecutionEvent arg0) throws ExecutionException { + + if (arg0.getCommand() == null) { + return null; + } + + String wavelength = arg0.getParameter(WAVELENGTH); + String instrument = arg0.getParameter(INSTRUMENT); +// String detector = arg0.getParameter(DETECTOR); +// if (detector == null || instrument == null) { +// return null; +// } + if (wavelength == null) + wavelength = "0"; + + File bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/STEREOImage.xml"); + System.out.println("GOTIT!!!!!!!!!!!!!! " + bundle.getAbsolutePath() + + " for " + wavelength); + + Map vars = new HashMap(); + vars.put(WAVELENGTH, wavelength); + vars.put(INSTRUMENT, instrument); + //vars.put(DETECTOR, detector); + + try { + // LoadSerializedXml.loadTo(bundle, vars); + SolarImageBundleLoader.loadTo(bundle, vars); + } catch (VizException e) { + e.printStackTrace(); + // statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + // e); + } + + return null; + } +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SXIImageAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SXIImageAction.java new file mode 100644 index 0000000000..92c5fdcda3 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/SXIImageAction.java @@ -0,0 +1,83 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import gov.noaa.nws.ncep.viz.localization.NcPathManager; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageBundleLoader; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.raytheon.uf.viz.core.exception.VizException; + +/** + * + * @version 1.0 + */ +public class SXIImageAction extends AbstractHandler { + + public static final String WAVELENGTH = "wavelength"; + + public static final String INTTIME = "inttime"; + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands + * .ExecutionEvent) + */ + @Override + public Object execute(final ExecutionEvent arg0) throws ExecutionException { + + if (arg0.getCommand() == null) { + return null; + } + + String wavelength = arg0.getParameter(WAVELENGTH); + String inttime = arg0.getParameter(INTTIME); + if (wavelength == null || inttime == null) { + return null; + } + + File bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/GoesSXIImage.xml"); + System.out.println("GOTIT!!!!!!!!!!!!!! " + bundle.getAbsolutePath() + + " for " + wavelength); + + Map vars = new HashMap(); + + if (wavelength.contains("|")) { + bundle = NcPathManager.getInstance().getStaticFile( + "ncep/Bundles/GoesSXIImageMultipane.xml"); + + int numPanels = 4; + String[] wavelens = wavelength.split("\\|", numPanels); + String[] times = inttime.split("\\|", numPanels); + for (int n = 0; n < numPanels; n++) { + vars.put(WAVELENGTH + String.valueOf(n), wavelens[n]); + vars.put(INTTIME + String.valueOf(n), times[n]); + System.out.println(String.valueOf(n) + " : " + wavelens[n] + + " : " + times[n]); + } + } else { + vars.put(WAVELENGTH, wavelength); + vars.put(INTTIME, inttime); + } + + // vars.put("tabTitle", "GOES-15/SXI"); + try { + // LoadSerializedXml.loadTo(bundle, vars); + SolarImageBundleLoader.loadTo(bundle, vars); + } catch (VizException e) { + e.printStackTrace(); + // statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + // e); + } + + return null; + } +} \ No newline at end of file diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonAction.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonAction.java new file mode 100644 index 0000000000..fb6d49015d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonAction.java @@ -0,0 +1,171 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResource; + +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.viz.ui.cmenu.AbstractRightClickAction; + +/** + * + * Enable/Disable LatLon Overlay for SolarImageResource + * + *
+ * 
+ *  SOFTWARE HISTORY
+ * 
+ *  Date         Ticket#     Engineer    Description
+ *  ------------ ----------  ----------- --------------------------
+ * Feb 21, 2013  958         qzhou     Initial Creation.
+ * 
+ * 
+ * + * @author qzhou + * @version 1 + */ + +public class StonyLatLonAction extends AbstractRightClickAction + implements IMenuCreator { + + private Menu menu; + + private static String[] latLonIntervals = {"No Overlay", "10", "15", "30", "45", "60"}; + + /** + * Default constructor. + */ + public StonyLatLonAction() { + super(Action.AS_DROP_DOWN_MENU); + setMenuCreator(this); + } + + @Override + public IMenuCreator getMenuCreator() { + return this; + } + + + @Override + public void dispose() { + if (menu != null) { + menu.dispose(); + menu = null; + } + } + + @Override + public Menu getMenu(Control parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + return menu; + } + + @Override + public Menu getMenu(Menu parent) { + if (menu != null) { + menu.dispose(); + } + menu = new Menu(parent); + fillMenu(menu, parent.getDisplay()); + return menu; + } + + public void fillMenu(Menu menu, Display d) { + + AbstractVizResource rsc = getSelectedRsc(); + if (rsc instanceof SolarImageResource) { + + boolean found = false; + String currentInterval = getTopMostSelectedResource().getCapability( + StonyLatLonCapability.class).getInterval(); + + for (String intvl : latLonIntervals) { + boolean selected = intvl.equals(currentInterval); + found |= selected; + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, intvl, d, selected)); + actionItem.fill(menu, -1); + + } + + if (!found) { + ActionContributionItem actionItem = new ActionContributionItem( + new ChangeLatLonIntervalInternalAction(rsc, currentInterval, d, true)); + actionItem.fill(menu, -1); + } + } + } + + private class ChangeLatLonIntervalInternalAction extends Action { + private String interval; + AbstractVizResource resource = null; + + public ChangeLatLonIntervalInternalAction(AbstractVizResource resource, String intvl, Display d, boolean selected) { + super(intvl); + this.resource = resource; + this.interval = intvl; + this.setChecked(false); + + if (selected) { + this.setChecked(true); + } + //CarrLatLonAciton + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return super.getText(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + + if (interval != null) { + + if (this.getText().equals("No Overlay")) { + ((SolarImageResource) resource).setLatLonOverlay(false); + ((SolarImageResource) resource).isCarrington = false; + } + else { + ((SolarImageResource) resource).setLatLonOverlay(true); + ((SolarImageResource) resource).isCarrington = false; + } + + getTopMostSelectedResource().getCapability(StonyLatLonCapability.class).setInterval(interval); + getTopMostSelectedResource().getCapability(CarrLatLonCapability.class).setInterval("No Overlay"); + } + getContainer().refresh(); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + @Override + public String getText() { + return "Stonyhurst LatLon Overlay"; + } + +} + diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonCapability.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonCapability.java new file mode 100644 index 0000000000..a9d44baedd --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/actions/StonyLatLonCapability.java @@ -0,0 +1,73 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.actions; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; + +import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability; + +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer             Description
+ * ------------ ---------- -----------          --------------------------
+ * 02/21/2013   958        qzhou, sgurung       Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ +@XmlAccessorType(XmlAccessType.NONE) +public class StonyLatLonCapability extends AbstractCapability { + + private String interval = "No Overlay"; + + /** + * @return the outlineWidth + */ + public String getInterval() { + return interval; + } + + /** + * @param outlineWidth + * the outlineWidth to set + */ + public void setInterval(String interval) { + if (this.interval != interval) { + this.interval = interval; + this.capabilityChanged(); + } + } + + + @Override + public AbstractCapability clone() { + StonyLatLonCapability oc = new StonyLatLonCapability(); + oc.interval = interval; + return oc; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/DefaultNonMapDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/DefaultNonMapDisplay.java new file mode 100644 index 0000000000..865d3e5a02 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/DefaultNonMapDisplay.java @@ -0,0 +1,38 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.display; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import org.eclipse.swt.layout.FormData; + +import com.raytheon.uf.viz.core.PixelExtent; +import com.raytheon.uf.viz.d2d.ui.AbstractNonMapDisplay; +import com.raytheon.viz.core.graphing.GraphDescriptor; + +@XmlAccessorType(XmlAccessType.NONE) +@XmlRootElement +public class DefaultNonMapDisplay extends AbstractNonMapDisplay { + + public DefaultNonMapDisplay() { + this(new PixelExtent(0, 1000, 0, 1000)); + } + + public DefaultNonMapDisplay(PixelExtent aPixelExtent) { + super(aPixelExtent, new GraphDescriptor()); + // TODO Auto-generated constructor stub + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.d2d.ui.AbstractNonMapDisplay#getInsetMapLocation() + */ + @Override + public FormData getInsetMapLocation() { + // No Map Inset + return null; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/SolarImageMatchCriteria.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/SolarImageMatchCriteria.java new file mode 100644 index 0000000000..d56ac589d3 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/display/SolarImageMatchCriteria.java @@ -0,0 +1,145 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.display; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.rsc.SolarImageResourceData; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import com.raytheon.uf.viz.core.style.MatchCriteria; +import com.raytheon.uf.viz.core.style.VizStyleException; + + +@XmlAccessorType(XmlAccessType.NONE) +@XmlRootElement(name = "solarImageMatches") +public class SolarImageMatchCriteria extends MatchCriteria { + + private static final String INSTRUMENT = "instrument"; + + private static final String WAVELENGTH = "wavelength"; + + private static final String INT_TIME = "intTime"; + + @XmlElement + private String instrument; + + @XmlElement + private String wavelength; + + @XmlElement + private String intTime; + + /* @XmlElement + private String detector; +*/ + public static SolarImageMatchCriteria constructFromResourceData( + SolarImageResourceData rscdata) { + + SolarImageMatchCriteria criteria = new SolarImageMatchCriteria(); + + if (rscdata.getMetadataMap().containsKey(INSTRUMENT)) + criteria.setInstrument(rscdata.getMetadataMap().get(INSTRUMENT) + .getConstraintValue()); + + if (rscdata.getMetadataMap().containsKey(WAVELENGTH)) + criteria.setWavelength(rscdata.getMetadataMap().get(WAVELENGTH) + .getConstraintValue()); + + if (rscdata.getMetadataMap().containsKey(INT_TIME)) + criteria.setIntTime(rscdata.getMetadataMap().get(INT_TIME) + .getConstraintValue()); + + return criteria; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.style.MatchCriteria#matches(com.raytheon + * .uf. viz.core.style.MatchCriteria) + */ + @Override + public int matches(MatchCriteria aCriteria) throws VizStyleException { + int rval = -1; + if (aCriteria instanceof SolarImageMatchCriteria) { + rval = 0; + SolarImageMatchCriteria criteria = (SolarImageMatchCriteria) aCriteria; + + if (instrument != null + && instrument.equalsIgnoreCase(criteria.instrument)) { + rval++; + } + if (intTime != null && intTime.equalsIgnoreCase(criteria.intTime)) { + rval++; + } + if (wavelength != null + && wavelength.equalsIgnoreCase(criteria.wavelength)) { + rval++; + } + /*if (detector != null + && detector.equalsIgnoreCase(criteria.detector)) { + rval++; + }*/ + } + return rval; + } + + /** + * @return the wavelength + */ + public String getWavelength() { + return wavelength; + } + + /** + * @param wavelength + * the wavelength to set + */ + public void setWavelength(String wavelength) { + this.wavelength = wavelength; + } + + /** + * @return the intTime + */ + public String getIntTime() { + return intTime; + } + + /** + * @param intTime + * the intTime to set + */ + public void setIntTime(String intTime) { + this.intTime = intTime; + } + + public String getInstrument() { + return instrument; + } + + public void setInstrument(String instrument) { + this.instrument = instrument; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/LatLonOverlay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/LatLonOverlay.java new file mode 100644 index 0000000000..72bba7f528 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/LatLonOverlay.java @@ -0,0 +1,624 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + + +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.HeaderData; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.graphics.RGB; +import org.opengis.referencing.operation.TransformException; + +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IFont; +import com.raytheon.uf.viz.core.drawables.IWireframeShape; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.exception.VizException; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * The class that draws the latitude and longitude overlays. + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer         Description
+ * ------------ ---------- -----------      --------------------------
+ * 02/21/2013   958        qzhou, sgurung   Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ + +public class LatLonOverlay { + + // Latitude lines + private IWireframeShape[] wireframeShapeForLatLineArray; + + private List latStonyCoordPointArrayList; + + private IWireframeShape[] wireframeShapeForLonLineArray; + + private List lonStonyCoordPointArrayList; + + private double latLonDrawingPointInterval = 1.0; //0.7; //1.0; //0.5 + + protected int latLonInterval; + + private SolarImageDisplay imageDisplay; + + HeaderData headerData; + + private IDescriptor descriptor; + + private PaintProperties paintProps; + + private float zoomFactor; + + private int addToPoint = 45; + + private double mapMinX; + private double mapMaxY; + private double mapMinY; + private double mapMaxX; + + private double viewMinX; + private double viewMaxY; + private double viewMinY; + private double viewMaxX; + + /* + * The four minimum and maximum of X and Y used to paint label + */ + private double effectiveMinX; + private double effectiveMaxY; + private double effectiveMinY; + private double effectiveMaxX; + + private double hgln = 0.0; + private double crln = 0.0; + + boolean isCarrington; + + public LatLonOverlay(SolarImageDisplay imageDisplay, IDescriptor descriptor, int latLonInterval, PaintProperties paintProps, boolean isCarrington) { + this.imageDisplay = imageDisplay; + this.descriptor = descriptor; + this.latLonInterval = latLonInterval; + this.paintProps = paintProps; + this.zoomFactor = paintProps.getZoomLevel(); + this.isCarrington = isCarrington; + headerData = imageDisplay.getHeaderData(); + + if (headerData != null) { + this.hgln = headerData.getHgln(); + this.crln = headerData.getCrln(); + + if (crln == 0.0) { + if (headerData.getSolarL0() != 0) { // halpha + crln = headerData.getSolarL0(); + } + if (crln == 0.0) // all other + crln = headerData.getL0B0()[0]; + } + + } + //System.out.println(" ****** hgln crln: " + hgln +" "+crln); + + initializeMapMinAndMaxXAndY(); + } + + private void initializeMapMinAndMaxXAndY() { + mapMinX = descriptor.getGridGeometry().getGridRange().getLow(0); + mapMaxX = descriptor.getGridGeometry().getGridRange().getHigh(0); + mapMinY = descriptor.getGridGeometry().getGridRange().getLow(1); + mapMaxY = descriptor.getGridGeometry().getGridRange().getHigh(1); + } + + private void initializeViewMinAndMaxXAndY() { + viewMinX = paintProps.getView().getExtent().getMinX(); + viewMaxX = paintProps.getView().getExtent().getMaxX(); + viewMinY = paintProps.getView().getExtent().getMinY(); + viewMaxY = paintProps.getView().getExtent().getMaxY(); + + effectiveMinX = viewMinX; + effectiveMaxX = viewMaxX; + effectiveMinY = viewMinY; + effectiveMaxY = viewMaxY; + + //System.out.println(" *** viewMinX = " + viewMinX + " " + viewMaxX + " " + viewMinY + " " + viewMaxY); + } + + + public double[] getStonyLonStartEndInterval() { + + double[] startEndInterval = new double[2]; + double startValue = -90 + hgln - hgln%latLonInterval; + double endValue = startValue + 180; //90 + hgln - hgln%latLonInterval; + + if (startValue < -90 + hgln) { + startValue += latLonInterval; + } + if (endValue > 90 + hgln) { + endValue -= latLonInterval; + } + + if (startValue > endValue) { + double tem = startValue; + startValue = endValue; + endValue = tem; + } + //System.out.println("***start end "+hgln +" "+startValue+" "+endValue); + startEndInterval[0] = startValue; + startEndInterval[1] = endValue; + + return startEndInterval; + } + + public double[] getStonyLonForLatStartEndInterval() { + + double[] startEndInterval = new double[2]; + double startValue = -90 + hgln; + double endValue = startValue + 180; //90 + hgln; + + if (startValue < -180) { + startValue = startValue + 360; + } + if (endValue > 180) { + endValue = endValue - 360; + } + if (startValue > endValue) { + double tem = startValue; + startValue = endValue; + endValue = tem; + } + + startEndInterval[0] = startValue; + startEndInterval[1] = endValue; + return startEndInterval; + } + + public double[] getCarrLonStartEndInterval() { + double[] startEndInterval = new double[2]; + double endValue = 0.0; + double startValue = -90 + crln - crln%latLonInterval; + + if (startValue >180) + startValue = startValue - 360; + endValue = startValue +180; + + if (startValue < -90 + crln) { + startValue += latLonInterval; + } + if (endValue > 90 + crln) { + endValue -= latLonInterval; + } + + if (startValue > endValue) { + double tem = startValue; + startValue = endValue; + endValue = tem; + } + + startEndInterval[0] = startValue; + startEndInterval[1] = endValue; + + return startEndInterval; + } + + public double[] getCarrLonForLatStartEndInterval() { + + double[] startEndInterval = new double[2]; + double startValue = -90 + crln ; + + if (startValue > 180) + startValue = startValue - 360; + if (startValue < -180) + startValue = startValue + 360; + + double endValue = startValue + 180; + if (endValue > 180) { + endValue = endValue - 360; + } + + if (startValue > endValue) { + double tem = startValue; + startValue = endValue; + endValue = tem; + } + //System.out.println("***start2 end2 "+hgln +" "+startValue+" "+endValue); + startEndInterval[0] = startValue; + startEndInterval[1] = endValue; + return startEndInterval; + } + + public void drawLatLines(IGraphicsTarget target) throws VizException, TransformException { + + IFont.Style [] fontStyle = new IFont.Style[1]; + fontStyle[0] = IFont.Style.BOLD; + IFont labelFont = target.initializeFont(target.getDefaultFont() + .getFontName(), 12, fontStyle); + labelFont.setSmoothing(false); + labelFont.setScaleFont(false); + + initializeViewMinAndMaxXAndY(); + + int latDrawingLineNumber = getLatDrawingLineNumber(latLonInterval); + + latStonyCoordPointArrayList = new ArrayList(latDrawingLineNumber); + wireframeShapeForLatLineArray = new IWireframeShape[latDrawingLineNumber]; + + double latValue = -90; + for(int i=0; i(lonDrawingLineNumber); + wireframeShapeForLonLineArray = new IWireframeShape[lonDrawingLineNumber]; + + double startLonValue = (isCarrington?getCarrLonStartEndInterval()[0] : getStonyLonStartEndInterval()[0]); + double endLonValue = (isCarrington?getCarrLonStartEndInterval()[1] : getStonyLonStartEndInterval()[1]); + + double lonValue = startLonValue; + for (int i=0; i 180) + displayVal = displayVal - 360; + if (lonValue < -180) + displayVal = displayVal + 360; + + addLabelOnLatLonLine(wireframeShapeForLonLineArray[i], lonStonyCoordPointArrayList.get(i), pointIndexForAddingLabel + addToPoint, + String.valueOf(displayVal)); + + target.drawWireframeShape(wireframeShapeForLonLineArray[i], + new RGB(255, 0, 0), + 1.0f, + LineStyle.DEFAULT, labelFont); + lonValue += latLonInterval; + } + + + wireframeShapeForLonLineArray[0] = target.createWireframeShape(false, descriptor); + Coordinate[] latLonCoordArray = createCoordArrayForLonLine(imageDisplay, -90 + (isCarrington?crln:hgln), latLonDrawingPointInterval); + lonStonyCoordPointArrayList.add(latLonCoordArray); + wireframeShapeForLonLineArray[0].addLineSegment(latLonCoordArray); + wireframeShapeForLonLineArray[0].compile(); + target.drawWireframeShape(wireframeShapeForLonLineArray[0], + new RGB(255, 0, 0), + 1.0f, + LineStyle.DEFAULT); + + wireframeShapeForLonLineArray[0] = target.createWireframeShape(false, descriptor); + latLonCoordArray = createCoordArrayForLonLine(imageDisplay, 90+ (isCarrington?crln:hgln), latLonDrawingPointInterval); + lonStonyCoordPointArrayList.add(latLonCoordArray); + wireframeShapeForLonLineArray[0].addLineSegment(latLonCoordArray); + wireframeShapeForLonLineArray[0].compile(); + target.drawWireframeShape(wireframeShapeForLonLineArray[0], + new RGB(255, 0, 0), + 1.0f, + LineStyle.DEFAULT); + + } + private Coordinate[] createCoordArrayForLatLine(SolarImageDisplay imageDisplay, double latValue, double latLonPointInterval) throws VizException { + try { + + int coordArrayLength = (int)(180 / latLonPointInterval);// + 1; + Coordinate[] coordArray = new Coordinate[coordArrayLength]; + Coordinate[] coordPixelArray = new Coordinate[coordArrayLength]; + + double startLonValue = (isCarrington?getCarrLonForLatStartEndInterval()[0] : getStonyLonForLatStartEndInterval()[0]); + double endLonValue = (isCarrington?getCarrLonForLatStartEndInterval()[1] : getStonyLonForLatStartEndInterval()[1]); + + double lon = startLonValue; + + for(int i=0; i0 && latInterval<=180) { + latLineNumber = 180/latInterval; + } + return latLineNumber + 1; + } + + private int getLonDrawingLineNumber(int lonInterval) { + int lonLineNumber = 360/15; // set a default value + if(lonInterval>0 && lonInterval<=360) { + lonLineNumber = 360 / lonInterval; + if(lonLineNumber > 360) + lonLineNumber = 360; // if we draw 360 lines, the last line will overlap with the first line + } + return lonLineNumber + 1; + } + + private void addDefaultLabelByPointIndex(IWireframeShape wireframeShape, String labelValue, + Coordinate[] latLonCoordinateArray, int defaultPointIndex) throws TransformException { + double[] tmp = { latLonCoordinateArray[defaultPointIndex].x, latLonCoordinateArray[defaultPointIndex].y}; + double[] screenPixel = descriptor.worldToPixel(tmp);//new double[2]; + + if(screenPixel != null) + wireframeShape.addLabel(labelValue, screenPixel); + } + + private void addLabelOnLatLonLine( IWireframeShape wireframeShape, Coordinate[] coordinateArray, int coordiantePointIndex, String label) throws TransformException { + + if (coordiantePointIndex < 175) { + + double[] tmp = { coordinateArray[coordiantePointIndex].x, coordinateArray[coordiantePointIndex].y}; + double[] screenPixel = descriptor.worldToPixel(tmp);//new double[2]; + //imageDisplay.getWorldToPixel().transform(tmp, 0, screenPixel, 0, 1);//descriptor.worldToPixel(tmp); + if(screenPixel != null) { + wireframeShape.clearLabels(); + wireframeShape.addLabel(label, screenPixel); + } + } + } + + private int getPointLabelIndexForAddingLatLabel(Coordinate[] latLonCoordinateArray, + float zoomFactor, double minX, double maxX, double minY, double maxY) throws TransformException { + int pointIndex = -1; + if(latLonCoordinateArray == null || latLonCoordinateArray.length == 0) + return pointIndex; + + double positionOffset = 120; + for(int i=0; i (minX + adjustedOffset) && pixelValueArray[0] < maxX && + pixelValueArray[1] > minY && pixelValueArray[1] < maxY) { + if(Math.abs(pixelValueArray[0] - minX - (positionOffset * zoomFactor)) < delta) { + isPointForLabel = true; + } + } + } + return isPointForLabel; + } + + + private boolean isPointForPlacingLongituteLabel(double[] pixelValueArray, double positionOffset, float zoomFactor, + double minX, double maxX, double minY, double maxY) { + double delta = 200; + double adjustedOffset = positionOffset * zoomFactor; + boolean isPointForLabel = false; + if(pixelValueArray != null) { + if(pixelValueArray[0] > minX && pixelValueArray[0] < maxX && + pixelValueArray[1] > minY && pixelValueArray[1] < maxY) { + if(Math.abs(pixelValueArray[1] - maxY) < delta) { + isPointForLabel = true; + } + } + } + return isPointForLabel; + } + + private void updateEffectiveMinX(double mapMinXValue, double viewMinXValue, double viewMaxXValue) { + if(isLeftEdgeOfMapInsideCurrentView(mapMinXValue, viewMinXValue, viewMaxXValue)) { + effectiveMinX = mapMinXValue; + } + } + + private boolean isLeftEdgeOfMapInsideCurrentView(double minXOfMap, double minXOfCurrentView, double maxXOfCurrentView) { + boolean isInsideResult = false; + if(minXOfMap > minXOfCurrentView && minXOfMap < maxXOfCurrentView) + isInsideResult = true; + return isInsideResult; + } + + + private void updateEffectiveMaxY(double mapMaxYValue, double viewMinYValue, double viewMaxYValue) { + if(isBottomEdgeOfMapInsideCurrentView(mapMaxYValue, viewMinYValue, viewMaxYValue)) + effectiveMaxY = mapMaxYValue; + } + + private boolean isBottomEdgeOfMapInsideCurrentView(double maxYOfMap, double minYOfCurrentView, double maxYOfCurrentView) { + boolean isInsideResult = false; + if(maxYOfMap > minYOfCurrentView && maxYOfMap < maxYOfCurrentView) { + isInsideResult = true; + } + return isInsideResult; + } + + /* + * the getters for Map's Min and Max X and Y, View's Min and Max X and Y + */ + public double getViewMinX() { + return viewMinX; + } + + public double getViewMaxY() { + return viewMaxY; + } + + public double getViewMinY() { + return viewMinY; + } + + public double getViewMaxX() { + return viewMaxX; + } + + public double getMapMinX() { + return mapMinX; + } + + public double getMapMaxY() { + return mapMaxY; + } + + public double getMapMinY() { + return mapMinY; + } + + public double getMapMaxX() { + return mapMaxX; + } + + public double getEffectiveMinX() { + return effectiveMinX; + } + + public double getEffectiveMaxY() { + return effectiveMaxY; + } + + public double getEffectiveMinY() { + return effectiveMinY; + } + + public double getEffectiveMaxX() { + return effectiveMaxX; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/Sampling.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/Sampling.java new file mode 100644 index 0000000000..7f91dd85f7 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/Sampling.java @@ -0,0 +1,449 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.graphics.RGB; + +import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.viz.core.IExtent; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; +import com.raytheon.uf.viz.core.IGraphicsTarget.TextStyle; +import com.raytheon.uf.viz.core.IGraphicsTarget.VerticalAlignment; +import com.raytheon.uf.viz.core.drawables.AbstractRenderableDisplay; +import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.core.drawables.IFont; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ResourcePair; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource.ResourceStatus; +import com.raytheon.uf.viz.core.rsc.ResourceList; +import com.raytheon.uf.viz.core.rsc.ResourceProperties; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Sampling resource, draws sample text to the screen. also picks up mouse + * events + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer         Description
+ * ------------ ---------- -----------      --------------------------
+ * 02/21/2013   958        sgurung          Initial creation
+ * 
+ * 
+ * + * @author sgurung + * @version 1.0 + */ + +public class Sampling { + + /** + * The result of a hover operation: a set of strings and corresponding + * colors + * + */ + protected static class SampleResult { + + public SampleResult() { + + } + + public String[] labels; + + public RGB[] colors; + } + + private IFont hoverFont = null; + + private boolean errorInHovering = false; + + private VerticalAlignment verticalAlignment = VerticalAlignment.TOP; + + public Sampling() { + + } + + protected SampleResult doHover(ReferencedCoordinate coord, + ResourceList resources) throws VizException { + SampleResult result = new SampleResult(); + List labelList = new ArrayList(); + List colorList = new ArrayList(); + try { + int size = resources.size(); + for (int i = size - 1; i >= 0; --i) { + ResourcePair rp = resources.get(i); + String retVal = recursiveHoverSearch(rp, coord); + if (retVal != null && retVal.length() > 0) { + RGB color = null; + if (rp.getResource().hasCapability( + ColorableCapability.class)) { + color = rp.getResource() + .getCapability(ColorableCapability.class) + .getColor(); + } + int p1, p2; + p1 = 0; + while ((p2 = retVal.indexOf('\n', p1)) >= 0) { + colorList.add(color); + labelList.add(retVal.substring(p1, p2)); + p1 = p2 + 1; + } + String s = retVal.substring(p1); + if (s.length() > 0) { + colorList.add(color); + labelList.add(retVal.substring(p1)); + } + } + } + } catch (Throwable t) { + /*statusHandler.handle(Priority.PROBLEM, "Error sampling resources: " + + t.getLocalizedMessage(), t);*/ + } + + result.labels = labelList.toArray(new String[labelList.size()]); + result.colors = colorList.toArray(new RGB[colorList.size()]); + return result; + } + + private String recursiveHoverSearch(ResourcePair rp, + ReferencedCoordinate coordinate) throws VizException { + ResourceProperties props = rp.getProperties(); + AbstractVizResource rsc = rp.getResource(); + + if (rsc != null && rsc.getStatus() == ResourceStatus.INITIALIZED + && props.isVisible()) { + String curVal = rsc.inspect(coordinate); + + if (curVal != null && curVal.length() > 0) { + return curVal; + } + } + + return null; + } + + protected void paintResult(IGraphicsTarget target, IDescriptor descriptor, + PaintProperties paintProps, ReferencedCoordinate coord) throws VizException { + + hoverFont = target.initializeFont(target.getDefaultFont() + .getFontName(), 10, null); + hoverFont.setSmoothing(false); + hoverFont.setScaleFont(false); + + SampleResult result = doHover(coord, descriptor.getResourceList()); + + verticalAlignment = VerticalAlignment.TOP; + target.clearClippingPlane(); + try { + if (result != null) { + double[] world = new double[] { coord.getObject().x, + coord.getObject().y }; + double[] pixel = descriptor.worldToPixel(world); + Coordinate c = new Coordinate(pixel[0], pixel[1]); + int canvasWidth = paintProps.getCanvasBounds().width; + double extentWidth = paintProps.getView().getExtent() + .getWidth(); + double ratioX = canvasWidth / extentWidth; + + if (result.labels.length > 0) { + List strsToUse = new ArrayList(); + List colorsToUse = new ArrayList(); + HorizontalAlignment[] alignments = new HorizontalAlignment[result.labels.length]; + boolean[] modified = new boolean[result.labels.length]; + for (int i = 0; i < modified.length; ++i) { + modified[i] = false; + alignments[i] = HorizontalAlignment.LEFT; + String[] tmp = new String[] { result.labels[i], + result.labels[i] }; + strsToUse.add(tmp); + } + + adjustStrings(target, paintProps, strsToUse, modified, + alignments, c, ratioX, null); + + HorizontalAlignment horizontalAlignment = alignments[0]; + boolean good = true; + for (int i = 1; i < alignments.length && good; ++i) { + if (horizontalAlignment != alignments[i]) { + good = false; + } + } + + if (!good) { + // not all the same, figure out alignments!!! + int maxLen = 0; + int i = 0; + for (String[] s : strsToUse) { + if (s[0].length() > maxLen) { + maxLen = s[0].length(); + horizontalAlignment = alignments[i]; + } + ++i; + } + + adjustStrings(target, paintProps, strsToUse, modified, + alignments, c, ratioX, horizontalAlignment); + } + + List actualStrs = new ArrayList(); + for (int i = 0; i < strsToUse.size(); ++i) { + String[] strs = strsToUse.get(i); + for (int j = 1; j < strs.length; ++j) { + actualStrs.add(strs[j]); + colorsToUse.add(result.colors[i]); + } + } + + String[] newStrs = actualStrs.toArray(new String[actualStrs + .size()]); + + double referencePtY = adjustLabelWrapY( + target, + newStrs, + c.y + + ((AbstractRenderableDisplay.CURSOR_HEIGHT) / ratioX), + paintProps.getView().getExtent(), ratioX); + + if (horizontalAlignment == HorizontalAlignment.RIGHT) { + c.x -= (target.getStringBounds(hoverFont, newStrs, + TextStyle.BLANKED).getWidth() / ratioX); + } + + target.drawStrings(hoverFont, newStrs, c.x, referencePtY, + 0.0, IGraphicsTarget.TextStyle.BLANKED, + colorsToUse.toArray(new RGB[colorsToUse.size()]), + HorizontalAlignment.LEFT, verticalAlignment); + } + } + errorInHovering = false; + } catch (Exception e) { + if (errorInHovering) { + // Keep down the number of error messages + /* statusHandler.handle( + Priority.PROBLEM, + "Error painting sample text: " + + e.getLocalizedMessage(), e);*/ + } + errorInHovering = true; + } + } + + private void adjustStrings(IGraphicsTarget target, + PaintProperties paintProps, List strsToUse, + boolean[] modified, HorizontalAlignment[] alignments, Coordinate c, + double ratio, HorizontalAlignment targetAlignment) { + List strsToUseInternal = new ArrayList(); + for (int i = 0; i < strsToUse.size(); ++i) { + String str = strsToUse.get(i)[0]; + String[] split = str.split("[ ]"); + boolean done = false; + int divideBy = strsToUse.get(i).length - 1; + int maxDivisions = 0; + for (int j = 0; j < split.length; ++j) { + if (split[j].isEmpty() == false) { + ++maxDivisions; + } + } + + if (alignments[i] == targetAlignment) { + strsToUseInternal.add(strsToUse.get(i)); + } else { + String[] test = new String[] { str }; + while (!done) { + if (divideBy > maxDivisions + || alignments[i] == targetAlignment) { + done = true; + continue; + } + + int approxLenPerStr = str.length() / divideBy; + List strs = new ArrayList(); + + for (int j = 0; j < split.length;) { + String line = split[j++]; + while (j < split.length) { + String s = split[j]; + if (s.length() + line.length() <= approxLenPerStr) { + if (!s.isEmpty()){ + if (j == split.length -1 && split[1].equalsIgnoreCase("=")) + { + line = split[split.length-1]; + } + else + { + line += " " + s; + } + } else { + line += " "; + } + ++j; + } else { + break; + } + } + strs.add(line); + } + + test = strs.toArray(new String[strs.size()]); + + HorizontalAlignment alignment = adjustLabelWrapX(target, + test, c.x, paintProps.getView().getExtent(), ratio, + alignments[i]); + if (alignment == alignments[i] + && (targetAlignment == null || alignment == targetAlignment)) { + // the alignment was not changed and we are the target alignment, we are done + done = true; + } else { + if (targetAlignment == null) { + // alignment changed, check to see if it changes + // back + HorizontalAlignment tmpAlignment = alignment; + alignment = adjustLabelWrapX(target, test, c.x, + paintProps.getView().getExtent(), ratio, + alignment); + if (alignment != tmpAlignment) { + // we moved back, we need to divide and + // conquer + alignments[i] = HorizontalAlignment.LEFT; + modified[i] = true; + divideBy++; + } else { + // we are good at this alignment + alignments[i] = alignment; + done = true; + } + } else { + // we need to be the targetAlignment + alignment = adjustLabelWrapX(target, test, c.x, + paintProps.getView().getExtent(), ratio, + targetAlignment); + if (alignment == targetAlignment) { + // we are fine at other alignment also, use it: + alignments[i] = alignment; + done = true; + } else { + alignments[i] = targetAlignment; + modified[i] = true; + divideBy++; + } + } + } + } + + String[] addTo = new String[test.length + 1]; + addTo[0] = str; + for (int j = 0; j < test.length; ++j) { + addTo[j + 1] = test[j]; + } + + strsToUseInternal.add(addTo); + } + } + strsToUse.clear(); + strsToUse.addAll(strsToUseInternal); + } + + /** + * Adjusts the x label if the width of the longest label extends the extent + * + * @param target + * @param labels + * @param x + * @param extent + * @param ratio + * @return + */ + private HorizontalAlignment adjustLabelWrapX(IGraphicsTarget target, + String[] labels, double x, IExtent extent, double ratio, + HorizontalAlignment horizontalAlignment) { + double referencePoint = x; + + // Find the max width of the label in pixels + double maxWidth = 0; + IFont font = hoverFont; + for (String label : labels) { + Rectangle2D bounds = target.getStringBounds(font, label); + if (bounds.getWidth() > maxWidth) { + maxWidth = bounds.getWidth(); + } + } + + // Get the width in gl space + double widthInGl = maxWidth / ratio; + + if (horizontalAlignment == HorizontalAlignment.LEFT) { + // Check to see if text extends screen extent + if (referencePoint + widthInGl > extent.getMaxX()) { + horizontalAlignment = HorizontalAlignment.RIGHT; + } + } else { + // Check to see if text extends screen extent + if (referencePoint - widthInGl < extent.getMinX()) { + horizontalAlignment = HorizontalAlignment.LEFT; + } + } + + return horizontalAlignment; + } + + /** + * Adjusts the y label position if the stacked labels exceeds the screen + * extent height + * + * @param target + * @param labels + * @param y + * @param extent + * @param ratio + * @return + */ + private double adjustLabelWrapY(IGraphicsTarget target, String[] labels, + double y, IExtent extent, double ratio) { + double referencePoint = y; + + double totalHeight = target.getStringBounds(hoverFont, labels, + TextStyle.BLANKED).getHeight(); + + // convert to gl space + double maxHeightInGl = (totalHeight) / ratio; + + // check to see if height extends map height + if (referencePoint + maxHeightInGl > extent.getMaxY()) { + verticalAlignment = VerticalAlignment.BOTTOM; + referencePoint -= (AbstractRenderableDisplay.CURSOR_HEIGHT + 2) + / ratio; + } + + // return adjusted point + return referencePoint; + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageDisplay.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageDisplay.java new file mode 100644 index 0000000000..c80b7559d6 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageDisplay.java @@ -0,0 +1,335 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +import gov.noaa.nws.ncep.viz.rsc.solarimage.LogSolarImageDataCallback; +import gov.noaa.nws.ncep.viz.rsc.solarimage.SolarImageDataCallback; +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.HeaderData; +import gov.noaa.nws.ncep.viz.rsc.solarimage.wcs.CSConversions; +import gov.noaa.nws.ncep.viz.rsc.solarimage.wcs.WCSConverter; + +import java.awt.geom.AffineTransform; +import java.io.File; +import java.io.FileNotFoundException; +import java.text.DecimalFormat; +import java.util.LinkedHashMap; +import java.util.Map; + +import nom.tam.fits.Header; + +import org.geotools.coverage.grid.GeneralGridGeometry; +import org.geotools.referencing.operation.transform.AffineTransform2D; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.NoninvertibleTransformException; +import org.opengis.referencing.operation.TransformException; +import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.PixelCoverage; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.IImage; +import com.raytheon.uf.viz.core.drawables.IRenderable; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.xy.graph.GraphProperties; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer         Description
+ * ------------ ---------- -----------      --------------------------
+ * 02/21/2013   958        qzhou, sgurung   Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ + +public class SolarImageDisplay implements IRenderable { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(SolarImageDisplay.class); + + private IImage image = null; + + private float brightness = 1.0f; + + private float contrast = 1.0f; + + private boolean isInterpolated = true; + + private SolarImageRecord record; + + private SolarImageDataCallback dataCallback; + + private ColorMapParameters colorMapParameters; + + private GeneralGridGeometry gridGeom; + + private boolean logConvert; + + private WCSConverter transform; + + private PixelCoverage extent = null; + + private MathTransform worldToPixel; + + private MathTransform pixelToWorld; + + private HeaderData headerData; + private Header header; + + private int nx; + private int ny; + + private double scale; + private AffineTransform at; + + public CSConversions csConv; + + public SolarImageDisplay(SolarImageRecord record, ColorMapParameters cmp, + GeneralGridGeometry gridGeometry, boolean logConvert) throws VizException { + this.record = record; + this.colorMapParameters = cmp; + this.gridGeom = gridGeometry; + this.logConvert = logConvert; + if (this.logConvert) + dataCallback = new LogSolarImageDataCallback(record); + else + dataCallback = new SolarImageDataCallback(record); + + header = dataCallback.imgData.getHeader(); +// if (header == null) +// populateHeader(); + nx = dataCallback.imgData.getNx(); + ny = dataCallback.imgData.getNy(); + + headerData = new HeaderData(record); + csConv = new CSConversions(headerData); + (new HeaderData(record)).calculateRsun(); + + } + + @Override + public void paint(IGraphicsTarget target, PaintProperties paintProps) + throws VizException { + + if (image == null) { + // ColormappedRenderedImageCallback imageCallback = new + // ColormappedRenderedImageCallback(dataCallback, colorMapParameters); + // image = target.initializeRaster(imageCallback); + image = target.getExtension(IColormappedImageExtension.class) + .initializeRaster(dataCallback, colorMapParameters); + } + + if (transform == null || extent == null) { + try { + transform = new WCSConverter(header); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); + throw new VizException( + "Could not create image to world coordinate transform", + e); + } + + + double[] ll = transform.imageToWorld(new double[] { -0.5, -0.5 }); + + double[] lr = transform.imageToWorld(new double[] { + nx - 0.5, -0.5 }); + double[] ur = transform.imageToWorld(new double[] { + nx - 0.5, ny - 0.5 }); + double[] ul = transform.imageToWorld(new double[] { -0.5, + ny - 0.5 }); + + double minX = Math.min(ll[0], ul[0]); + double maxX = Math.max(lr[0], ur[0]); + double minY = Math.min(ll[1], lr[1]); + double maxY = Math.max(ul[1], ur[1]); + + if ((maxX - minX) > (maxY - minY)) { + scale = gridGeom.getEnvelope().getSpan(0) / (maxX - minX); + } else { + scale = gridGeom.getEnvelope().getSpan(1) / (maxY - minY); + } + + double[] center; + if (paintProps instanceof GraphProperties) { + center = ((GraphProperties) paintProps).getWorldExtent() + .getCenter(); + } else { + center = paintProps.getView().getExtent().getCenter(); + } + + center[0] = gridGeom.getEnvelope().getMedian(0); + center[1] = gridGeom.getEnvelope().getMedian(1); + + double[] llp = new double[2]; + double[] lrp = new double[2]; + double[] ulp = new double[2]; + double[] urp = new double[2]; + try { + at = AffineTransform.getTranslateInstance( + center[0], center[1]); + at.concatenate(AffineTransform.getScaleInstance(scale, -scale)); + worldToPixel = new AffineTransform2D(at); + // System.out.println(worldToPixel.toWKT()); + pixelToWorld = worldToPixel.inverse(); + // System.out.println(pixelToWorld.toWKT()); + + worldToPixel.transform(ll, 0, llp, 0, 1); + worldToPixel.transform(lr, 0, lrp, 0, 1); + worldToPixel.transform(ul, 0, ulp, 0, 1); + worldToPixel.transform(ur, 0, urp, 0, 1); + } catch (NoninvertibleTransformException e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); + throw new VizException( + "Could not create world to pixel coordinate transform", + e); + } catch (TransformException e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), + e); + throw new VizException( + "Could not create pixel extent for image", e); + } + + extent = new PixelCoverage(new Coordinate(ulp[0], ulp[1]), + new Coordinate(urp[0], urp[1]), new Coordinate(lrp[0], + lrp[1]), new Coordinate(llp[0], llp[1])); + + + } + image.setContrast(contrast); + image.setBrightness(brightness); + image.setInterpolated(isInterpolated); + target.drawRaster(image, extent, paintProps); + + + } + + public void dispose() { + + if (this.image != null) + this.image.dispose(); + } + + public Map interrogate(ReferencedCoordinate coord) + throws VizException { + + Map map = new LinkedHashMap(); + + try { + double[] pixel = new double[] { coord.asLatLon().x, + coord.asLatLon().y }; + + double[] world = new double[2]; + pixelToWorld.transform(pixel, 0, world, 0, 1); + //world = formatValue(world); + map.put("HCC", new Coordinate(formatValue(world[0]), formatValue(world[1])));//move down + + double image[] = transform.WorldToImage(world); + // remember that image was flipped during earlier and stored with first pixel as top left + image[1] = ny - 1 - image[1]; + map.put("Image", new Coordinate(formatValue(image[0]), formatValue(image[1]))); + + double[] locWorld = (new CSConversions(headerData)).heliocentricToHeliographic(world, false); + if (locWorld[0] > 180) + locWorld[0] = locWorld[0] - 360; + else if (locWorld[0] < -180) + locWorld[0] = locWorld[0] + 360; + map.put("StonyHurst", new Coordinate(formatValue(locWorld[0]), formatValue(locWorld[1]))); + + locWorld = (new CSConversions(headerData)).heliocentricToHeliographic(world, true); + if (locWorld[0] > 360) + locWorld[0] = locWorld[0] - 360; + else if (locWorld[0] < -360) + locWorld[0] = locWorld[0] + 360; + map.put("Carrington", new Coordinate(formatValue(locWorld[0]), formatValue(locWorld[1]))); + + long x = Math.round(image[0]); + long y = Math.round(image[1]); + double val = getImageValue((int) x, (int) y); + map.put("Display Value", new Double(formatValue(val))); + + map.put("Data Value", + new Double(formatValue(dataCallback.getOriginalValue(val)))); + + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); + } + + return map; + } + + public double formatValue(double val) { + + DecimalFormat df = new DecimalFormat("#.#####"); + double newVal = val; + try { + String valStr = df.format(val); + Double valDbl = Double.parseDouble(valStr); + newVal = valDbl; + } + catch (Exception e) { + return val; + } + + return newVal; + } + + public double getImageValue(int x, int y) { + double value = Float.NaN; + if (isInImageRange(x, y)) { + if (image instanceof IColormappedImage) { + value = ((IColormappedImage) image).getValue(x, y); + } + } + return value; + } + + private boolean isInImageRange(int x, int y) { + +// return (x >= 0) && (x < record.getNx()) && (y >= 0) +// && (y < record.getNy()); + return (x >= 0) && (x < nx) && (y >= 0) + && (y < ny); + } + + public void setBrightness(float brightness) { + this.brightness = brightness; + } + + public void setContrast(float contrast) { + this.contrast = contrast; + } + + public void setInterpolationState(boolean isInterpolated) { + this.isInterpolated = isInterpolated; + } + + public PixelCoverage getPixelCoverage() { + return extent; + } + + public MathTransform getWorldToPixel() { + return worldToPixel; + } + + public CSConversions getCSConversions() { + return csConv; + } + + public HeaderData getHeaderData() { + return headerData; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageInputAdapter.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageInputAdapter.java new file mode 100644 index 0000000000..7a9bad2086 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageInputAdapter.java @@ -0,0 +1,87 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + + +import org.eclipse.swt.widgets.Event; + +import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.viz.core.IDisplayPaneContainer; +import com.raytheon.viz.ui.input.InputAdapter; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * Default input handler for solar image sampling + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Feb 05, 2012 958        sgurung     Initial creation
+ * 
+ * 
+ * + * @author sgurung + * @version 1.0 + */ + +public class SolarImageInputAdapter extends + InputAdapter { + + private T resource; + + public SolarImageInputAdapter(T resource) { + this.resource = resource; + } + + @Override + public boolean handleMouseMove(int x, int y) { + IDisplayPaneContainer container = resource.getResourceContainer(); + Coordinate c = container.translateClick(x, y); + if (c != null) { + resource.sampleCoord = new ReferencedCoordinate(c); + } else { + resource.sampleCoord = null; + } + if (resource.isSampling()) { + resource.issueRefresh(); + } + return false; + } + + @Override + public boolean handleMouseDownMove(int x, int y, int mouseButton) { + return handleMouseMove(x, y); + } + + public boolean handleMouseExit(Event event) { + resource.sampleCoord = null; + if (resource.isSampling()) { + resource.issueRefresh(); + } + return false; + } + + public boolean handleMouseEnter(Event event) { + return handleMouseMove(event.x, event.y); + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResource.java new file mode 100644 index 0000000000..35232b3bb8 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResource.java @@ -0,0 +1,433 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +import gov.noaa.nws.ncep.viz.rsc.solarimage.actions.CarrLatLonCapability; +import gov.noaa.nws.ncep.viz.rsc.solarimage.actions.StonyLatLonCapability; +import gov.noaa.nws.ncep.viz.rsc.solarimage.display.SolarImageMatchCriteria; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; + +import org.eclipse.swt.graphics.RGB; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.operation.TransformException; + +import com.raytheon.uf.common.colormap.ColorMap; +import com.raytheon.uf.common.colormap.IColorMap; +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.geospatial.ReferencedCoordinate; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.IDisplayPaneContainer; +import com.raytheon.uf.viz.core.IGraphicsTarget; +import com.raytheon.uf.viz.core.drawables.ColorMapLoader; +import com.raytheon.uf.viz.core.drawables.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.PaintProperties; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.uf.viz.core.rsc.IInputHandler; +import com.raytheon.uf.viz.core.rsc.IResourceDataChanged; +import com.raytheon.uf.viz.core.rsc.LoadProperties; +import com.raytheon.uf.viz.core.rsc.IInputHandler.InputPriority; +import com.raytheon.uf.viz.core.rsc.capabilities.Capabilities; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; +import com.raytheon.uf.viz.core.style.DataMappingPreferences; +import com.raytheon.uf.viz.core.style.LabelingPreferences; +import com.raytheon.uf.viz.core.style.MatchCriteria; +import com.raytheon.uf.viz.core.style.StyleManager; +import com.raytheon.uf.viz.core.style.StyleRule; +import com.raytheon.uf.viz.xy.graph.XyGraphDescriptor; +import com.raytheon.viz.core.style.image.DataScale; +import com.raytheon.viz.core.style.image.DataScale.Type; +import com.raytheon.viz.core.style.image.ImagePreferences; +import com.vividsolutions.jts.geom.Coordinate; + +/** + * The resource class for Solar Image. + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer         Description
+ * ------------ ---------- -----------      --------------------------
+ * 02/21/2013   958        qzhou, sgurung   Initial creation
+ * 
+ * 
+ * + * @author qzhou, sgurung + * @version 1.0 + */ + +public class SolarImageResource extends + AbstractVizResource implements + IResourceDataChanged { + private static final transient IUFStatusHandler statusHandler = UFStatus + .getHandler(SolarImageResource.class); + + private static final String DATE_TIME_FORMAT = "yyMMdd/HHmm"; + + private static final SimpleDateFormat sdf = new SimpleDateFormat( + DATE_TIME_FORMAT); + + private ColorMapParameters colorMapParams; + + private DataTime displayedDateTime; + + private HashMap imageDisplayMap; + + private boolean log10scale = false; + + public boolean isCarrington; + //sampling + boolean sampling = false; + + private Sampling samplingRsc; + + private IInputHandler inputAdapter = getSolarImageInputHandler(); + + protected ReferencedCoordinate sampleCoord; + + protected static class SampleResult { + + public SampleResult() { + } + + public String[] labels; + public RGB[] colors; + } + + protected boolean displayLatLonOverlay = false; + + private LatLonOverlay latLonOverlay; + + protected SolarImageResource(SolarImageResourceData resourceData, + LoadProperties loadProperties) { + super(resourceData, loadProperties); + resourceData.addChangeListener(this); + imageDisplayMap = new HashMap(); + samplingRsc = new Sampling(); + System.out.println("isCarrington = " +isCarrington); + + getCapabilities().addCapability(CarrLatLonCapability.class); + getCapabilities().addCapability(StonyLatLonCapability.class); + } + + @Override + protected void disposeInternal() { + IDisplayPaneContainer container = getResourceContainer(); + if (container != null) { + container.unregisterMouseHandler(inputAdapter); + } + + for (SolarImageDisplay idisplay : imageDisplayMap.values()) { + if (idisplay != null) + idisplay.dispose(); + } + imageDisplayMap.clear(); + } + + @Override + protected void paintInternal(IGraphicsTarget target, + PaintProperties paintProps) throws VizException { + + displayedDateTime = paintProps.getDataTime(); + + SolarImageRecord record = resourceData.dataObjectMap.get(displayedDateTime); + + if (record == null) { + // Don't have data for this frame + return; + } + + SolarImageDisplay imageDisplay = imageDisplayMap.get(displayedDateTime); + + if (imageDisplay == null) { + + imageDisplay = new SolarImageDisplay(record, colorMapParams, + descriptor.getGridGeometry(), log10scale); + imageDisplayMap.put(displayedDateTime, imageDisplay); + } + + if (hasCapability(ImagingCapability.class)) { + ImagingCapability imaging = getCapability(ImagingCapability.class); + imageDisplay.setBrightness(imaging.getBrightness()); + imageDisplay.setContrast(imaging.getContrast()); + imageDisplay.setInterpolationState(imaging.isInterpolationState()); + } + + imageDisplay.paint(target, paintProps); + + if (isSampling()) { + samplingRsc.paintResult(target, descriptor, paintProps, sampleCoord); + } + + if (isLatLonOverlayOn()) { + int latLonInterval = 0; + if (isCarrington) + latLonInterval = Integer.parseInt(getCapabilities().getCapability(resourceData, + CarrLatLonCapability.class).getInterval()); + else + latLonInterval = Integer.parseInt(getCapabilities().getCapability(resourceData, + StonyLatLonCapability.class).getInterval()); + + latLonOverlay = new LatLonOverlay(imageDisplay, descriptor, latLonInterval, paintProps, isCarrington); + + try { + latLonOverlay.drawLatLines(target); + latLonOverlay.drawLonLines(target); + } catch (TransformException e) { + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); + } + } + + } + + public boolean isLatLonOverlayOn() { + return displayLatLonOverlay; + } + + public void setLatLonOverlay(boolean latLon) { + this.displayLatLonOverlay = latLon; + } + + + @Override + protected void initInternal(IGraphicsTarget target) throws VizException { + // TODO Auto-generated method stub + + String colormapfile = null; + DataMappingPreferences dataMap = null; + DataScale scale = null; + LabelingPreferences labelPrefs = null; + + colorMapParams = getCapability(ColorMapCapability.class) + .getColorMapParameters(); + + MatchCriteria criteria = SolarImageMatchCriteria + .constructFromResourceData(resourceData); + StyleRule sr = StyleManager.getInstance().getStyleRule( + StyleManager.StyleType.IMAGERY, criteria); + if (sr != null) { + colormapfile = ((ImagePreferences) sr.getPreferences()) + .getDefaultColormap(); + scale = ((ImagePreferences) sr.getPreferences()).getDataScale(); + dataMap = ((ImagePreferences) sr.getPreferences()).getDataMapping(); + labelPrefs = ((ImagePreferences) sr.getPreferences()) + .getColorbarLabeling(); + } + if (colormapfile == null) { + colormapfile = colorMapParams.getColorMapName(); + if (colormapfile == null) + colormapfile = "solar/Gray"; + } + + IColorMap cxml = ColorMapLoader.loadColorMap(colormapfile); + ColorMap colorMap = new ColorMap(colormapfile, (ColorMap) cxml); + colorMapParams.setColorMap(colorMap); + + if (dataMap != null) + colorMapParams.setDataMapping(dataMap); + + if (labelPrefs != null && labelPrefs.getValues() != null) + colorMapParams.setColorBarIntervals(labelPrefs.getValues()); + + if (scale != null) { + colorMapParams.setColorMapMin(scale.getMinValue().floatValue()); + colorMapParams.setColorMapMax(scale.getMaxValue().floatValue()); + colorMapParams.setDataMin(scale.getMinValue().floatValue()); + colorMapParams.setDataMax(scale.getMaxValue().floatValue()); + log10scale = true; + if (scale.getScaleType() != null + && scale.getScaleType() == Type.LINEAR) + log10scale = false; + } else { + colorMapParams.setColorMapMin(0.0f); + colorMapParams.setColorMapMax(5.0f); + colorMapParams.setDataMin(0.0f); + colorMapParams.setDataMax(5.0f); + log10scale = true; + } + + if (descriptor.getRenderableDisplay().getContainer().getDisplayPanes().length > 1) + descriptor.getTimeMatcher().redoTimeMatching(descriptor); + + IDisplayPaneContainer container = getResourceContainer(); + if (container != null) { + container + .registerMouseHandler(inputAdapter, InputPriority.RESOURCE); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#getName() + */ + @Override + public String getName() { + SolarImageRecord rec = resourceData.dataObjectMap.get(displayedDateTime); + if (rec == null) + return super.getName() + " -No Data"; + // String dateTime = sdf.format(rec.getObservationTime().getTime()); + String dateTime = null; + if (displayedDateTime == null) { + dateTime = super.getName() + " -No Data"; + } else { + sdf.setTimeZone(TimeZone.getTimeZone("GMT")); + dateTime = sdf.format(displayedDateTime.getRefTime()); + } + + return super.getName() +" "+ getLegend(rec) + " " + dateTime; + + } + private String getLegend(SolarImageRecord record) { + String legendStr = ""; + String instru = record.getInstrument(); + if (instru.equalsIgnoreCase("NA")) + instru = ""; + else if (instru.startsWith("AIA")) + instru = "AIA"; + + String wave = record.getWavelength(); + if (wave.equalsIgnoreCase("NA")) + wave = ""; + + String inttime = ""; + Double intTime = record.getIntTime(); + if ( record.getSatellite().startsWith("GOES")) + inttime = intTime.toString(); + + String site = record.getSite(); + if (site.equalsIgnoreCase("NA") || site.length() ==0) + site = ""; + + legendStr = record.getSatellite() + " " + (instru=="" ?"" :instru+" ") + + (site=="" ?"" :site+" ") + (wave=="" ?"" :wave+" ") + inttime; + + return legendStr; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.AbstractVizResource#inspect(com.raytheon + * .uf.common.geospatial.ReferencedCoordinate) + */ + @Override + public String inspect(ReferencedCoordinate coord) throws VizException { + if (coord == null) + return "No Data"; + + StringBuilder sb = new StringBuilder(); + try { + + SolarImageDisplay imageDisplay = imageDisplayMap + .get(displayedDateTime); + + sb.append("Pixel: "); + + double[] coordDbl = new double[2]; + coordDbl[0] = imageDisplay.formatValue(coord.asLatLon().x); + coordDbl[1] = imageDisplay.formatValue(coord.asLatLon().y); + //sb.append(coord.asLatLon().toString()); + sb.append((new Coordinate(coordDbl[0], coordDbl[1])).toString()); + sb.append('\n'); + + Map map = imageDisplay.interrogate(coord); + + for (Map.Entry item : map.entrySet()) { + sb.append(item.getKey() + ": "); + sb.append(item.getValue().toString()); + sb.append('\n'); + } + + return sb.toString(); + } catch (TransformException e) { + // TODO Auto-generated catch block. Please revise as appropriate. + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); + } catch (FactoryException e) { + // TODO Auto-generated catch block. Please revise as appropriate. + statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e); + } + return "No Data"; + } + + @Override + public void resourceChanged(ChangeType type, Object object) { + if (type.equals(ChangeType.DATA_UPDATE)) { + PluginDataObject[] pdos = (PluginDataObject[]) object; + for (PluginDataObject pdo : pdos) { + try { + SolarImageRecord solarimagerec = (SolarImageRecord) pdo; + resourceData.dataObjectMap.put(solarimagerec.getDataTime(), + solarimagerec); + } catch (Exception e) { + statusHandler.handle(Priority.PROBLEM, + "Error updating Solar Image resource", e); + } + } + } + issueRefresh(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.uf.viz.core.rsc.AbstractVizResource#remove(com.raytheon. + * uf.common.time.DataTime) + */ + @Override + public void remove(DataTime dataTime) { + System.out.println("REMOVING: " + dataTime); + super.remove(dataTime); + SolarImageDisplay display = this.imageDisplayMap.remove(dataTime); + if (display != null) { + display.dispose(); + } + } + + /** + * Get and load the style rule + * + * @return + */ + // public SolarImageImageMatchCriteria getMatchCriteria() { + // + // RequestConstraint rc = resourceData.getMetadataMap().get("wavelength"); + // String wavelen = rc.getConstraintValue(); + // rc = resourceData.getMetadataMap().get("intTime"); + // String inttime = rc.getConstraintValue(); + // + // SolarImageMatchCriteria match = new SolarImageMatchCriteria(); + // match.setWavelength(wavelen); + // match.setIntTime(inttime); + // return match; + // } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.rsc.sampling.ISamplingResource#isSampling() + */ + + public IInputHandler getSolarImageInputHandler() { + return new SolarImageInputAdapter(this); + } + + public boolean isSampling() { + return sampling; + } + + public void setSampling(boolean sampling) { + this.sampling = sampling; + } + + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResourceData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResourceData.java new file mode 100644 index 0000000000..1b51002388 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/rsc/SolarImageResourceData.java @@ -0,0 +1,124 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.rsc; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +//import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsRequestableResourceData; +//import gov.noaa.nws.ncep.viz.resources.AbstractNatlCntrsRequestableResourceData; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + +import com.raytheon.uf.common.dataplugin.PluginDataObject; +import com.raytheon.uf.common.datastorage.DataStoreFactory; +import com.raytheon.uf.common.datastorage.IDataStore; +import com.raytheon.uf.common.time.DataTime; +import com.raytheon.uf.viz.core.HDF5Util; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.uf.viz.core.rsc.AbstractNameGenerator; +import com.raytheon.uf.viz.core.rsc.AbstractRequestableResourceData; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.uf.viz.core.rsc.LoadProperties; + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "SolarImageResourceData") +public class SolarImageResourceData extends AbstractRequestableResourceData { + + public Map dataObjectMap; + + private static String GOESSXI = "SXI-FM3"; + + private static String LASCO = "LASCO"; + + private static String STEREO = "SECCHI"; + + public SolarImageResourceData() { + + super(); + this.nameGenerator = new AbstractNameGenerator() { + + @Override + public String getName(AbstractVizResource resource) { + + try { + if (metadataMap.get("telescope").getConstraintValue() + .equals("NSO-GONG")) { + return "H-alpha NSO/GONG"; + } + + String instr = metadataMap.get("instrument") + .getConstraintValue(); + + SolarImageRecord solarimagerec = null; + for (SolarImageRecord rec : dataObjectMap.values()) { + solarimagerec = rec; + break; + } + StringBuilder sb = new StringBuilder(); + sb.append(solarimagerec.getSatellite() + " "); + sb.append(solarimagerec.getInstrument() + " "); + + sb.append(solarimagerec.getWavelength() + " "); + + if (instr.equals(STEREO) || instr.equals(LASCO)) { + ; + } else { + sb.append(solarimagerec.getWavelength() + " "); + } + + if (instr.equals(GOESSXI)) + sb.append(solarimagerec.getIntTime() + "s"); + return sb.toString(); + } catch (Exception e) { + return ""; + } + } + + }; + } + + @Override + protected AbstractVizResource constructResource( + LoadProperties loadProperties, PluginDataObject[] objects) + throws VizException { + + dataObjectMap = new HashMap(); + System.out.println("Cconstructing dataObjectMap"); + for (PluginDataObject pdo : objects) { + if (pdo instanceof SolarImageRecord) { + System.out.println("GOT:::::::::: " + pdo.getDataTime()); + dataObjectMap.put(pdo.getDataTime(), (SolarImageRecord) pdo); + } + } + return new SolarImageResource(this, loadProperties); + } + + public SolarImageRecord populateRecord(SolarImageRecord record) { + IDataStore dataStore = getDataStore(record); + record.retrieveFromDataStore(dataStore); + return record; + } + + private IDataStore getDataStore(SolarImageRecord record) { + IDataStore dataStore = null; + // try { + // Map vals = new HashMap(); + // vals.put("dataURI", record.getDataURI()); + // vals.put("pluginName", record.getPluginName()); + + // record = (SolarImageRecord) Loader.loadData(vals); + + File loc = HDF5Util.findHDF5Location(record); + dataStore = DataStoreFactory.getDataStore(loc); + + // } catch (VizException e) { + // e.printStackTrace(); + // } + + return dataStore; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/HeaderData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/HeaderData.java new file mode 100644 index 0000000000..e03d0fa48d --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/HeaderData.java @@ -0,0 +1,399 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.util; + +import com.raytheon.uf.viz.core.exception.VizException; + +import nom.tam.fits.BasicHDU; +import nom.tam.fits.Header; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +/** + * Represents the image data of a SolarImageRecord object. + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 02/22/2012   958        qzhou       Initial creation.
+ * 
+ * + * @author qzhou + * @version 1.0 + */ +public class HeaderData { + private Header header; + private int nx; + private int ny; + private int dim; + private double hgln; //_OBS + private double hglt; + private double crln; + private double crlt; + //private double hcit, hcix, haex, haey, heex, heey, heqx, heqy,; + private double rsun; //AIA + private double dsun; //distance between the observer and sun image, ~D0 + private double carRot; // + private double solarB0; + private double solarL0; + + /** + * @param record + */ + public HeaderData(SolarImageRecord record) throws VizException { + + try { + BasicHDU hdu = SolarImageUtil.getImageHDU(record); + + if (hdu != null) { + int[] axes = hdu.getAxes(); + + if (axes != null && axes.length != 2) { + // Expecting 2 dimensional image at this time + throw new VizException( + "The record does not contain a 2 dimensional image."); + } + + this.header = hdu.getHeader(); + this.nx = axes[1]; + this.ny = axes[0]; + this.dim = header.getIntValue("NAXIS"); + this.hgln = header.getDoubleValue("HGLN_OBS", 0.0); + this.hglt = header.getDoubleValue("HGLT_OBS", 0.0); + this.crln = header.getDoubleValue("CRLN_OBS", 0.0); + this.crlt = header.getDoubleValue("CRLT_OBS", 0.0); + this.dsun = header.getDoubleValue("DSUN_OBS", 1392000000); + this.carRot = header.getDoubleValue("CAR_ROT", 0.0); + this.solarB0 = header.getDoubleValue("SOLAR-B0", 0.0); + this.solarL0 = header.getDoubleValue("SOLAR-L0", 0.0); + } + + } + catch (Exception e) { + throw new VizException("Error getting SolarImageData from SolarImageRecord."); + } + + } + + /** + * @return the nx + */ + public int getNx() { + return nx; + } + + /** + * @param nx + * the nx to set + */ + public void setNx(int nx) { + this.nx = nx; + } + + /** + * @return the ny + */ + public int getNy() { + return ny; + } + + /** + * @param ny + * the ny to set + */ + public void setNy(int ny) { + this.ny = ny; + } + + /** + * @return the dim + */ + public int getDim() { + return dim; + } + + /** + * @param dim + * the dim to set + */ + public void setDim(int dim) { + this.dim = dim; + } + + /** + * @return the hgln + */ + public double getHgln() { + return hgln; + } + + /** + * @param hgln + * the hgln to set + */ + public void setHgln(double hgln) { + this.hgln = hgln; + } + + /** + * @return the hgln + */ + public double getHglt() { + return this.hglt; + } + + /** + * @param hglt + * the hglt to set + */ + public void setHglt(double hglt) { + this.hglt = hglt; + } + + /** + * @return the crln + */ + public double getCrln() { + return this.crln; + } + + /** + * @param crln + * the crln to set + */ + public void setCrln(double crln) { + this.crln = crln; + } + + /** + * @return the crlt + */ + public double getCrlt() { + return this.crlt; + } + + /** + * @param crlt + * the crlt to set + */ + public void setCrlt(double crlt) { + this.crlt = crlt; + } + + /** + * @return the dsun + */ + public double getDsun() { + return dsun; + } + + /** + * @param dsun + * the dsun to set + */ + public void setDsun(double dsun) { + this.dsun = dsun; + } + + /** + * @return the header + */ + public double getSolarB0() { + return solarB0; + } + + /** + * @return the header + */ + public double getSolarL0() { + return solarL0; + } + + /** + * @return the rsun + */ + public double getRsun() { + rsun = 0.0; + if (header.getStringValue("TELESCOP").startsWith("SDO")) + rsun = header.getDoubleValue("RSUN_OBS"); + else if (header.getStringValue("TELESCOP").startsWith("STEREO")) + rsun = header.getDoubleValue("RSUN"); + else if (header.getStringValue("TELESCOP").startsWith("SOHO") + && header.getStringValue("INSTRUME").startsWith("EIT")) + rsun = header.getDoubleValue("SOLAR_R") * header.getDoubleValue("CDELT1"); + else if (header.getStringValue("TELESCOP").startsWith("NSO")) + rsun = header.getDoubleValue("RADIUS", header.getDoubleValue("SOLAR-R")); + else if (header.getStringValue("TELESCOP").startsWith("GOES")) + rsun = calculateRsun(); + + return rsun; + } + + /** + * @param rsun + * the rsun to set?? + */ + public void setRsun(double rsun) { + this.rsun = rsun; + } + + /** + * @return the rsun + */ + public double getCarRot() { + return carRot; + } + /** + * @param rsun + * the rsun to set?? + */ + public void setCarRot(double carRot) { + this.carRot = carRot; + } + + /** + * @return the rsun + */ + public double getJulianDate() { + String date = ""; //'2012/03/07T17:34:57.160' + int y=0, m = 0, d = 0, hh = 0, mm = 0, ss = 0; + double jd = 0.0; + date = header.getStringValue("DATE_OBS"); + if (date == null || date.equalsIgnoreCase("")) + date = header.getStringValue("DATE-OBS"); + + if (date != null && date.length() <= 10 ) //LASCO dateObs=Date +Time + date = date + "T" + header.getStringValue("TIME-OBS"); + + y = Integer.valueOf(date.substring(0,4)); + m = Integer.valueOf(date.substring(5,7)); + d = Integer.valueOf(date.substring(8,10)); + hh = Integer.valueOf(date.substring(11,13)); + mm = Integer.valueOf(date.substring(14,16)); + ss = Integer.valueOf(date.substring(17,19)); + double msec = hh*3600*1000 +mm*60*1000 +ss*1000; + + jd = 367*y-7*(y+(m+9)/12)/4-3*((y+(m-9)/7)/100+1)/4 +275*m/9+d+1721029 -0.5 + msec/86400000; + //System.out.println("****jd " +jd +" "+m +" "+d +" "+hh +" "+mm+" "+ss); + + return jd; + } + + public double calculateRsun() { + double jd = 0.0, t = 0.0; + jd = getJulianDate(); + + //Julian Centuries from 1900.0: + t = (jd - 2415020)/36525; + + //Carrington Rotation Number: + double carr = (1./27.2753)*(jd-2398167.0) + 1.0; + //System.out.println("***carr "+carr); + //OLD = 349.03 - (360.* carr / 27.2753), + //Fit#1 = f + X/g + a*SIN(2*π*X/e) + b*SIN(4*π*X/e) + h*SIN(6*π*X/e) + // + c*COS(2*π*X/e) + d*COS(4*π*X/e) + i*COS(6*π*X/e) + + + + //Geometric Mean Longitude (deg): + double mnl = 279.69668 + 36000.76892*t + 0.0003025*t*t; + mnl = mnl % 360; + + //Mean anomaly (deg): + double mna = 358.47583 + 35999.04975*t - 0.000150*t*t - 0.0000033*t*t*t; + mna = mna % 360; + + //Eccentricity of orbit: + double e = 0.01675104 - 0.0000418*t - 0.000000126*t*t; + + //Sun's equation of center (deg): + double c = (1.919460 - 0.004789*t - 0.000014*t*t)* Math.sin(Math.toRadians(mna)) + + (0.020094 - 0.000100*t)* Math.sin(Math.toRadians(2*mna)) + + 0.000293 * Math.sin(Math.toRadians(3*mna)); + +// Sun's true geometric longitude (deg) +// (Refered to the mean equinox of date. Question: Should the higher +// accuracy terms from which app_long is derived be added to true_long?) +// true_long = (mnl + c) mod 360d0 + + //Sun's true anomaly (deg): + double ta = (mna + c) % 360; + + //Sun's radius vector (AU). There are a set of higher accuracy + //terms not included here. The values calculated here agree with the example in the book: + double dist = 1.0000002*(1.0 - e*e)/(1.0 + e* Math.cos(Math.toRadians(ta))); + + //Semidiameter (arc sec): + double sd = 959.63/dist; + //System.out.println("****sd " +sd ); + + return sd; + } + + public double[] getL0B0() { + double L0 = 0.0; + double jd = getJulianDate(); + + double radian = 180/Math.PI; + double theta = (jd-2398220)*360/25.38; + double inc = 7.25/radian; + double k = (73.6667+1.3958333*(jd-2396758)/36525)/radian; + + double t = (jd-2451545)/36525; + L0 = 280.46645+36000.76983*t+0.0003032*t*t; + + double M = 357.52910+35999.05030*t-0.0001559*t*t-0.00000048*t*t*t; + double Mr = M/radian; + double C = (1.914600-0.004817*t-0.000014*t*t)*Math.sin(Mr)+(0.019993-0.000101*t)*Math.sin(2*Mr)+0.000290*Math.sin(3*Mr); + double sunL = L0+C; + + double omega = 125.04-1934.136*t; + double lngtd = sunL-0.00569-0.00478*Math.sin(omega/radian); + double lngtdr = lngtd/radian; + double diffk = (lngtdr-k); + + double etay = -Math.sin(diffk)*Math.cos(inc); + double etax = -Math.cos(diffk); + double eta = (Math.atan2(etay,etax))*radian; + + double B0r =Math.asin( Math.sin(diffk)*Math.sin(inc)); //central latitude + double B0 = B0r*radian; + + L0 = eta - theta; + L0 = truncate(L0); + + double[] L0B0 = new double[2]; + L0B0[0] = L0; + L0B0[1] = B0; + return L0B0; + + } + + public double truncate(double angle) { + double n = Math.floor(angle/360); + double tangle = angle-n*360; + return tangle; + } + + public boolean isStereo() { + + if (header.getStringValue("TELESCOP").startsWith("STEREO")) + return true; + + return false; + } + + /** + * @return the header + */ + public Header getHeader() { + return header; + } + + /** + * @param header + * the header to set + */ + public void setHeader(Header header) { + this.header = header; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/ImageData.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/ImageData.java new file mode 100644 index 0000000000..f28bf095d3 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/ImageData.java @@ -0,0 +1,233 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.util; + +import com.raytheon.uf.viz.core.exception.VizException; + +import nom.tam.fits.BasicHDU; +import nom.tam.fits.Header; +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; +/** + * Represents the image data of a SolarImageRecord object. + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer          Description
+ * ------------ ---------- --------------    --------------------------
+ * 02/07/2013   958        sgurung, qzhou    Initial creation.
+ * 
+ * + * @author sgurung, qzhou + * @version 1.0 + */ +public class ImageData { + + private int nx; + private int ny; + + private int bitpix; + private double bscale; + private double bzero; + + private float[] imageValues; + private float[][] imageArrays; + private Header header; + + /** + * @param record + */ + public ImageData(SolarImageRecord record) throws VizException { + + try { + BasicHDU hdu = SolarImageUtil.getImageHDU(record); + + if (hdu != null) { + int[] axes = hdu.getAxes(); + + if (axes != null && axes.length != 2) { + // Expecting 2 dimensional image at this time + throw new VizException( + "The record does not contain a 2 dimensional image."); + } + + this.header = hdu.getHeader(); + this.nx = axes[1]; + this.ny = axes[0]; + this.bitpix = hdu.getBitPix(); + this.bscale = hdu.getBScale(); + this.bzero = hdu.getBZero(); + + Object imgData = hdu.getKernel(); + + float[][] array = null; + if (imgData instanceof float[][]) { + array = (float[][]) imgData; + } else if (imgData instanceof int[][]) { + array = new float[ny][nx]; + int[][] tmp = (int[][]) imgData; + for (int i = 0; i < ny; i++) { + for (int j = 0; j < nx; j++) { + array[i][j] = (float) (bscale * tmp[i][j] + bzero); + } + } + + } else if (imgData instanceof short[][]) { + array = new float[ny][nx]; + short[][] tmp = (short[][]) imgData; + for (int i = 0; i < ny; i++) { + for (int j = 0; j < nx; j++) { + array[i][j] = (float) (bscale * tmp[i][j] + bzero); + } + } + } else if (imgData instanceof byte[][]) { + array = new float[ny][nx]; + byte[][] tmp = (byte[][]) imgData; + for (int i = 0; i < ny; i++) { + for (int j = 0; j < nx; j++) { + array[i][j] = (float) (bscale * tmp[i][j] + bzero); + } + } + } else { + String msg = "SolarImageData: Unrecognized imgDatatype: " + + imgData.getClass().getCanonicalName(); + throw new VizException(msg); + } + + int n = 0; + float[] imgDataRec = new float[nx * ny]; + for (int i = ny - 1; i >= 0; i--) { // Reverse order of rows + for (int j = 0; j < nx; j++) { + imgDataRec[n++] = array[i][j]; + } + } + + this.imageValues = imgDataRec; + this.imageArrays = array; + } + } + catch (Exception e) { + throw new VizException("Error getting SolarImageData from SolarImageRecord."); + } + + } + + /** + * @return the nx + */ + public int getNx() { + return nx; + } + + /** + * @param nx + * the nx to set + */ + public void setNx(int nx) { + this.nx = nx; + } + + /** + * @return the ny + */ + public int getNy() { + return ny; + } + + /** + * @param ny + * the ny to set + */ + public void setNy(int ny) { + this.ny = ny; + } + + /** + * @return the bitpix + */ + public int getBitpix() { + return bitpix; + } + + /** + * @param bitpix + * the bitpix to set + */ + public void setBitpix(int bitpix) { + this.bitpix = bitpix; + } + + /** + * @return the bscale + */ + public double getBscale() { + return bscale; + } + + /** + * @param bscale + * the bscale to set + */ + public void setBscale(double bscale) { + this.bscale = bscale; + } + + /** + * @return the bzero + */ + public double getBzero() { + return bzero; + } + + /** + * @param bzero + * the bzero to set + */ + public void setBzero(double bzero) { + this.bzero = bzero; + } + + + /** + * @return the imageValues + */ + public float[] getImageValues() { + return imageValues; + } + + /** + * @param imageValues + * the imageValues to set + */ + public void setImageValues(float[] imageValues) { + this.imageValues = imageValues; + } + + /** + * @return the imageValues + */ + public float[][] getImageArrays() { + return imageArrays; + } + + /** + * @param imageValues + * the imageValues to set + */ + public void setImageArrays(float[][] imageArrays) { + this.imageArrays = imageArrays; + } + + /** + * @return the header + */ + public Header getHeader() { + return header; + } + + /** + * @param header + * the header to set + */ + public void setHeader(Header header) { + this.header = header; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImagePreferences.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImagePreferences.java new file mode 100644 index 0000000000..ef55220218 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImagePreferences.java @@ -0,0 +1,56 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.util; + +/** + * Represents the image data of a SolarImageRecord object. + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * 02/22/2012   958        qzhou       Initial creation.
+ * 
+ * + * @author qzhou + * @version 1.0 + */ + +import gov.noaa.nws.ncep.viz.common.Activator; + +import org.eclipse.jface.preference.FieldEditor; +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.IntegerFieldEditor; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +public class SolarImagePreferences extends FieldEditorPreferencePage implements + IWorkbenchPreferencePage{ + + public final static String NUM_FRAMES = "NUM_FRAMES"; + + public final static int DEFAULT_NUM_FRAMES = 27; + + public SolarImagePreferences() { + super(GRID); + setPreferenceStore(Activator.getDefault().getPreferenceStore()); + setDescription("Define the maximum number of frames to select"); + } + + @Override + public void init(IWorkbench workbench) { + // TODO Auto-generated method stub + + } + + @Override + protected void createFieldEditors() { + + FieldEditor editor = new IntegerFieldEditor( NUM_FRAMES, + "&Maximum Number of Frames:", getFieldEditorParent(), 3) ; + + this.addField(editor ); + + if (getPreferenceStore().getInt(NUM_FRAMES) == 0) + getPreferenceStore().setDefault(NUM_FRAMES, DEFAULT_NUM_FRAMES); + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImageUtil.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImageUtil.java new file mode 100644 index 0000000000..bf8359c6e7 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/util/SolarImageUtil.java @@ -0,0 +1,86 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.util; + +import gov.noaa.nws.ncep.common.dataplugin.solarimage.SolarImageRecord; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Calendar; + +import com.raytheon.uf.common.datastorage.DataStoreFactory; +import com.raytheon.uf.common.datastorage.IDataStore; +import com.raytheon.uf.common.datastorage.StorageException; +import com.raytheon.uf.viz.core.HDF5Util; + +import nom.tam.fits.BasicHDU; +import nom.tam.fits.Fits; +import nom.tam.fits.FitsException; +/** + * Provides utility methods to get data from hdf5 and convert it to Fits format. + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer        Description
+ * ------------ ---------- --------------- --------------------------
+ * 01/08/2013   958        sgurung, qzhou  Initial creation.
+ * 
+ * 
+ * + * @author qzhou + * @version 1.0 + */ +public class SolarImageUtil { + + public static void populateRawData(SolarImageRecord record) throws FileNotFoundException, + StorageException { + File loc = HDF5Util.findHDF5Location(record); + + //Long t0 = System.currentTimeMillis(); + IDataStore dataStore = DataStoreFactory.getDataStore(loc); + + //System.out.println("--- solarimage: time to get datastore: " + (System.currentTimeMillis() - t0)); + //t0 = System.currentTimeMillis(); + record.retrieveFromDataStore(dataStore); + //System.out.println("--- solarimage: time to retrieve from datastore: " + (System.currentTimeMillis() - t0)); + } + + public static Fits convertToFits(SolarImageRecord record) throws Exception { + + populateRawData(record); + if (record.getRawData() != null) { + try{ + Fits fits = new Fits(new ByteArrayInputStream(record.getRawData())); + + return fits; + } + catch (Exception e) { + System.out.println("Error converting SolarImageRecord to Fits: " + e.getMessage()); + } + } + + return null; + + } + + public static BasicHDU getImageHDU(SolarImageRecord record) throws Exception { + + Fits fits = convertToFits(record); + + if (fits != null) { + try { + return fits.getHDU(record.getImageHDUNum()); + + } catch (FitsException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + } + + return null; + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/CSConversions.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/CSConversions.java new file mode 100644 index 0000000000..369d59b6a9 --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/CSConversions.java @@ -0,0 +1,151 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.wcs; + +import gov.noaa.nws.ncep.viz.rsc.solarimage.util.HeaderData; + +/** + * Provides utility methods for Coordinate conversions. + * + *
+ * SOFTWARE HISTORY
+ * Date         Ticket#    Engineer        Description
+ * ------------ ---------- --------------- --------------------------
+ * 02/21/2013   958        qzhou, sgurung   Initial creation.
+ * 
+ * 
+ * + * @author qzhou + * @version 1.0 + */ + + +public class CSConversions { + private int dim = 0; + public HeaderData headerData; + + public CSConversions(HeaderData headerData) { + + this.headerData = headerData; + dim = headerData.getDim(); + + } + + public double[] heliocentricToHeliographic(double[] cs, boolean isCarrington) { + + /* + Equations used: + r2= x2 + y 2 + z2 , + Θ = sin−1 ((y cos B0 + z sin B0 )/r), + Φ = Φ0 + arg(z cos B0 − y sin B0 , x), Where arg( x, y) = tan−1 (y/ x) .*/ + + double[] helio = new double[dim]; + double r = headerData.getRsun(); + + double z = (double) Math.sqrt(r*r -cs[0]*cs[0] -cs[1]*cs[1]); + double b0 = headerData.getHglt(); + double a0 = headerData.getHgln(); + double crln = headerData.getCrln(); + double L0 = 0.0; + + if (!headerData.isStereo()) { + b0 = headerData.getL0B0()[1]; + } + + if (isCarrington) { + + if (!headerData.isStereo()) { + L0 = headerData.getL0B0()[0]; + } + else { + L0 = crln - a0; + } + } + //System.out.println(" heliocentricToHeliographic() *** L0 = " +L0 +" crln = "+ crln+" b0 = "+ b0); + double temp = (double) ((cs[1] * Math.cos(Math.toRadians(b0)) + z * Math.sin(Math.toRadians(b0)) )/ r); + helio[1] = (double) Math.asin(temp); + helio[1] = Math.toDegrees(helio[1]); + + temp = (double) ((cs[0]) / ( z * Math.cos(Math.toRadians(b0)) - cs[1] * Math.sin(Math.toRadians(b0)) )); + helio[0] = (double) (Math.toRadians(a0) + Math.atan(temp)); + helio[0] = Math.toDegrees(helio[0]) + L0; + + return helio; + } + + public double[] heliographicToHeliocentric(double[] cs, boolean isCarrington) { + + /* + Equations used: + centric[0] = r cos Θ sin(Φ − Φ0 ), + centric[1] = r[sin Θ cos B0 − cos Θ cos(Φ − Φ0 ) sin B0 ], + z = r[sin Θ sin B0 + cos Θ cos(Φ − Φ0 ) cos B0 ], */ + + double[] centric = new double[dim]; + double r = headerData.getRsun(); + double b0 = headerData.getHglt(); + double a0 = headerData.getHgln(); + double crln = headerData.getCrln(); + double L0 = 0.0; + + if (!headerData.isStereo()) { + b0 = -headerData.getL0B0()[1]; + } + + if (isCarrington) { + + if (!headerData.isStereo()) { + L0 = headerData.getL0B0()[0]; + } + else { + L0 = crln - a0; + } + + cs[0] = cs[0] - L0; //change to stony + } + + //System.out.println(" heliographicToHeliocentric() *** L0 = " +L0 +" crln = "+ crln+" b0 = "+ b0 + " B0 = " + headerData.getL0B0()[1]); + centric[0] = r* Math.cos(Math.toRadians( cs[1])) * Math.sin(Math.toRadians( cs[0]-a0)); + centric[1] = r* ( Math.sin(Math.toRadians( cs[1])) *Math.cos(Math.toRadians(b0)) - Math.cos(Math.toRadians( cs[1]))*Math.cos(Math.toRadians(cs[0]-a0))*Math.sin(Math.toRadians(b0) )); + + return centric; + } + + public double[] helioprojectiveToHeliocentric(double[] cs) { + /* + Equations used: + z = D − d cos θy cos θ x , + x = D ( PI/180) θ x, (approximate) + y = D ( PI/180) θ y.*/ + + double[] centric = new double[dim]; + double d = headerData.getDsun(); + centric[0] = (double) (d * Math.cos( Math.toRadians( cs[1]/3600)) * Math.sin( Math.toRadians( cs[0]/3600))); + centric[1] = (double) (d * Math.sin( Math.toRadians( cs[1]/3600))); + + return centric; + } + + public double[] heliocentricToHelioprojective(double[] cs) { + + /* + Equations used: + d= x2 + y2 + (D − z)2 , + θ x = arg(D − z, x), + θy = sin−1 (y/d). */ + + double[] projective = new double[dim]; + double d = headerData.getDsun(); + double d0 = (double) Math.sqrt(d*d -cs[0]*cs[0] -cs[1]*cs[1]); + projective[0] = Math.atan(cs[0] / d0); + projective[1] = (double) Math.asin(cs[1] / d); + projective[0] = Math.toDegrees(projective[0]); + projective[1] = Math.toDegrees(projective[1]); + + return projective; + } + + public HeaderData getHeaderData() { + + return headerData; + + } +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/WCSConverter.java b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/WCSConverter.java new file mode 100644 index 0000000000..5b9699f92a --- /dev/null +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.solarimage/src/gov/noaa/nws/ncep/viz/rsc/solarimage/wcs/WCSConverter.java @@ -0,0 +1,272 @@ +package gov.noaa.nws.ncep.viz.rsc.solarimage.wcs; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import nom.tam.fits.Header; +import nom.tam.fits.TruncatedFileException; +import nom.tam.util.BufferedDataInputStream; + +/** + * Provides methods for fits wcs transformation. + * + *
+ * 
+ *  SOFTWARE HISTORY
+ * 
+ *  Date         Ticket#    Engineer    Description
+ *  ------------ ---------- ----------  --------------------------
+ *                             
+ *  02/14/2013   #958       q.zhou      Convert original fits to wcs format.  
+ *  									Convert pixel to real world coordinates
+ *                                         
+ * 
+ * + * @author q.zhou + * @version 2 + */ +public class WCSConverter { + + private Header header; + + private int dim = 0; + + private double[] crpix; + + private double[] cdelt; + + private double[] crval; + + private double[] crota; + private double a = 0.0; + + private double[][] pc; + + private double[][] cd; + + private double[][] pv; + + private double[][] pcInv, cdInv, pvInv; + + //private double[][] m, mInv; + + /** + * @param header + */ + public WCSConverter(Header header) { + this.header = header; + init(); + } + + public WCSConverter(byte[] data) throws TruncatedFileException, + IOException { + ByteArrayInputStream bis = new ByteArrayInputStream(data); + BufferedDataInputStream stream = new BufferedDataInputStream(bis); + this.header = new Header(stream); + init(); + } + + /* + * Initialize and Convert original fits to wcs + */ + private void init() { + dim = header.getIntValue("NAXIS"); + crpix = new double[dim]; + cdelt = new double[dim]; + crval = new double[dim]; + crota = new double[dim]; + pc = new double[dim][dim]; + cd = new double[dim][dim]; + pcInv = new double[dim][dim]; + cdInv = new double[dim][dim]; + + for (int n = 0; n < dim; n++) { + String ij = Integer.toString(n + 1); + crpix[n] = header.getDoubleValue("CRPIX" + ij, 0.0); //if null, 0.0 + cdelt[n] = header.getDoubleValue("CDELT" + ij, 1.0); + crval[n] = header.getDoubleValue("CRVAL" + ij, 0.0); + crota[n] = header.getDoubleValue("CROTA" + ij, 0.0); + } + + + for (int m = 0; m < dim; m++) { + String i = Integer.toString(m + 1); + for (int n = 0; n < dim; n++) { + String j = Integer.toString(n + 1); + pc[m][n] = header.getDoubleValue("PC" +i +"_" +j, 0.0); + cd[m][n] = header.getDoubleValue("CD" +i +"_" +j, 0.0); + pcInv[m][n] = pc[m][n]; + cdInv[m][n] = cd[m][n]; + } + } + + // Convert original to pc. Do not convert original fits to cd. + if (!header.containsKey("PC1_1") && !header.containsKey("CD1_1")) { + if ( crota[1] != 0.0) + a = crota[1]; + else if ( crota[0] != 0.0) + a = crota[0]; + + if (dim == 2 ) { + for (int i = 0; i < dim; i++) { + for (int j = 0; j < dim; j++) { + if (i == j) { + pc[i][j] = Math.cos(Math.toRadians( a)); + } + else if (i < j) { + pc[i][j] = (-Math.sin(Math.toRadians( a))) * cdelt[1]/cdelt[0]; + } + else if (i > j) { + pc[i][j] = (Math.sin(Math.toRadians( a))) * cdelt[0]/cdelt[1]; + } + } + } + } + } + + // inverse + if (dim == 2 ) { + for (int i = 0; i < dim; i++) { + for (int j = 0; j < dim; j++) { + if (i == j) { + pcInv[i][j] = pc[i][j]; + cdInv[i][j] = cd[i][j]; + } + else { + pcInv[i][j] = -pc[i][j]; + cdInv[i][j] = -cd[i][j]; + } + } + } + } + + //System.out.println("here "+ pc[0][0] +" "+pc[0][1]+" " +pcInv[0][0] +" "+pcInv[0][1]+" "); +// dim = header.getIntValue("NAXIS"); +// crpix = new double[dim]; +// cdelt = new double[dim]; +// crval = new double[dim]; +// crota = new double[dim]; +// for (int n = 0; n < dim; n++) { +// String ij = Integer.toString(n + 1); +// crpix[n] = header.getDoubleValue("CRPIX" + ij, 0.0); +// cdelt[n] = header.getDoubleValue("CDELT" + ij, 1.0); +// crval[n] = header.getDoubleValue("CRVAL" + ij, 0.0); +// crota[n] = header.getDoubleValue("CROTA" + ij, 0.0); +// } +// +// /* Set up rotation matrix (and its inverse) */ +// m = new double[dim][dim]; +// mInv = new double[dim][dim]; +// if (dim == 2 && header.containsKey("CROTA1")) { +// double sine = Math.sin(Math.toRadians(crota[0])); +// double cosine = Math.cos(Math.toRadians(crota[0])); +// m[0][0] = cosine; +// m[0][1] = -sine; +// m[1][0] = sine; +// m[1][1] = cosine; +// mInv[0][0] = cosine; +// mInv[0][1] = sine; +// mInv[1][0] = -sine; +// mInv[1][1] = cosine; +// } else { +// for (int i = 0; i < dim; i++) { +// for (int j = 0; j < dim; j++) { +// if (i == j) +// m[i][j] = 1.0; +// else +// m[i][j] = 0.0; +// } +// } +// mInv = m; +// } + } + + public double[] imageToWorld(double[] image) { + double[] cs = new double[dim]; + double[] tmp = new double[dim]; + + for (int j = 0; j < dim; j++) { + cs[j] = image[j] - crpix[j]; + } +// double x = crval[0] + cdelt[0] * (pc[0][0] * cs[0] + pc[0][1] * cs[1]); +// double y = crval[1] + cdelt[1] * (pc[1][0] * cs[0] + pc[1][1] * cs[1]); + for (int i = 0; i < dim; i++) { + tmp[i] = 0.0; + for (int j = 0; j < dim; j++) { + if (dim == 2 && header.containsKey("PC1_1")) + tmp[i] += pc[i][j] * cs[j] * cdelt[i]; + else if (dim == 2 && header.containsKey("CD1_1")) + tmp[i] += cd[i][j] * cs[j]; + else + tmp[i] += pc[i][j] * cs[j] * cdelt[i]; + } + } + + for (int i = 0; i < dim; i++) { + cs[i] = tmp[i]; + cs[i] += crval[i]; + } + //System.out.println("***xy "+ x +" "+ y); + //System.out.println("***cs "+ cs[0] +" "+cs[1]); + + return cs; + +// double[] wcs = new double[dim]; +// double[] tmp = new double[dim]; +// for (int j = 0; j < dim; j++) { +// System.out.println("***imgOrig "+ image[0] +" "+image[1]); +// wcs[j] = image[j] - crpix[j]; +// } +// for (int i = 0; i < dim; i++) { +// tmp[i] = 0.0; +// for (int j = 0; j < dim; j++) { +// tmp[i] += m[i][j] * wcs[j]; +// } +// } +// for (int i = 0; i < dim; i++) { +// wcs[i] = cdelt[i] * tmp[i]; +// wcs[i] += crval[i]; +// } +// System.out.println("***wcs "+ wcs[0] +" "+wcs[1]); +// return wcs; + } + + public double[] WorldToImage(double[] cs) { + double[] image = new double[dim]; + double[] tmp = new double[dim]; + for (int i = 0; i < dim; i++) { + image[i] = (cs[i] - crval[i]); // / cdelt[i]; + } + + for (int i = 0; i < dim; i++) { + tmp[i] = 0.0; + for (int j = 0; j < dim; j++) { + if (dim == 2 && header.containsKey("PC1_1")) + tmp[i] += pcInv[i][j] * image[j] / cdelt[i]; + else if (dim == 2 && header.containsKey("CD1_1")) + tmp[i] += cdInv[i][j] * image[j]; + else + tmp[i] += pcInv[i][j] * image[j] / cdelt[i]; + } + } + + for (int j = 0; j < dim; j++) { + image[j] = tmp[j] + crpix[j]; + } + + +// for (int i = 0; i < dim; i++) { +// tmp[i] = 0.0; +// for (int j = 0; j < dim; j++) { +// tmp[i] += mInv[i][j] * image[j]; +// } +// } +// for (int j = 0; j < dim; j++) { +// image[j] = tmp[j] + crpix[j]; +// } + + //System.out.println("******image "+ image[0] +" "+image[1]); + return image; + } + +} diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmQueryResult.java b/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmQueryResult.java index 66afca67b6..c718be9e5a 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmQueryResult.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmQueryResult.java @@ -8,7 +8,6 @@ package gov.noaa.nws.ncep.viz.rsc.wstm.rsc; -import java.math.BigDecimal; import java.util.*; import java.util.logging.*; @@ -29,7 +28,9 @@ import gov.noaa.nws.ncep.common.dataplugin.aww.AwwFips; * ------------ ---------- ----------- -------------------------- * 2011-10-03 456 G. Zhang Initial creation. * 2011-12-21 581 B. Hebbard Fix attempted cast of BigDecimal to Double (for LatLon) (TTR#319) - * + * 2013-01-31 976 Archana Updated the queryPrefix string to include the 'name' field. + * Updated populateFipsMap() to use the 'name' field if the 'shortname' field + * is null * * * @author gzhang @@ -50,7 +51,7 @@ public class WstmQueryResult { private StringBuilder query = new StringBuilder(); - private String queryPrefix = "select AsBinary(the_geom), AsBinary(the_geom_0_001), lat,lon,state_zone,shortname from mapdata.zone where "; + private String queryPrefix = "select AsBinary(the_geom), AsBinary(the_geom_0_001), lat,lon,state_zone, shortname, name from mapdata.zone where "; private Map fipsNameMap = new HashMap(); private Map fipsLatLonMap = new HashMap(); @@ -115,8 +116,13 @@ public class WstmQueryResult { */ for(Object[] o : results){ - if( o==null || o.length!=6 || o[2]==null || o[3]==null || o[4]==null || o[5]==null) + if( o==null || o.length!=7 || o[2]==null || o[3]==null || o[4]==null ) continue; + if ( o[5] == null ){ + if (o[6] == null){ + continue; //continue only if both the shortname as well as the name column is null + } + } //geometry ArrayList obs = new ArrayList(); @@ -129,7 +135,12 @@ public class WstmQueryResult { continue; //zone name - String name = (String)o[5]; + String name; + if ( o[5] != null ){ + name = (String)o[5]; + }else{ + name = (String)o[6]; + } //put Z back as in PAZ008 String key = fips.substring(0,2)+"Z"+fips.substring(2); diff --git a/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmResource.java b/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmResource.java index e928978afd..ea7565e720 100644 --- a/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmResource.java +++ b/ncep/gov.noaa.nws.ncep.viz.rsc.wstm/src/gov/noaa/nws/ncep/viz/rsc/wstm/rsc/WstmResource.java @@ -23,6 +23,7 @@ import java.awt.Color; import org.eclipse.swt.graphics.RGB; +import com.raytheon.uf.viz.core.DrawableString; import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget.HorizontalAlignment; import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle; @@ -81,6 +82,8 @@ import com.vividsolutions.jts.io.ParseException; * 16 Feb 2012 555 S. Gurung Added call to setAllFramesAsPopulated() in queryRecords(). * 05/23/2012 785 Q. Zhou Added getName for legend. * 17 Aug 2012 655 B. Hebbard Added paintProps as parameter to IDisplayable draw + * 31-Jan-2013 976 Archana Updated paintFrame() to not render any null strings + * Replaced the depreciated target.drawString() method with target.drawStrings(). * * * @author archana @@ -222,10 +225,12 @@ implements INatlCntrsResource{ } if ( wstmRscAttr != null && wstmRscAttr.getEventEnable()){ + RGB colorOfEventRGB = wstmRscAttr.getColorOfEvent(); + Color colorOfEvent = new Color( colorOfEventRGB.red, + colorOfEventRGB.green, + colorOfEventRGB.blue); - Color[] symbolColor = {new Color(wstmRscAttr.getColorOfEvent().red, - wstmRscAttr.getColorOfEvent().green, - wstmRscAttr.getColorOfEvent().blue)}; + Color[] symbolColor = {colorOfEvent }; /*Retrieve the FIPS zones (names and centroid) to be rendered for the current WstmRscDataObject*/ List listOfFipsInfo = eachWstmRscDataObject.aListOfFipsInfoObjects; @@ -244,9 +249,18 @@ LatLonPoint thisPoint = wqr.getLatLonPoint(eachFipsInfo.getFipsCode());//eachFi pixCoord = new PixelCoordinate(descriptor .worldToPixel(worldC)); pixCoord.addToY(offsetY*1.75); - target.drawString(font, eachWstmRscDataObject.validTimePeriod, pixCoord.getX(), pixCoord.getY(), 0.0, - TextStyle.NORMAL, wstmRscAttr.getColorOfEvent(),HorizontalAlignment.LEFT, - VerticalAlignment.TOP, 0.0); + if ( eachWstmRscDataObject.validTimePeriod != null ){ + + DrawableString validTimePeriodString = new DrawableString(eachWstmRscDataObject.validTimePeriod,colorOfEventRGB); + validTimePeriodString.setCoordinates(pixCoord.getX(), pixCoord.getY()); + validTimePeriodString.textStyle = TextStyle.NORMAL; + validTimePeriodString.horizontalAlignment = HorizontalAlignment.LEFT; + validTimePeriodString.verticallAlignment = VerticalAlignment.TOP; + target.drawStrings(validTimePeriodString); +// target.drawString(font, eachWstmRscDataObject.validTimePeriod, pixCoord.getX(), pixCoord.getY(), 0.0, +// TextStyle.NORMAL, wstmRscAttr.getColorOfEvent(),HorizontalAlignment.LEFT, +// VerticalAlignment.TOP, 0.0); + } } } @@ -266,9 +280,18 @@ LatLonPoint thisPoint = wqr.getLatLonPoint(eachFipsInfo.getFipsCode());//eachFi } } - target.drawString(font, wqr.getZoneName(eachFipsInfo.getFipsCode())/*eachFipsInfo.getZoneName()*/, pixCoord.getX(), pixCoord.getY(), 0.0, - TextStyle.NORMAL, wstmRscAttr.getColorOfEvent(),HorizontalAlignment.LEFT, - VerticalAlignment.TOP, 0.0); + String zoneName = wqr.getZoneName(eachFipsInfo.getFipsCode()); + if ( zoneName != null ){ + DrawableString zoneNameString = new DrawableString(zoneName,colorOfEventRGB); + zoneNameString.setCoordinates(pixCoord.getX(), pixCoord.getY()); + zoneNameString.textStyle = TextStyle.NORMAL; + zoneNameString.horizontalAlignment = HorizontalAlignment.LEFT; + zoneNameString.verticallAlignment = VerticalAlignment.TOP; + target.drawStrings(zoneNameString); +// target.drawString(font, wqr.getZoneName(eachFipsInfo.getFipsCode())/*eachFipsInfo.getZoneName()*/, pixCoord.getX(), pixCoord.getY(), 0.0, +// TextStyle.NORMAL, wstmRscAttr.getColorOfEvent(),HorizontalAlignment.LEFT, +// VerticalAlignment.TOP, 0.0); + } } /*If the outline flag is enabled draw the outline else plot the marker at the centroid of the zone's area*/ diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/META-INF/MANIFEST.MF b/ncep/gov.noaa.nws.ncep.viz.tools/META-INF/MANIFEST.MF index b388631a92..2ca9a448bd 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/META-INF/MANIFEST.MF +++ b/ncep/gov.noaa.nws.ncep.viz.tools/META-INF/MANIFEST.MF @@ -48,6 +48,7 @@ Export-Package: gov.noaa.nws.ncep.viz.tools, gov.noaa.nws.ncep.viz.tools.panZoom, gov.noaa.nws.ncep.viz.tools.predefinedArea Bundle-ClassPath: . -Import-Package: gov.noaa.nws.ncep.common.log.logger, +Import-Package: com.raytheon.uf.viz.xy, + gov.noaa.nws.ncep.common.log.logger, gov.noaa.nws.ncep.edex.common.ncinventory, gov.noaa.nws.ncep.viz.gempak.grid.inv diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/CombinedFrameTool.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/CombinedFrameTool.java index 4f7c9f171b..cb3a20ff13 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/CombinedFrameTool.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/CombinedFrameTool.java @@ -2,13 +2,15 @@ package gov.noaa.nws.ncep.viz.tools.loopManagement; import gov.noaa.nws.ncep.viz.common.AbstractNcEditor; -import gov.noaa.nws.ncep.viz.ui.display.NCMapEditor; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.commands.ICommandService; import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.drawables.IDescriptor; +import com.raytheon.uf.viz.xy.VizXyEditor; +import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.tools.AbstractTool; /** @@ -24,6 +26,7 @@ import com.raytheon.viz.ui.tools.AbstractTool; * Oct 10, 2009 169 Greg Hull Check for time synced multipanes * Sept 28, 2010 317 Xilin Guo Create Loop Management and copy it from dwellRate. Remove dwellRate * 07/15/11 C Chen fix looping buttons not coordinated issue. Clean up code. + * 02/13/13 958 S. Gurung Added temporary code (for solar image display) to refresh GUI elements for editor of type VizXyEditor * * * @@ -64,7 +67,30 @@ public class CombinedFrameTool extends AbstractTool { AbstractNcEditor e = (AbstractNcEditor)editor; e.refreshGUIElements(); } + /* temporary code (added to make the step forward/backward buttons work for solar image display) */ + else if (editor != null && editor instanceof VizXyEditor) { + refreshGUIElements((AbstractEditor)editor); + } return null; } + + public void refreshGUIElements(AbstractEditor editor) { + ICommandService service = (ICommandService) editor.getSite().getService( + ICommandService.class); + + String[] guiUpdateElementCommands = { + // "gov.noaa.nws.ncep.viz.tools.pan", + "gov.noaa.nws.ncep.viz.ui.options.SyncPanes", + "gov.noaa.nws.ncep.viz.ui.actions.loopBackward", + "gov.noaa.nws.ncep.viz.ui.actions.loopForward", + "gov.noaa.nws.ncep.viz.ui.actions.rock", + "gov.noaa.nws.ncep.viz.ui.actions.frameTool", + "gov.noaa.nws.ncep.viz.ui.autoUpdate", + "gov.noaa.nws.ncep.viz.ui.actions.hideFrames" }; + // Update the GUI elements on the menus and toolbars + for (String toolbarID : guiUpdateElementCommands) { + service.refreshElements(toolbarID, null); + } + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopBackwardAction.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopBackwardAction.java index 322a400cb1..3047c326cf 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopBackwardAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopBackwardAction.java @@ -7,9 +7,11 @@ import java.util.Map; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.menus.UIElement; import com.raytheon.uf.viz.core.datastructure.LoopProperties; import com.raytheon.uf.viz.core.datastructure.LoopProperties.LoopMode; +import com.raytheon.uf.viz.xy.VizXyEditor; import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.tools.AbstractTool; @@ -26,6 +28,7 @@ import com.raytheon.viz.ui.tools.AbstractTool; * add codes to check Loop Stop. * 03/07/11 migration G. Hull use NCLoopProperties * 07/15/11 C Chen fix looping buttons not coordinated issue. Clean up code. + * 02/13/13 958 S. Gurung Added temporary code (for solar image display) to refresh GUI elements for editor of type VizXyEditor * * * @@ -88,6 +91,10 @@ public class LoopBackwardAction extends AbstractTool { AbstractNcEditor e = (AbstractNcEditor)editor; e.refreshGUIElements(); } + /* temporary code (added to make the looping work for solar image display) */ + else if (editor != null && editor instanceof VizXyEditor) { + refreshGUIElements((AbstractEditor)editor); + } return null; } @@ -108,4 +115,22 @@ public class LoopBackwardAction extends AbstractTool { } } + public void refreshGUIElements(AbstractEditor editor) { + ICommandService service = (ICommandService) editor.getSite().getService( + ICommandService.class); + + String[] guiUpdateElementCommands = { + // "gov.noaa.nws.ncep.viz.tools.pan", + "gov.noaa.nws.ncep.viz.ui.options.SyncPanes", + "gov.noaa.nws.ncep.viz.ui.actions.loopBackward", + "gov.noaa.nws.ncep.viz.ui.actions.loopForward", + "gov.noaa.nws.ncep.viz.ui.actions.rock", + "gov.noaa.nws.ncep.viz.ui.actions.frameTool", + "gov.noaa.nws.ncep.viz.ui.autoUpdate", + "gov.noaa.nws.ncep.viz.ui.actions.hideFrames" }; + // Update the GUI elements on the menus and toolbars + for (String toolbarID : guiUpdateElementCommands) { + service.refreshElements(toolbarID, null); + } + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopForwardAction.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopForwardAction.java index c9e8427a76..0885e51708 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopForwardAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopForwardAction.java @@ -7,6 +7,7 @@ import java.util.Map; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.menus.UIElement; import com.raytheon.uf.viz.core.datastructure.LoopProperties; @@ -14,6 +15,7 @@ import com.raytheon.uf.viz.core.datastructure.LoopProperties.LoopMode; import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.tools.AbstractTool; +import com.raytheon.uf.viz.xy.VizXyEditor; /** * Activate forward looping. @@ -27,6 +29,7 @@ import com.raytheon.viz.ui.tools.AbstractTool; * add codes to check Loop Stop. * 03/07/11 migration G. Hull use NCLoopProperties * 07/15/11 C Chen fix looping buttons not coordinated issue. Clean up code. + * 02/13/13 958 S. Gurung Added temporary code (for solar image display) to refresh GUI elements for editor of type VizXyEditor * * * @@ -88,6 +91,11 @@ public class LoopForwardAction extends AbstractTool { AbstractNcEditor e = (AbstractNcEditor)editor; e.refreshGUIElements(); } + /* temporary code (added to make the looping work for solar image display) */ + else if (editor != null && editor instanceof VizXyEditor) { + refreshGUIElements((AbstractEditor)editor); + } + return null; } @@ -101,7 +109,7 @@ public class LoopForwardAction extends AbstractTool { */ @Override public void updateElement(UIElement element, Map parameters) { - //System.out.println("LoopForwardAction updateElement entered"); + AbstractEditor editor = EditorUtil.getActiveEditorAs(AbstractEditor.class); if (editor != null) { this.editor = editor; @@ -110,5 +118,23 @@ public class LoopForwardAction extends AbstractTool { } } + public void refreshGUIElements(AbstractEditor editor) { + ICommandService service = (ICommandService) editor.getSite().getService( + ICommandService.class); + + String[] guiUpdateElementCommands = { + // "gov.noaa.nws.ncep.viz.tools.pan", + "gov.noaa.nws.ncep.viz.ui.options.SyncPanes", + "gov.noaa.nws.ncep.viz.ui.actions.loopBackward", + "gov.noaa.nws.ncep.viz.ui.actions.loopForward", + "gov.noaa.nws.ncep.viz.ui.actions.rock", + "gov.noaa.nws.ncep.viz.ui.actions.frameTool", + "gov.noaa.nws.ncep.viz.ui.autoUpdate", + "gov.noaa.nws.ncep.viz.ui.actions.hideFrames" }; + // Update the GUI elements on the menus and toolbars + for (String toolbarID : guiUpdateElementCommands) { + service.refreshElements(toolbarID, null); + } + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopRockAction.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopRockAction.java index cdc3811b22..cd9b33ec7c 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopRockAction.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/loopManagement/LoopRockAction.java @@ -7,6 +7,7 @@ import java.util.Map; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.menus.UIElement; import com.raytheon.uf.viz.core.datastructure.LoopProperties; @@ -14,6 +15,7 @@ import com.raytheon.uf.viz.core.datastructure.LoopProperties.LoopMode; import com.raytheon.viz.ui.EditorUtil; import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.tools.AbstractTool; +import com.raytheon.uf.viz.xy.VizXyEditor; /** * Activate rock looping. @@ -27,7 +29,7 @@ import com.raytheon.viz.ui.tools.AbstractTool; * add codes to check Loop Stop. * 03/07/11 migration G. Hull use NCLoopProperties * 07/15/11 C Chen fix looping buttons not coordinated issue. Clean up code. - * + * 02/13/13 958 S. Gurung Added temporary code (for solar image display) to refresh GUI elements for editor of type VizXyEditor * * * @author mli @@ -93,6 +95,10 @@ public class LoopRockAction extends AbstractTool { AbstractNcEditor e = (AbstractNcEditor)editor; e.refreshGUIElements(); } + /* temporary code (added to make the looping work for solar image display) */ + else if (editor != null && editor instanceof VizXyEditor) { + refreshGUIElements((AbstractEditor)editor); + } return null; } @@ -114,6 +120,23 @@ public class LoopRockAction extends AbstractTool { } } + public void refreshGUIElements(AbstractEditor editor) { + ICommandService service = (ICommandService) editor.getSite().getService( + ICommandService.class); + String[] guiUpdateElementCommands = { + // "gov.noaa.nws.ncep.viz.tools.pan", + "gov.noaa.nws.ncep.viz.ui.options.SyncPanes", + "gov.noaa.nws.ncep.viz.ui.actions.loopBackward", + "gov.noaa.nws.ncep.viz.ui.actions.loopForward", + "gov.noaa.nws.ncep.viz.ui.actions.rock", + "gov.noaa.nws.ncep.viz.ui.actions.frameTool", + "gov.noaa.nws.ncep.viz.ui.autoUpdate", + "gov.noaa.nws.ncep.viz.ui.actions.hideFrames" }; + // Update the GUI elements on the menus and toolbars + for (String toolbarID : guiUpdateElementCommands) { + service.refreshElements(toolbarID, null); + } + } } diff --git a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/panZoom/NcPanHandler.java b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/panZoom/NcPanHandler.java index 058829227a..c01e925f6e 100644 --- a/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/panZoom/NcPanHandler.java +++ b/ncep/gov.noaa.nws.ncep.viz.tools/src/gov/noaa/nws/ncep/viz/tools/panZoom/NcPanHandler.java @@ -16,7 +16,7 @@ import com.raytheon.uf.viz.core.IDisplayPaneContainer; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IView; import com.raytheon.uf.viz.core.localization.HierarchicalPreferenceStore; -import com.raytheon.uf.viz.core.status.StatusConstants; +import com.raytheon.uf.viz.xy.VizXyEditor; import com.raytheon.viz.ui.UiPlugin; import com.raytheon.viz.ui.input.InputAdapter; import com.raytheon.viz.ui.input.preferences.MousePreferenceManager; @@ -32,6 +32,7 @@ import com.raytheon.viz.ui.input.preferences.MousePreferenceManager; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 18, 2011 ghull copied from PanHander and implement geosync + * 02/14/2013 #958 qzhou Made it work on VizXyEditor temporarily * * * @@ -139,7 +140,7 @@ public class NcPanHandler extends InputAdapter { // job.schedule(500); // } // } - if(!( container instanceof NCMapEditor) ) + if(!(container instanceof NCMapEditor) && !(container instanceof VizXyEditor) ) return false; if (!prefManager.handleDrag(PAN_PREF, button) @@ -165,21 +166,25 @@ public class NcPanHandler extends InputAdapter { // theLastMouseX = aX; // theLastMouseY = aY; // } - if ((!prefManager.handleDrag(PAN_PREF, button)) || container == null || !( container instanceof NCMapEditor) ) + if ((!prefManager.handleDrag(PAN_PREF, button)) || container == null || (!( container instanceof NCMapEditor) && !( container instanceof VizXyEditor))) return false; // NatlCntrs addition to implement the geoSync flag. - NCMapEditor ncEditor = (NCMapEditor)container; - boolean geoSyncPanes = ncEditor.arePanesGeoSynced(); +// NCMapEditor ncEditor = (NCMapEditor)container; +// boolean geoSyncPanes = ncEditor.arePanesGeoSynced(); IDisplayPane[] panes = container.getDisplayPanes(); + boolean geoSyncPanes = false; + if (container instanceof NCMapEditor) + geoSyncPanes = ((NCMapEditor)container).arePanesGeoSynced(); for (IDisplayPane p : panes) { - + if (container instanceof NCMapEditor) { if( !(geoSyncPanes || - ncEditor.isSelectedPane( p ) ) ) { + ((NCMapEditor)container).isSelectedPane( p ) ) ) { continue; } + } IView tmpView = (IView) p.getRenderableDisplay().getView().clone(); tmpView.shiftExtent(new double[] { aX, aY }, new double[] { @@ -230,7 +235,7 @@ public class NcPanHandler extends InputAdapter { * @see com.raytheon.viz.ui.input.IInputHandler#handleMouseUp(int, int, int) */ public boolean handleMouseUp(int x, int y, int button) { - if(!( container instanceof NCMapEditor) ) + if(!(container instanceof NCMapEditor) && !(container instanceof VizXyEditor) ) return false; zoomDir = 0; @@ -305,7 +310,7 @@ public class NcPanHandler extends InputAdapter { // @Override public boolean handleMouseWheel(Event event, int x, int y) { - if(!( container instanceof NCMapEditor) ) + if(!(container instanceof NCMapEditor) && !(container instanceof VizXyEditor) ) return false; com.raytheon.viz.ui.input.preferences.MouseEvent SCROLL_FORWARD = com.raytheon.viz.ui.input.preferences.MouseEvent.SCROLL_FORWARD; @@ -313,10 +318,20 @@ public class NcPanHandler extends InputAdapter { // NatlCntrs addition to implement the geoSync flag. - NCMapEditor ncEditor = (NCMapEditor)container; - boolean geoSyncPanes = ncEditor.arePanesGeoSynced(); - IDisplayPane[] panes = ( geoSyncPanes ? container.getDisplayPanes() : - ncEditor.getSelectedPanes() ); +// NCMapEditor ncEditor = (NCMapEditor)container; +// boolean geoSyncPanes = ncEditor.arePanesGeoSynced(); +// IDisplayPane[] panes = ( geoSyncPanes ? container.getDisplayPanes() : +// ncEditor.getSelectedPanes() ); + IDisplayPane[] panes = null; + boolean geoSyncPanes = false; + if (container instanceof NCMapEditor) { + geoSyncPanes = ((NCMapEditor)container).arePanesGeoSynced(); + panes = ( geoSyncPanes ? container.getDisplayPanes() : + ((NCMapEditor)container).getSelectedPanes() ); + } + else { + panes = container.getDisplayPanes(); + } if ((event.stateMask & SWT.SHIFT) == 0 && container.translateClick(x, y) != null) { diff --git a/pythonPackages/pypies/pypies/impl/HDF5OpManager.py b/pythonPackages/pypies/pypies/impl/HDF5OpManager.py index ac5f7a3d41..673f097b61 100644 --- a/pythonPackages/pypies/pypies/impl/HDF5OpManager.py +++ b/pythonPackages/pypies/pypies/impl/HDF5OpManager.py @@ -28,6 +28,8 @@ # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 07/20/10 njensen Initial Creation. +# 02/20/13 DR 15662 M.Porricelli Modified __do2DPointRequest +# to check for null points # # # @@ -121,10 +123,14 @@ def __do1DPointRequest(ds, indices): def __do2DPointRequest(ds, points): indices = [] - for pt in points: - indices.append((pt.getY(), pt.getX())) + for pt in points: + if pt is not None: + indices.append((pt.getY(), pt.getX())) + else: + indices.append((float('nan'),float('nan'))) arr = numpy.asarray(indices) sel = h5py.selections.PointSelection(ds.shape) sel.set(arr) return ds[sel] + diff --git a/rpms/awips2.core/Installer.notification/component.spec b/rpms/awips2.core/Installer.notification/component.spec index 2e64153984..413a16c6db 100644 --- a/rpms/awips2.core/Installer.notification/component.spec +++ b/rpms/awips2.core/Installer.notification/component.spec @@ -1,6 +1,12 @@ %define _component_name awips2-notification %define _component_project_dir awips2.core/Installer.notification %define _component_default_prefix /awips2/notification +%define _build_arch %(uname -i) +%if %_build_arch == "x86_64" + %define _lib_dir lib64 +%else + %define _lib_dir lib +%endif # # AWIPS II Notification Spec File # @@ -12,6 +18,7 @@ Version: %{_component_version} Release: %{_component_release} Group: AWIPSII BuildRoot: /tmp +BuildArch: %{_build_arch} Prefix: %{_component_default_prefix} URL: N/A License: N/A @@ -141,8 +148,8 @@ rm -rf ${RPM_BUILD_ROOT} %dir /awips2/notification %dir /awips2/notification/include /awips2/notification/include/* -%dir /awips2/notification/lib -/awips2/notification/lib/* +%dir /awips2/notification/%{_lib_dir} +/awips2/notification/%{_lib_dir}/* %docdir /awips2/notification/licenses %dir /awips2/notification/licenses /awips2/notification/licenses/* @@ -151,4 +158,4 @@ rm -rf ${RPM_BUILD_ROOT} %defattr(755,awips,fxalpha,755) %dir /awips2/notification/bin -/awips2/notification/bin/* \ No newline at end of file +/awips2/notification/bin/*